From 7752f11472cc4abfbb4d0a5f69d4e6def5daba33 Mon Sep 17 00:00:00 2001 From: nemunaire Date: Thu, 1 Oct 2015 04:45:48 +0200 Subject: [PATCH] Last rev --- slides/apps.md | 6 +- slides/conclusion.md | 8 +- slides/containers.md | 13 ++-- slides/nginxphp.png | Bin 0 -> 19742 bytes slides/os.md | 11 +-- slides/slides.pdfpc | 169 ++++++++++++++++++++++++------------------- slides/tetris.png | Bin 0 -> 51372 bytes slides/unionfs.png | Bin 0 -> 8250 bytes 8 files changed, 112 insertions(+), 95 deletions(-) create mode 100644 slides/nginxphp.png create mode 100644 slides/tetris.png create mode 100644 slides/unionfs.png diff --git a/slides/apps.md b/slides/apps.md index 847a427..7364180 100644 --- a/slides/apps.md +++ b/slides/apps.md @@ -4,15 +4,11 @@ ---- -TODO une image représentant les conteneurs applicatifs - ----- - ![](logo-docker.png) ---- -TODO une image d'architecture nginx/php-fpm +![](nginxphp.png) ## Quelques bonnes pratiques diff --git a/slides/conclusion.md b/slides/conclusion.md index 03fac6c..fdfafb4 100644 --- a/slides/conclusion.md +++ b/slides/conclusion.md @@ -1,6 +1,8 @@ -## Et maintenant ? +# Conclusion -### Quelle est la problématique ? +## Problèmes, soucis et choses pas claires + +### Et maintenant ? #### Sécurité @@ -10,4 +12,4 @@ Cf. conteneurs chez Amazon #### Ordonancement des ressources -TODO image tetris, illustration ordonnancement +![](tetris.png) diff --git a/slides/containers.md b/slides/containers.md index df59b6b..5bd18c5 100644 --- a/slides/containers.md +++ b/slides/containers.md @@ -12,7 +12,6 @@ > * Nom et domaine de la machine ! > * IPC ! > * Horloge ? -> * Logs ? ## Made in Linux @@ -32,11 +31,15 @@ groupes (User Namespace), nom de machine (UTS Namespace), IPC. `namespaces(7)` +. . . + #### CGroups Statistiques sur l'utilisation des ressources et limitation. -https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt + + +. . . #### Capabilities @@ -100,12 +103,12 @@ PATH FILESYSTEM ### Système de fichiers * `pivot_root(2)` -* Union FileSystems * Thin provisioning +* Union FileSystems ----- +### Union FileSystem -TODO une image pour expliquer UnionFS +![](unionfs.png) ### Le réseau ... diff --git a/slides/nginxphp.png b/slides/nginxphp.png new file mode 100644 index 0000000000000000000000000000000000000000..62d979c1324f42faaa99665a42bda349d81b564c GIT binary patch literal 19742 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

?PECt5TwzI_t;G)Bsnm!lc@o{C4{aJzX8hh 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 ### ... le système de fichiers ? @@ -49,11 +49,11 @@ PATH FILESYSTEM ### ... d'isoler ? > * Sécurité (root, exploit, ...) ; -> * limitation des ressources ; > * prévention des dénis de service : > ```sh > 42sh$ while true; do mkdir x; cd x; done > ``` +> * limitation des ressources ; > * partage du temps de calcul ; > * abstraction des ports réseau. @@ -65,12 +65,9 @@ PATH FILESYSTEM > * `chroot` > * Virtualisation et paravirtualisation ----- - -* `chroot` -* Virtualisation et paravirtualisation - ### Mais ... +. . . + ![](idea.jpg) diff --git a/slides/slides.pdfpc b/slides/slides.pdfpc index 1a0ccbb..b5ec485 100644 --- a/slides/slides.pdfpc +++ b/slides/slides.pdfpc @@ -2,25 +2,26 @@ slides.pdf [duration] 180 +[skip] +3,6,9,10,11,12,16,18,19,20,21,22,23,24,31,37,38,39,41,42,43,47,48,49,50,51,53, [notes] ### 1 -Bjr! Aujd nous allons parler virli. C'est un domaine assez ancien, comme nous le verrons un peu plus tard, mais depuis 2 ans, tout le monde essaye de faire tout et surtout n'importe quoi avec. J'imagine que vous avez déjà entendu parler des containers, de jails, de LXC ou de Docker ; mais c'est pas forcément toujours clair. On va débrouisailler tout ça ensemble et voir comment ça marche, pourquoi c'est bien, comment c'est sécurisé. Je vais m'appuyer sur des notions que vous ne connaissez peut-être pas ou que vous avez oublié. Si c'est le cas, n'hésitez surtout pas à me couper la parole et à me poser vos questions. +Bjr! Aujd nous allons parler virli. C'est un domaine assez ancien, mais depuis 2 ans, tout le monde essaye de faire tout et surtout n'importe quoi avec. J'imagine que vous avez déjà entendu parler des containers, de jails, de LXC ou de Docker ; mais c'est pas forcément toujours clair. On va débrouisailler tout ça ensemble et voir comment ça marche, pourquoi c'est bien, comment c'est sécurisé. Je vais m'appuyer sur des notions que vous ne connaissez peut-être pas ou que vous avez oublié. Si c'est le cas, n'hésitez surtout pas à me couper la parole et à me poser vos questions. ### 2 -Commençons par parler de quelqu'un d'important... +Rendons homage à JvN... cartes perforées à qui l'on doit l'architecture VN // Harvard... ~1950 Pourquoi aurait-on besoin de gaspiller du temps de calcul scientifique si précieux pour générer du code binaire ? => bien sûr ça fait sourire, lang haut niveau, mais on peut croire parfois des évolutions sont inutiles. -- 1 machine = 1 programme => perte de temps de calcul pendant les I/O -=> Ordonnanceur rudimentaires : partager le temps de calcul entre les bloquages d'I/O -=> pb: ex : partage de l'espace d'adressage (=> MMU) +- 1 machine = 1 programme => perte de temps de calcul pendant les I/O => Ordonnanceur rudimentaires : partager le temps de calcul entre les bloquages d'I/O +=> pb: ex : partage de l'espace d'adressage (=> MMU) => abouti aux noyaux ### 3 -Interface entre le système et le matériel. +Interface entre le système (progs) et le matériel. - Gestion de la concurrence d'accès au matériel - Répartition du temps CPU entre les tâches -- Gestion du contexte des tâches (mémoire, registres, context switch, ...) -- Gestion des erreurs (division par 0) +- Maintenir une isolation : gestion erreurs (div par 0) - Diverses couches d'abstraction : - matériel : clavier/souris/... - FS + Mais pourquoi ça prend autant de temps ? Windows promet un boot instanné depuis 10 ans... ### 4 @@ -28,72 +29,77 @@ Windows promet un boot instanné depuis 10 ans... - détection du matériel - mise en place des interfaces : réseau, FS, nom de machine, utilisateurs, droits, permissions, ... LIEN si intéressé -- montage de la racine +- montage de la racine, son rôle s'arrête là (- 1s) - /sbin/init -Sans tous les services autour du noyau, on booterait en un rien de temps. Mais c'est cool aussi d'avoir une UI, un pare-feu, etc. +Sans tous les services autour du noyau, on booterait en un rien de temps. Mais c'est cool aussi d'avoir une UI, un pare-feu, partage de fichiers réseau, etc. ### 5 -Le noyau seul ne fait rien, il lui faut des programmes et des données. +La perte de temps dans nos FS dont on a perdu le contrôle. Le noyau fait rien, lui faut progs et données. +FS est bien organisé, mais pour un prog donné, il y a beaucoup de fichiers auquel il peut accéder alors qu'ils lui sont inutiles : confs, lib, exe, ... -Tous les programmes n'ont pas besoin de toutes les données. -Mais certains programmes échangent des données entre-eux (IPC, socket, ...) +Certains programmes échangent des données entre-eux (IPC, socket, ...) Et s'il y a une vulnérabilité ? pourquoi partager les données de services qui ne communiquent pas entre eux ? ### 6 -- sécu : droits root, exploit, ... -- limitation quantité de RAM, BP réseau -- DOS locaux => machine à genoux -- allocation du temps de calcul par groupe (1 serveur peut avoir plusieurs process qui sont schedulés indépendamment = triche !) +Mécanismes d'isolation pr amélior sécurité, mais aussi : +- DOS locaux : serveur SMTP vs. fork bomb +- limitation/mieux répartir RAM (impact leak), BP réseau +- répartition TpsDCalc par services/groupe de process (triche : plusieurs process = schedulés indépendamment) - plusieurs serveur web/ssh ### 7 +1er système d'isolation, rudimentaire DEMO chroot -- complexe à mettre en œuvre +- complexe à mettre en œuvre (MAJ, automatismes...) on peut pas avoir 2 serveurs web/ssh - faible sécurité (grsec) + DEMO escape - si un process tombe, on peut lui voler son port et hop - arbre de process partagé - pas de limitation des ressources -- coût : maj pas simples, monitoring peu précis (limitation des ports) => ok pour de la défense en profondeur Exemple : ING1 exams machine ### 8 -- accès concurent au matos : périphériques émulés -- VT-x/AMD-v -- plusieurs serveurs sur le même port -- limitation des ressources -- on peut lancer différents OS/version -- similaire dupliqué : autant de noyaux lancés que de services, FS non partagés, MAJ +- hypvsr concurent au matos : périphériques émulés +- chaque machine stack réseau : plusieurs serveurs sur le même port +- limitation des ressources géré par l'hyperviseur +- on peut lancer différents OS/version et bénéficier des instructions VT-x/AMD-v +- similaire dupliqué (admin sys Debian stable) : autant de noyaux lancés que de services, FS non partagés + +=> dans Linux : KVM : un hyperviseur dans le noyau WTF !! ### 9 -- partager le même noyau, avec KVM : tout existe déjà : ordonanceur -- les FS identiques (on met à jour le système de base une seule) +Pourquoi renverser problème : intégrer dans le noyau des espaces d'exécutions distinct ? * 1998 : Jails BSD * 2005 : Zones Solaris * 2005 : patch Linux OpenVZ * 2008 : début du projet Linux Container (LXC) -* 2015 : Windows 10 +* 2015 : Windows 10 (heu ...) -On appel ça des conteneurs ! -PAUSE ? +Tout ça, c'est ce qu'on appel des conteneurs ! ### 10 - matos : non, le noyau l'abstrait déjà (ex webcam/group video) mais limitation des ressources -- processus, interfaces réseau et liste de partitions montées pour éviter l'espionnage et l'accès à des données sensibles +- processus, interfaces réseau et liste de partitions montées pour éviter l'espionnage/kill et l'accès à des données sensibles - réseau : iface, table de routage, ports, etc. - users, groups, nom de machine et IPC : pas de raison qu'ils soient partagés - horloge : non, la timezone est un fichier DEMO strace date => /etc/timezone -- logs kernel prévu dans une prochaine version +- logs kernel prévu dans une prochaine version PAUSE? ### 11 Que doit-on implémenter concrétement ? -- KVM fourni déjà plein de trucs +- des espaces d'exécution distincts - ordonanceur VM/process => groupe -+ statistiques diverses pour limitation -+ mécanisme pour avoir plusieurs structures similaires (point de montage, user, iface réseau) -+ problématique de root : si on peut tout faire, on peut se balader partout... +- statistiques diverses pour limitation +- mécanisme pour avoir plusieurs structures similaires (point de montage, user, iface réseau) +=> dans Linux, avec KVM, on a pas mal de choses schdul + +problématique du root, roi du monde : si on peut tout faire, on peut se balader entre les mondes ### 12 - isoler plein de choses : Namespace +Linux distingue 6 espaces +peuvent être créés indépendamment, au moment du fork ou en cours d'exec + DEMO make menuconfig DEMO namespace UTS, PID, (user?) +### 13 - limiter les ressources : cgroups * CPU (assignation de nœuds et prioritisation), mémoire, réseau, freeze * à venir: PID @@ -104,11 +110,12 @@ DEMO make menuconfig DEMO freeze DEMO limitation mémoire DEMO blkio +### 14 - capabilities : ~40 : CAP_KILL, CAP_SYS_TIME * déf par thread ou attaché à un fichier (attributs étendus) * permet d'éviter les setuid complet DEMO capabilities -### 13 +### 15 - recopie de la structure du parent (UTS, mount) - création d'une nouvelle struct (network, PID, users, IPC) - réseau : 1 iface = 1 ns @@ -116,67 +123,79 @@ DEMO capabilities - chaque process est lié à des namespace /proc/PID/ns/* DEMO sudo ls -l /proc/1/ns/* + ouvrir ces fichiers : récupérer fd sur NS -### 14 +### 16 +Quand on est un processus/programmeur... utilise 3 syscalls pour gérer les NS : - clone(2): nouveau process fils avec création de nouveau namespace en fonction des flags - unshare(2): nouveau namespace pour le process courant - setns(2): rejoindre un namespace existant + second argument pour filtrer le type de namespace, 0 accepte tout -### 15 -- sous-arbre de la racine -### 16 + +Shell: unshare, ip netns +### 17 +Chaque conteneur va être un sous-arbre de la racine + +Initiallement, on obtient une copie des partitions montées, la première chose que l'on a envie de faire c'est un pivot_root, plutôt qu'un chroot +- initramfs +- racine d'une partition +- pas d'autre FS monté +### 18 - pivot_root: initramfs, racine d'une partition, pas d'autre FS monté sur celui qui va disparaître + +- Thin provisioning: allocation dynamique de l'espace disque +### 19 - UnionFS: peut avoir plusieurs couches + cache les fichiers d'une même couche + récemment intégré dans le kernel 3.18 (décembre) -- Thin provisioning: allocation dynamique de l'espace disque -### 18 +### 20 - Réseau : pas évident : * 1 carte réseau = 1 seule IP * promiscuité * routage -### 19 +### 21 - iface physique : Ok - MAC-VLAN : chaque machine a une MAC différente (promiscuité filtrée par le noyau) 2 modes : VEPA : tous les paquets sortent, le switch doit les renvoyer vers la même machine Bridge : le noyau analyse les paquets sortant avant transmission - veth : on partage une interface virtuelle entre l'hôte et l'invité et on relie le tout à un bridge. DEMO network namespace -### 20 -LXC stable depuis le 20 février 2014 -Capabilities moyennement propres (CAP_SYS_ADMIN lol) +### 22 +Ok, donc tout est bien implémenté, on sait comment çm +LXC stable ; quelques scripts/API créer des conteneurs. +bas niveau (conf, ...) +/!\ Capabilities moynemnt propres (CP_SYS_ADMIN lol) DEMO LXC VPS: lxc-start -n virli-vps Gagné : bootloader + noyau... Doit-on tout virtualiser ? avoir toutes les bibliothèques et fichiers de base (init, syslog, cron, sshd, ...) juste pour un programme ? -!!! QUESTIONS + PAUSE !!! -### 21 -- embarque le strict minimum -- lance le strict minimum : pas d'init, pas de cron, pas de ssh, juste l'appli +### 23 +- embarque moins que le minimum (just gest pkg) +- lance le strict minimum : pas d'init, pas de cron, pas de ssh, juste l'appli dans env DEMO lxc busybox httpd : lxc-start -n virli-httpd - ldd apache, bon c'est encore pas super pratique -=> image minimaliste (juste gestion. de paquet) puis install +=> image minimaliste (hub.dckr) puis install +DEMO docker run --rm -it mdebian => nginx +DEMO Dockerfile => mais on lance que le prog, pas init et tout -#### 22 -- dépôt d'images -- fichiers de recette (Dockerfile) -DEMO Dockerfile nginx -- rajout PHP-FPM? -=> classique, on ajoute PHP-FPM dans le conteneur -=> soit on le place dans un conteneur différent -#### 23 -- Partage d'un volume de données -- Liaison entre conteneur -=> On orchestre tout ça avec Docker compose -Hyper pratique en dev, comme en prod ! -#### 24 -noMAJ: cela casserait le principe de conteneur identique partout où on le crée -=> préférer remonter au mainteneur -Couches propre pour contenir le poids des images -DataOnlyCntr: MAJ du soft sans toucher aux données -Config: seul moyen de passer des args -- généralement par script shell -- penser à faire des applis qui comprennent les SIGTERM, ... -DEMO Dockerfile FIC -syslog: beurk -MySQL/DB/... contient déjà des mécanismes d'isolation, il ne faut pas avoir un serveur par service/serveur, préférer une solution globale. +=> pas de données, soit DB, soit DoC +Voyons maintenant, une archi site web classique. +### 24 +Une DB quelque part +Un conteneur pour PHP, nginx, les pages = 3 conteneurs. +Si on met à jour PHP, on a juste à relancer le conteneur, idem ngninx, data. +À leur initialisation, on leur dit où se trouver l'un-l'autre + +docker compose permet de lancer tous les cnt en une commande. +Pour du dev, chaque équipe peut bosser sur son truc dans un cntr, et utiliser docker compose pour tester avec le travail des autres + +Quand on dev : privilégier les printf aux sysloglibs, handle kill +### 25 +apt-get upgrade => NON => mainteneur => consistance d'un build à l'autre + +Pas de DB par exemple, car elles permettent déjà +### 26 +Actmnt, EC2 cntr limité à un client, lance des VM (Xen), un agent, cntr sont répartis par algo + +D'ailleurs, l'une des problématiques actuelle, c'est d'arriver à trouver le meilleur algo d'ordonnancement pour répartir les cntr sur les machines physiques, c'est Tetris, il faut jouer avec les quant de mémoire, la BP, la puissance de calcul, le temps d'exec, la périodicité, ... soit remplir des fichiers de conf +/- vagues, soit coder des réseaux de neuronnes. + +Tous les jours ou presque on découvre de nouveaux usages de Docker (et donc de la virtualisation légère), on ne sait pas forcément toujours où l'on va, d'autant plus que c'est un domaine qui bouge beaucoup. J'espère que vous y prendrez goût et que vous trouverez l'usage qui vous facilitera la vie (même si c'est au détriment de quelques cycles), d'autres gens apprécieront sans doute ! diff --git a/slides/tetris.png b/slides/tetris.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4ad627bbb8320a7bcca07bf47ee33b41321e9e GIT binary patch literal 51372 zcmY(q1yoeu8}~beL&y+Xm9`kWf2pIJc5g^*MR&3 zG?tf<1U&uw$!aM`Kpw$zl+|_t0G<>6`$Yl3(!j`r7_M@PQW(FnQBb*2^gi8w1OTW3 za*|>io(uae%8|Nq{(rCD6cEvrUNCxn8v86omCsg2iO};gx}#n=uJZ%$a_z}yns(Zh zq7+}z-euXhb6`p6Vc>ajvhRjg4o1j$E5xJvJZ1h~I4M+}H^KieqZ8FXKI( zvjx(0Ep?v|IJyQ-i+!j7pYKye4z=-Kx)~er`;_Xo;g`m_H+i01qXW&ogKRVN@&H^#l{!faW)eo7IKkrVi#XP&YU;*Ret6aMp9}+u zfb9>p+>MX1qOT=FM?V{E0=1lIq4;X^i)@ch97AZECj`xS-hfy-SpkY>PhV7k%4$0$ zO>nH}?Q(?JWGZD%~OVfG^@4akTKag5F@>JaO}bDf?ygrE3;SdD9S$DY2`4>?R3gtqFNA(Ciq&>tDhO5dwzOEv2ryf zYR9WoZQ3z6tCmm?yW~oi4>-UheP094zDNe-gDhV+#bNbnK+xx%ow-N2D zG?a6E5?NVs2IRQ_Fr%eUdTdb8moK3ie(56L;U6+EsG+N8S`6D)R*qOSM{h@8mx*}`-`(s;b$OtKEx)R0%g6W@q9-Q>7&x$Z23u3pjboG0hcl>o-YWoTj zrM)?&_vX1tb;U7hoUWQW*-Yo43iK6cmc^hd0=~0*%CyUoSX?$XgTiVxb!kNu%LSJd z6HOIQHrD10*TBZI60n6M%Nt}+LiaGU)nbV$6c);@y%a!EG+h6Ud2-eCLCl*y7Q}8X z;BL(2+)P^6>@cl@^rKb&1RXj(IHHtgjSGh;IJUU*;wP3HsY3TDEm8~b-n}2|HhQVU zW8F`Y^3v3)S0w7{2mfs0R$nsZhaF+OB7+I1E#rm*_0wp7k(^@E1fw4~QT#yc-ZE6x zT!4#cA$^b(YcyrWS}RzJF7X-jsvt8BUFeAW^9}3WC~uznV0`h8BM*u@HL9auzqcdF zYgE-s_u(2swc8gd7X;!RU64r58GNKJrdTaeP6heiie))BJr1uIHccV`c)`{>oM~47v^1x zeJB--Yyc$uDGHcy67K!}0g6yTu&h__x zTff>=a4bFGvSZ%d_UCW<;AZwka=|URzn!r%m^5@t{)%Q{G4GDJ&p)oD!*=PLh2a0Y z%UHmDF?4dwe@QVD-iqHhobjLkdNx*3onbKtoV}|R!}KzU+}JNUWf}0gF)w^K{{)dM9l%F6bZ?9Nu>AbW{ZDL<*{_+rh9C z$OZ(FPNhpSJN_Ohggn0)`hKMXmnS=)gXbNq)+@^?VVP1ybvY&t--ff4PvzS%{ZynO z?#xBTrie637oIB-X}u*BC!Jd3`nL|OSF?onLObq>5k%J5w0sNP0wp;})qO3HPs8BY z)ICp-wTH5GF|lgGEOPEW`(?Ds1Ef-BNqfDHZzPb<7yNaZ%wqf%-fVhn=7yHVu2_6= z*#G42xDSN+nkb8Vp$UG*P{PFeZfA_?_b(otyZ>2idP-7p*3cPh^H$LQJN^WK=ig|t z(%>}?+fWsC6?aF6zfZI@!IH*Yd)Qvs*l8c=kru3p)|$O4E-#qPLwf!Je8HIno8xk| z44Ip}9CS^Rdt|wqzf8GaC$#@3vX%I#EsjzzP#d^S`d+W{!A@;_$NFbJ{=b-sAp0Q( zoJ^l_aKs~u4J0HFj=k#SbkF4y>s7EZNO8f#_V{1MkpF0u#C&c9L% z1ZVl#a||q5{4J{;t$o))kCv!x2%BclqIcjyAv@~Vd;~A8UlB`RsTkFnMG?!r5MT0H z1c|7xfR~*6$mYwBeh_i&|1;T-6sG}D#HFD_G?1DUoC5#yIaLg7eX6aFIJf|M?8YGU zMsC$Q6=LwKCMjnbpgOo-0FEyRSIYE%K|s1>v+E)QOvZ+Ulv&mGQz(3~|C5B!vv9?t z+5DE031G#ZHZ;SyeBAAJoCf=ntecizf)f^hdYrj-f6xWvkQFh<9bRAT9?K}ywj(60<2g45{OaZe~=eU;J9#5C0 zZAoA7o!$JO2owA-?w5-vLf|hd(ujiY*By~Mc8T2fJD`OD!;T)gL72VQ>rp(=KeCK<&GCLx5{SofqMz{IAH(bc(tv2{K&t+^t`A@Z65a(z3PV^ z$8jKxjGyEKfbKI*dL$<~o(RhEkx32$lvi|{By?V53aadfYA2c3Ig;1O^W@D#%@cw`K z@URi^@Z0P;o!jxz!dYuL^e;2s+nuY)b04&l`lHB!xfvO^Vs<>!jNi(q(k4g}-)!cIiY8ccU&6 zn87x#r6ht61ebW#Vr@ZRS?2k%cUJe0 z$S{80Omg|fw3UxlB6JpP81(kn{MFK`yW@m+e1t~P)Eoxj7W3p+n$lk^?`2-sDqjYz zYgl}8Oap6?egG!UaTVnXwjGMnCIff$>h&Z|PZ49q8S!i)Sl1 z20GlI>_41I)X?`ik_L|JaWu3~$j#=TqW~-b-YDmda1ud1D_{hSI3fS*9X+5AXKW9x z(+SX>8|U6=nJ)N@TE)FW76H>?VwE{;K>=EUVU0q9PxqW%L@-%da3xjUt|A(zO83NU zxo`khwQZVdt9K^seo8V`ei!6x{)htD;2w=)1KGdbH)FYUNjCxj8rs}r?Cqx646$xZA6AJFjRS6grZ4tE!i0&i2Mcf2n`8wiXhu#2cdI zll`bsY9$gAe3wC~sIszX#RabsY@LJY`@378DihM^KWnW?3J`8S(xw!Hk|p-*Y2M%j zQjSpL3%1KVw_usI0YbR?yrBZsN-k#_f)_-DHBR4-HcZMR?Ss(MYoNWQ1vWT`LELW} zx$oc>0hgTjyKcn8S^6ZqUAr6zn{Q1H@zc|li}eLlo?NTH4b-zm}`dicH)(ILbu9CT* z-LFA0GBycZpo`20h?hSM8|e8KReXg6sxJY(wXd9op{YmY|9g2&&{Ve?SYSXf>jhzb z=I>_U&e3t09tIs2LK>=!c0z5h7otO_?Xjc$o=QpfHB%52pK{95mY4$w{elWD`(7yvp)6Gf zC{^$imHvn%`*=UJr7uT|X01{f znncAP-Dflw13>$- zI`_`^JuFl$zrlun9@aLtcY~{z#$^j_d6(bVl+9$W~LkT1{PR z5`$+;ts-ZtEqEGKL8O{(roPy+KZ+c|U ziRMi}s#~~TY>Ck>*MUw;RGC?B?DU*yA{*;+(RbtZaUyP=gE&=4tLi|@JV}B<*ydE( z?px2Ygm2|ScH@&TufDO=FH{aLWbY4%9x%Vjp*MgKyii!3Y~)Sl96ZC3XJJm*Yiz1H zlz^EFL5u8V=JSVnE~yBptgGA)PPiJRFhxEWIFlCjar`zRtIPl8w7fxkk$GFJx0k_h zn+7>v=U@eWUjEfb{(RY%S7|n5|6M&JB=dyG`c$2e#?41Jti51w^rFUY&{mP)9}M|y zM$#fithJ~)I+2`(`z*%NQVv7Ansn*iyBb2gZ%)NZ{Uwb#H`u`67>aa}e>PR}c!I^}zCY>0toB{BUttYH119uDixF!$}{nwJg>lOx`Y z0p^qEBP&-NJe4k|Oj|B~3SqThfh9h?;oznB1-8is|Q2ib)nwWqMa)4x6 z&&;FBtaWaUV20^)k>N z15HyT;glriiJ;7CmZ~fL?7?c`@ohf9-bt%TORtG8sfbI5xoCZSYIA=&0a`G{R_mmZ z!ZWA4lQ*j6uV7uINJz7WE*$+fjv{qwHJZmc@(*HYYqz*KB}uJC+e=lMH=T;w{O0@O zF+@ty5T)Y)s1PRLn8<+kR>3fJK0^VscC?N$$pyVITs4S?|L`Wj17_>MEsIG%TWWCG zMf9Fb*U4M+tg7I4(8B(e9$p4^&IqIl?YZqaB(_Lq{dJm6K{26{p1tHtfmgo@g%yJ( zO@guJXEqyk>vD)k$xGOOIK;`zV-~O+@j||FY~^&8w0-S(cN?(xs!A^PqwYJYZ3Fj* ztSL!ZLc(xE=TGM8Nay$H1otpTsItkJdS#m>mCD^WjJ9_l{mRCXl*%bQk)DI9e){`o zlk4p5qppDzEO8HOwclU)piE9R;R=R%vao^O5d3X_X%kq_Fw69s$H+F%ss7L?F@CW} z7Q^m~B`u=;1RME28~kp+h=<+8sN2lBQ(M}wbVnL3FKKD&j<24KTT#Hz=HZjUj;^HA zo3*z5hCBMOtKT^r1?kF4ke6;O_=Ic%mnZt6>+G?R44}=u!z)1U7@Qwb6pS zbQ+Yu6?D=GWS_Pc`EiOnBCZ4=s{S}E4!ieJL{gjY%@5n?X;->1x6~4F0B@#YbRGC& z$$NI1N92EnLSXmPlCr}M83NtHN&5?%Fp3#fgHtrZ<*zD&sR7@k)wOa23Ie}5^R^q$ zMG;8f>E#CXtTj?t(*~=S-o8=u*|RXmPw5Bkdc*Mf2GNh}^fSZr^38LXn7{tXt(*AM zTfrr;6#9N{p*Ukj|Hn`I-$-F(6B;O@jBswfQZcU#c-UR=c2YXoF*c zm4EFa*3s8&ge=iIR_l;p6kAJ3(n6WfzNx1MoEDbl#+#B0*Rz-#5CXg)=YAtV2 zCS-`#YP^bzmM1LyO<>)7{15i51p{YVlH*%AZqXq=--}-5MeOagh?F$LVVL1`yelfq zBQsMP31m9`vx(cx&ls!kUNMt;I~7f})vHVW3ZEjSB>JAvKQkC!(z)k1D`~8F=^8a7 zMKc-5t5f6olRf}>GrBHd-hyp~vc=#QClWAFmI2`EjOTV0L(yl({t6g81U1npU9PZ;B|C zUVL}8l#^c(RMq(LbBZ9J>|EM97o3e!8Azhw@wp8lq#_#h!Q^w{4r^>JL;Kv6fM&e| zgd}W6>tw}MAn37uO8Ct42++{vP;O|MmXGO#iO)p8oosc`^bGgs(nJdw5=R|dR8bHp z$1CozP?692G8~eAd+uLo+(i}iz834kBCjmFEN+Hd>@nPm6Y7X#ban_#FR~f>^ zlaH_tFa%QOApQ-foa2I4FqeZrxQG&?7|g5`_Y=z0MW}d{mE6G#h%(#Ia5zXc4sHUx zSXy2x#)drm86MlnVY8bz0J7gBPd4=*%8s@jk;own@7FVk9H4^g+&^|~Q!)?Ll_a`M zhm;SS37J9nI?uoAb2YZRhpm6&o}&VUGss(C#53tCy<$!>1pZ<=U9qzBJ?>s*3&sGG zf68fEN>j*V3yEU@)|XhJqSZA11%QP zuFAd09)E*KU2+3@V7qdQ;2b*7B>jjivoU7NAX##gz7oPIJAJ#+Vv0>XU?dSrS(FdF zRO+@Zh*|q->pE?$v3OiEkV>*-$3sB6l**&BXPv2n1e%yX5pFhWuaP&0RSLa$XCHrf+w3W~!4aD6}HtZdiBm3>2$VgnL^$mKTM4etqk2 zc{0tPXhX%(jj64PA*Eh>CF$GK##=n;fjV=ygbk*Ti0Ist=0MP&P6U5U;{Y|ft7XpWkCl{ zD3}sEM+X}hL9*0M^g}ucSZ|M3`|0j~wzP6wL?Kz)qL<1cqxT71>GTTxH>Qxr+4G4- zb?U^W>(GXLe^UWXpIzsAwDVCw9!j$4o2awwcY=}{u)qeqoPn!VbEB}Zi3@Q62lm)% z*#tV{K3e@;;xl#k`c59Dh+2nlM1WXBs=%JU$m91mN$(erv%SjtsSzlEC^_A&bJjXx zwH(C5mLbS~9QL7rjmpx}ej3!hnPDL!#c=l*(2C{$)!5#(4e{l1Ym=xgG7k0dqd_oB zt9u`?9eqqLsQS?(HoqN#(0oGNGOg@Xw|(FyhIlNs7&a8Q zidubkE0%90iVY(P&B#=`ZQJ6&0cTThySAJ|g;1^y!cp*b&AygNdW;!?zTp7WzDf_L z{-6-If_e1U|0a@Z+K>ZTq1l}IPPV*=eI4O<*(m1t{AqKQFK#Uf-*GE7POP$V?)`$>|(q%wJ_lg zTEnhQ_4#coBx3o{g`Db%^71Nx%*j%1yV;xfG5smakG&3XqV=>HCeqW=bZ384%;Xn8 zkvlSRWs$jQ-pl+VDnjY#K)dMz59NWd<Xz z63HOd`iK>)MN^Id=b)WYW992tO7#S(#h2x|;nV`=UTKJ(uUCV$(diGHF9{LSBE zH0E-M^`ZvIDrh6rjpzS_0bV7S;m2vTeL=UKOCe~LJ|+b0aEuH90o&YN@h?e#(4j0W zy9j#CbP&e~cdwy1)=-7zCs?qy5F0Hol9_zN@muQUyo@VhDmmTG(B^6i`Kia-G;3w| zmyymgz20f!Jrhab7r&~FZ~DK@>RgtGwl5}j1jVjuq8^}Kk0VCputqz&N;bXz{PsPZ z>tjrQUE-S`=BDhR-*y~ze4G-=mbvBcJ)KT5dy;jqcMVXEtNT9e+C!<&_)(NgB->=UBz+QfAu5d+L`}3NMsb~d8T|*o+=pBm9Zf=3+{W?0wABvn0{C*iXHq)Vb!)0>KE|T z6nh}cKKa0t(1t0V){7|13Tr`qV#uT6|6j=`3636G$=ql$2k0SBZ0WOQ7e+ECwIp^ zSkvLv$Zy(Cn{y~q;zzwX4GT= zRH~O`4fkcr3d6)iVLVEc>S@jV{V`I>TRwC(86L5rX4nZ;Btx&)h8iNmB@-w(8YxUd zSadqDxYB@zuEaQO6|ROwOn!iNl0ZuFhUC^oub|09^9shiWFD#gbO1GXyA`!GpIofF z3-mdr#(saN_*ahh2E1Iqr+;*MZd&OBRoyKTWj8YSTR67e-oH`kUu6bVjuwyr&~Ts} zjn9i0ZK-r;RP{C9bxGk%^N9sb)`ZEhD;Y)}2j1hWzZSSOur1v#xRC)A68wt;|I_S! z2V%8WmJB6y$aEyk@r!^>9@Z>KtyXKX~?i@s)@~X z>mT{3{+XxfWE?mtYB5o9fDG-z>(*>Nr5k{yXdZGD;|K#Ie?- z)dI4iOHLSLc$L`Fr!kE*U2ij>_32AN;dqDtbUcZM*CI3UZO#}`alhW7YD9T{a#obO zFBO%KnQMgl1tl>CQ;9-fQmVS@H=(=g7@GF4VJk0w^n*D^MixOwzz6TexzcP1P&?uyv(mC0+165WjcC^7X&xsnnaOVM67c9HkTuTPN`=H=XYE*5j=h`<0RSioiX_5#UL z8Kgns3{~lzxoEO0)Y%~NaA~zJ)(kY)vzknHvCqtGU@j7YcuJ^)Gz`MyF2cNC(XhC{ zeSeV7Y~LC?jvjC4K^kCj>^)PmB}~CG`5Xo#HWmV3UKV4R=J)GTa${?#=hDw==r+FV z!DMwk#-d!OytGI{f7#?TwEsj392nvIaWts;4{*rbaus)O=tnYt15sG^i1BcK36`Z>;86gMuf{ju zq%z3NWrprEMl>+U5-yk$kO$0*byrHYa-5w$Ijs*(zbB&-tdYxM#RH68=3)_TnLL$% zsJ$;A|2*Zx)uy1R-t2ASSKTh6i}<41Mea$FWuUD)y!}AwokkZXewl2)qWuA8~&2m=!m~?g^)cbCN;;UCiVj5nZ~9V>B8rs^bqG?H@m!u z-6dI*A94K?Z(<^}yGYQ3!aM^7F6HVcYa(pfpFF&CC_(lLP-%0CXq&*1)aIu9>$z9; zC9+W*nY-Fo)hx3@dio(QIIZsmU1kp*WTHOT$x@~R3Osb-r4A|^hV@MNq`S6hG}4US}=DcrwUVfSx3 z-^IN==-qG7V+uhSezh-74-+I^0>9T~=qU&^1-yW3T)aB$OoV9Oew$Wii8}EN{;Q0% z1K*Z(l_@qu@*JY{^fyNyZTx`l4)(JUr}sTt(eSv+C%b_=r31})56Mw|23(kXzC4S9 zjJogqZ9K3Z>u0%!ULzXyARy0HkxM?He(Iv^c0Q3|vZhB0wmzRUZC>H&YVy(Y`6u-a zq^BE&|9=F%niWJ1i3ZL>`k24g#75oKmOOD|gJbHwkWG7v1nc}R45Jw)&I^TG!xLkk zP#kS_&>=5p_7!Tv%HHRNgpcjrb3G!YOY|Wai~wR*L>2_DarLnjK3~K3*Dt3_idQn! z97*SwWX0CtHBRpf8GcBhfgAryYa%IreqCC&kkxcCQw}1kNa$T|#RoKY?;v*%wNVLc zkV2?eYx?%ERsF}C@bQ-mK@-8DBbyzRnpr=MR3oi=$|u>>6a-<$ z=EcLrMLm2)Yh_lcDaWMcCK^2Tm2M5uK%14LLeQ|Lo(ZzXgXL->0XH$)Vo;p*^lN_= za>$j?1irSWo!OgDCBHQtJT0$2G_$W7S}>0+dkgUL2z_WcWQEXd zN?(F;#hkK!%wMaWYz&vQBwu7njmdCx{CB-9Y9&gJe@>n>-z& z>?t|PHBwd?T=n9Ri#mosxVT4cmVDd_Uu{ZVN|Z?bS1RX9Fllhh#lR_XFq_YAA+bq4 z={%*qdi=ds81{xY^sAUzNa{th(w)~c3H(gNa+rZ`{O+J zb!rS^^|6J6R`OFyoYPcSk<9LgsOCZ+T#GFYlBF!3Zfj>K_Ba79=f^`h*BXh(ODk9pWh+|=r_T|L{zNK0sXXAS7SWJSxxHRvK?l-c`F_(sTQtm4mp zGs(%tdc|reKjOn>)w}ww%%%yw3plX9ZAscM@NLy52)~ZSq(QM>Xg1Wosc4TcR8aR> z3M^AnS6b+pAlg!}7Y%hRD5$uuJd!jyBiJ}InUznqMxE_aDQjlTk*2aH8mn?HO*w;9 z`ro=VimTgXx_mwi;3OHU6H39h>mlA7QNJRc{d>#VP(VSZk&&5dT3zSJgUpvX3m#Q@ zMbu-9mK(D7p$A72r9p2C zV!J|5o^iqM=`_+s*6K9bG)-j;SnjeZjclyd&7X_J^}z)pV5@XpgJb9?*I*c_&#{Ij zu}|Y+USa+2OHSWOf(_$=cts*uHhl&6D6GkC;b)d$V{Zr<0qOMGE&hN!UbeOd*$M^L z&*WFp=Z^0@zkP|Bn%aV?kZL@ZqnD{6+x_V(aen3=(7HHrn0<2G?;ZZ=g=q6BB7>rw0v(4eh zp8d;S(4lUb1I9%4bJW&0_?P|N`!UpoTty5I&KKcKELZu5@6tZnlV`jGD^|jE`2^+8 z-FMcyVgyKa@1vOqL^XI|qz=JC;FXQoKDI`)AB6LMi7%9kGR+T~st7JwWi^DVJ)K|D z6ziWEXI`uQ(Zm>Jy!u2Dng2=A9^9l=E}zK2f0S1^(KDP8%#X*TF=G^sY)vl9u+w!o zZHyYl|AqhF;tw8A2a1LoN){cxB1lMY{#rG&jOO}AME$k*V*Kj9dJ9QR=iSlx$>h+R zd;1T9Yjr=PWpBQdL6G7&G1AA>@z`>HYL!dXqEG%(uKH8i%M6Ozu~d09W2E|nXoG9nwz*VVQ#!sa&0NUAQ$wd- zO$K55*KNr(+y;~*G)GfKDF``7Jb8Uy@ue||F(3?j77v_xUM?3yxvOZWMYom)^txn?L*YU zt{2)^m#C68J40B|siA_L)eMt3c))|Opg|6Ly^^6IdN3gQE1VmS^6XrtMnnHy>BfZQ zE}jqR+k)6C-5=_myWjE9-d4*P9lQ?a88+20`}3Ylkq3S;Ji_#k)N>JoTKF}0e=io& zPDxsin7riwc%(1wwtP2KH|5G*VpEfhodV?P4E~E~CK|kmzL+YMOM(5?s&Yw-VJWOW zExfWhrUxpH!*uI^nw`x69!m0;K9#*$y|@cHX;^{A7qNYtA+WXfO(RHVU~Ygg@q&|L@VBAbo3tr0KZ~z|wS@PYmrB z7e>j_|AG9_LYv`czmcW}jHo8V1D!M8mf_PSOXFRin3~~;^D-VeIl|rP?-jd{{9esK z1@+`}%@&;y9)KI(n7z}eWIogT1f7(o7KkXpaXgI5-MCoe|A+BUWe8IhH2z_HslJ+y zRayy*$psHr%s@^Y+$>U$_h(jVC#kwvKzHe(I5q#G*k>9H3%9 z^@1hKw7+j^FJ#C@bt-3NlQaGGBAkOp|J+NL6*{VZUYsa5jvI zs>RebqW8Bki60WdVu-Hy$A3mL^&}Y|<|7!cin{tq_v$ON8e3Pg?$8Pkca(GK3$mr` zv@GH%w&b&J8^>;9s6fmM_04`&dspqdX0C?ki2HB(V+FnrS}<8^T>fVhT3h<%j|26F z*h$0ECl(ZO`Id@@?>CN8{Bk98RrvWi5^daS z0KSX^eJ%nztQt>mY-_az`Yng?!vK^0d2EpPii({`=AR~$%i(4(a51`S{WO5pXW?3) zOG4oOyYc*Iw-&VN6S5>h<8tWw+KhK`$BBa~bx`%E|Y-GzPYAvVxU2CPF33PChBJ$~=j#lTIhhKxn*-#v5uWs&Y0p#OpahFc| zNB)I#7Gu{c>QQS7jKE8p(jJ-|c$~kBCnQn18)z;Xc~SUYi~d;8h?Z9m#!%i_M363Z zN1_Cx;vUP7U4JwJ5@eCQHTH6Hobh}6z(~{OYdC8$G&UV z|E?qYY&+^K##kyCoza!9Z**1O^Q)Jroh`cpvjd7))kAj-0|PW!d=Z(zVH6C7n4kwfY` z`mQOrcQN2jQHcjd)aHoNG~gdLAnKCP+^Ie`-rZ(B;6-UHHQLeqafZ%o?prw#nw{7Bz*4JLUE1-rXj(JC2#T+vOoupqA^3$pElSoUzxyM;KdE}ZcY_@fVXi-q1 z|KU|wOJ6)wtMo?U%bJPp)_doPBiGhDuipxv8aMNAPMW9!eo)_NBJ#hOXDy|GDP4Do!n5dFo#&x|FtcB+ymXaN2 zRFbKEW+~lUJGvr&zW$W>DU#q}<0N4C)wW2$?O&0*lW~+w79UCNYjl$j1`!WU<}({3 z{)}hlZU+)Aa@petApghn!I9q>QwHLDvUODhd_E;b$PFsI9tuE1?0qVe4I)J&`vkSo z&%8Bq^ZNtF<&hJkpsi+>+P$~9<3%-a2p%Xjw@>>ZZ zh%*H{7(6KLx8Q%=b@vg)F0b1xmj>&Wb#2r#M2%3PGVH>4z|I}QG*jY|%FX|Zn-Q`^aKpRtUFOLRY#g4S>-&d{MEq6ZX~-Qxe>Jas=UE*t_VpanuoYLc>EJ!9d?y^SWTqO_TPg} zv!uFFD}#S|8oJ2n`^F@wNa%h^Ju`#eWwu?D6Yt!^ubE>_p63GT)JE?$#Sh^A; z8@zROaY{)vs#9jMxSFL!z&WYxTM8uzzhJ&jKGCX}8`j0(DKZwI)hB5_CNf>>&rtaU z+^q}VPLG(Ql-^1mABMaHUOh)H!yu9)g6dfd&6vPd#h~6CbP?zOXi+st)jiS? zq23l*mX0`R^~B2iE3o&`4__^&zwzE_e%l%^!=--}_jidC`yJO2j+=X|(o z0mfm@Zccfzs2WafU#foBr|Ua$gun;TG5V2+AQ52A6cl_(e%ANOV&m+e>Vvey| z!_Z03BHXQI_2Ud_=gpwS#9c#&4G^2}QJiA`HT2GnI_&Ef%aum+UZ&55&B7irhGBA9CL+Yn1}Iu5HVY5`Xb5u9@#obn zx{!6im&Y3$eL~6m1Ls+c7?Nd_ShGO2OIw%fa}RmFqoPc`+F8xd8?=fi`-4dA^)D2{ z=~z9sPpMmolh5^Mxn5_#bmYunSPs5UZU2~B%SnH&n_-j;QsH4Nl>OrIZljop!(XU} zhvE;z0KcW$OOQhl7Udu}PSqOro7r+K?7kHR4&i`}-0;{1Z{4sH^1Ls^LSjt2@~oE5$bDX(vm3959A3hmh=y6Qe!hG6iSJnm5!3C2j9m_|u`SenQX`LL zmPgva`@(8q2|}PoToq+h;)1Ga;=dz~_Ot&@aO|q)pP&8zrxyU(A9_P%*X*fL${#0x zPw&!)Io*+IJz(r+Z;&qDW$RQKkx#0a?>vj_BWNI3HmZYk&XO|1=JzK4MZz`P?An`! zVI0DV>zU0NrDjV-O=L|uvZ+$Qrkq?ZIf1YTvlpNm5NYWyk^SGyKDtRMx~+=A4O{u^ z_aBa!h9kcv@ESd%&Mn#!IP8DJ^Ka9oJ++$!s(jxeWPHvj%YjS#ZMBPSBoEZcbQov^cAe_yxsJ4AvyhYFuY;8MFugePZI!*J zbbF-wqQbs1pB)aD5Vr7!cVXUDb7iNbv;9lslH=)B39mQvKPPAnKGjBm(L^15*Y6FP zH`CTZOg3L~El74#lN76n78q6feQu3KVyjV!?_O zX>kG+cPmz0TWE223+`6j|Mc7cKF_&0=Pox%X4b5cHLuLS2*U|^j^-Y5YDxu*@-gV| z3245Otdn1~U_~&(30%LgJ|8yVc|zVesAY$bh!TejnJ|8l&zZE2_0K#g6ERrRUadm8ugDg zjY{F1!GiGXg#(T(gdpmr3Ni+7X__Z}h zemzS~T^;lgPLVY5VeRzvE^q1hZ(xwt)KzG|a?AeT9gsc>I({_Xj$6WiO{$hL%S03I2Foh{mXztJWij?IXszi_B_EVrQ`Ae{|3JVI&=C^sx*`Tx{d4d z(Q2nU9L#{0{NV7*K=f3chMp6;^xu^Gmk?GSI^nHCNODmG6tDhGD_nO1%IdcXhdth+ z+am)4;mhH8oze0Uls^JFZ{Ap@QO#xQ&|s}NtNk0uqm+d;{5mf!beo?hotVOq)ZZ|v zKm4FlYXSCuYnq+9Pl?09p^)%fMXY{x_@#j2iqNU;IKQs-b?d*rP2!>uNQ;z>?Zr&r zw4pEL7q_;37dfmC%9;DKL+tQ2OzBTGtx_t&!gu+fc4RC2|1A<{+Bj@EamXFhotzb? zN~gf)3cq>;^fk11l8F7Jx!Qpv5(`Cs#D5G>jKd3~adG^Ok^g`ql-|#@L1hrtZvcVB z;Qxsmy>A^x*sIIQ_Ma6VDtds}qk_r3L^A??z+`6cC9kNo)(7w^s%x%*WGJii)rzC> z_ON{@D)hQ#Ix&246Cu4=YOz+ne#dk!_Q(S?w)bDtDh*l?MmZs?r9ok@=GSV7CR8b#@gO^~v|mf^*9JTsYAqzS&s2(zKv(n^L|C<^9K38!j{6psBlDuj(;5 z@ESq;V)r2?`d`A*elU-&D?w!&P36p7-uo-1x6#xy@(ArQaaJMg{sqvgr(t`KO-PmL zO$N`uBtjA&n9B$I;)$YvYjHZ}$$XA@b9KudGh#oe^_NfBp~thK*b*A#-SfxPJ12N; zuEcEFhgtn5*0jmdbMxfCv1ryF0DMJ|D=mD6ndcg4m2dXM%Ti3NFo`o^g z5b|ZKf>($Xtk|Jn?=!N}Qkj?Hg_@UXkYj;~h`;7b|80HruK!zQO%i^bFX=%3V(WGI zO#KKu?exD&xPIf}qVvM>p;2GDe;8SLf2_ardPf214BR1Z>Uihdz5kHE40*meR>1d^`>otr# zlF)*Ni8Z)m-$sz+!8v&0@ac-03Fo;g9Bjs;Du}r>BaBnWbB!%UG({f5!0#v>sObp@7I4mbVZ8# zNXSz_K_b~q!P#N~S9;V4!8qg|1>A%T-N)B=cWM#>4?-fhI2HcJ1|O}p?pu@VQ?I0z zp~F`-Hp=*M&MuJ6g0PqUhnm%=n4vYEx^(<>O?!=5&;7=^ESW7Ozvum}{fe$ta)d6o z@b64z{E*!aDpPNfwfmkY)HQ@NBOe4}o&R6a>;r1fDm9|eKNiz53tY>a8&^_Qate6F z*J62T`M?X%GJEm$2xA>~(maV!{v^PXxw36A0WS^N64@eFhib+HXIi~pdVc%xC_|pQ z!~F6m{O>5TiN}NwW&fzQ+zLS6qsE7gS%}tjb{o79-cSeNbmL0hX84u-lLIdWT;je* zoPXgyTTBJm=HzS^&fJUMP)ppWX#wL;otPO0UNjeuIMP=voiPZ8f2V^r4`OOoUgNRDCAgpOK>!ue?5p3xpqqn}o}Z-?8b{6d|Z z;^=$EfC1TyIpOx6?@)-jcN`GST)+Bc{6@`uSLQxj@965{I;#a2pxzFA7Q<1$m9tl~ z#+lsXBr|@a6cp5EtBM%ja$IQXO3W%NfV7JJlc4B&sDD5zZT4O(sRqhxTWX+AMk`1C z6Sg=t4C@pbD2Tua$WcmS#)SEz#iGCuZHHzkjjZ`?(egk;78zy0#eVxOqT5IUC(~iO}1410JTk1(^Q2f#biN%eVU2o63pf`MQ zD%8U-GGps)b4GsvCyL*L2&Uz=M-gemVQcbMaJ&ow&DP?^D*NXSYL(YZjn=L_^63m0 zRGr0tlS*{gT~Hle(;Q&ks#}cU&x1=C9P1T zs*7IOYmQi?2!neI$AY`{z%KAQ8K2Op`%J)sCk(FVnIpReWGytGcR#TI_(zm_htfoN zW4&lG-ted8>8S0WN|=EUjon)s<1nd*o`_8B=Zl@F4%gSdPyTZkOZc7_}^hJj!S0DGVf`vV!$1>%;pnlc}mj2ZJ zD*CSOz;A)WGw=*Um=RAqEs9Xv_vd{?$u=e@8&|b&jqbn$cZWm<^DwvPyUl_tj#0g^ zSIMbtX|Jkx%O++3-*U3o{hHc>x?oW7Vv^}|ec+fZ$0+9D!P1XdQ<3*s@CG()gj`&M zAR#@!n{m#Wv!-D3-wt~KKb=>Xg3h{YOa&+QIv(+}iMi%7rN6dMB}RepWW1vcvafm> z@m)J&N~ris^*)`!<+HB*Iw{7rBoCY2n4G%lJ)x`Pqiz1yo?KiSrr8RWiC(EYhE!A! z&aPa$bN&m^uC<8wujs8&nx<;k#vLy5y;LgwZ~CN0;>mrmiF=e2GWurGhF zCH-UF++QGTSAOnoSVcxkWcHzzgDCKyq&AQz!uvM_l!C(j5f;&_Jr~~kq0H%pCizWG&+Td9fTq8m2lDSN_ z8L`qwXzt19UC1YKCBG35a$u|>A$~cd%%7289Yv;sI7o2aZ_m-jWW?564pPBNxNjEk z0up2Z$MT?2uc|cbg_XgNw_xVe8u1s#-)ovjBF_?#CkD9+?MkhNS2Yu=Q_HXz$Kg2M z`gLj^sa^1DV?co83#q}S;`ZIgp8FgVqN1U9$yS?r`I-}y->@zs@1GH2@toOMWxGbW zDRnQOMuV-nPYHC~z>`FpqexPW-2+qDs%>EmVg4E7ZfJOP0Qs%S9+8Uv(cw=#KW?NE zNw6bry+oV`ntyUp<{%`}bUFF$hYabxO?~0`O8F~7CTWr+LBaRAVNr;v%V^lzX?iP! zF>=r+2FRG6ni|30#Kxk;o7NdT<6V@;qpBt5B3aTChn}{+VNRT0{6&RR;Xo(tZw93R zqXR2y7)@)Hx9KtKNNyQ6evch|{&AlPw-=*+rID>8s__}Htoioy`hn$R$5b4m8Cf5! zqi3gO%oXIMr5p$#SW0s`CUja6H@-qh_U2j-j++jQT5>qwl@@|5}?dy1*-<0&8IcsO6_2P*^4yag<{ zqT`3xD3fibLz^$%X7M{atkOye6XlU6N}Y`5@*T^7@&L{S*&Y2o>w34=6A{6eq;lVz znSg$+(g8JaMBVT@f7`r{{|o>)Dkhh9C_K$_tN@xTrul-oT~x9J!}Yl$QeE7&!>+5ZRqYusa#|6V21H=(!`2RHLB$4 z_twWO`_**IdI9^txhFKakqosh#*t~ZO@RGZ{pRR$w(z~C4HN%daboCPjLM0}T7E-c z{E$noF@=%RAZf|L;v=rH>K5*4DNF2$t{mB!5l5}*>#}W| zlrw&(O!A22zbz*Nan<1c@9y*BX@e|0MCy2N=<5a*z#&Nfc_R$`#bh$@uc5RUtGRNE zv4WgLL2f*%&7|k0geIe5{MciMQ<_$&V1H@M4yL^k1 z)oN~;aE_0?cCcym_BBP`cCD%8S+`yM>@<`#CEn75X>V%-pVta{hE=OMT6jv1(aYc> zI>EhVup>OA;LrYxPIoccu6*aVG0i^iA}C?+0_^#k_>vAag$v#di2o&3t08g=QYIyn%ge^NVfRA#Y6STRhwN+u`Crn6!BX` zT}cLP>W@|;5%M~1TJIrrfHv8Iwq(x@-F*2o{b&C8R>F5IxL_KSFuOuewI>nq>ejY1 zPF>UI&~{RBQLzB!fW?tq0TAw{^J-a{0C=h4_2ygVIhdVr?Ro>%aMElco38)fWC*2B z$ycQOXk5(_%Ca@PJ&Z83*YeL^givoMvKq>we9Q#1G(iD{i9puBZ zrS&bV(em;U!`Xdnwzb1z^}+cd{Jv$r6paQGm#CxqX3wc%zdw}``8eOXA+4!GZ>_2)X^_n0N0Z*Zz>uOXe6Vm$(1V|E4Ono3X*Ur zuQ(pJTQ|I=gWJx@ObOtyi(#euu5d(JV|;)silaH@n?0ZE1Ibvaz|tv`&K>fuk#@oq z*Q}H449b(}VM>RNHo9~B?b6!6iDJunVWKuwtqeKhjn zdC|D;CI&4p=`07eUz$DvwQ+0v#WGGnR?+S3a4I#;ZG&9nHJ8BgzpNc`b+L zzasU~r0FLbMFVnv*?!B{@SFDH{5RTWC3X>RXWBek105~n}iA>&Wede?+n&1@osz{W`&CiaTx=g_dmWtRqKnI6|M1W zOiNyL|53UT0yYa=F*ROV`uW-aKcO)42lNl(2w~w;!;Nb5`Ed8ee({co;7Qfi-pMUP zWg3GU5+AgTH-=N*YIrL>TK(%GI&a8JW?nCr4n(3bVAqU)qp0q_Ed7dZ?kcFJ_)laX zM7r)Ee|+nOS8a-Z^2JDjj$&ydYGcf*zm2EGG*4T*N=ZjPX0p9RJ*f*Cin(oUK}ryk zeUz6~ND`^VJ)Z?%Y0Nph;jp@@hY;7?zqMYK!5(IJZ4rFXcR`Uav4gWN{h5*Q}nD z14W3iPP@yE)N$!FSp($fkISOjaW8V5AQQ<_fFg`cMLGwGt(0^e7Cku6S}~qPtlexT z3ONt+zt~A-a$u;J4!j4SPH-N^2-aW!Dk~}8F>H)*hfAxc@h)ZGa;c`=6EkUtLsx$r z&+hY2$2TpNEfRFzoXO9;Y(1)ec<~a>Fcy|X?ccl)P394;xy>Lo&oY@N@$~6B4TT=e zZdp@oiy?9z@MeS>ejq4I>5=`SdN4#MTOQoR3H_v@8fbt9AN{L|(^vhQA90i?%SBeA zz*DoeAaF>}n{qQw0}RWz(}MJ^A6_gWj?0La#xAsF1cFIMe$B^bfT`nI>Y|es#FNz# ztkdFM{+T%U#JKUyALa+pk-9No;+tGI;%c__IlBTzNl*)O>IG&o-&L+S`~ubYK^de? zytSY|{_gm&4hq+WpZyZ~w|!=8MJ0xn&p;_()pa{RK@@Lk@ zuAE@w#{Y-4^lJA%*3yh{ zZRe_bbruPJS*x1~Cp_WFIMbilf`9?P>?uYJsE?IJiFg^@oZ2B z_jLPrtA!`W52ayuv)8V`%rW9`@}cV!2&=+&*SWtx3q_LlLhi7sOl7IW0^Kg^kmrrC zNVHDBn_Oeak(bwnl&zZRa9~>ftYCcyEuX=hnpFMe|MQxLuA;84p0{9rCj0#J;}hhg zrO(`l-6q-%@-DSUaM;PmzF+HxgxVdeq~nx&IAIs%TxogVzaQA)@VmLX8v7N9*&#jw zanWq3?9egl5uaMw`QMZduo@#QZ;?*svi-UzaL_;t=V<m$0GAS~04GrUr*0NU$Fv&_oM5TJK=09v~Z6NPML$xtXOK7Q%e=gL*z(gyEmFk)lJ zA0iviIp?$kA{N3GeT$>XV6Q`}omAeMZD7DZaawhoAh!~K_>2TAW~0Ilb8fJxg%}1Y zZLy<=%F-^dbenq z33QmbtlH6{Hyezbc3Ly4Ke(BwohSVPM(fUiL{KlS00VL)r#3%A=LyE zW`NXslV-64l|SsO8_&ujd9nbivxos<)e5x@S$ZPN(BY$9l@vid>VJ`Qq;f@+&K(+& z$-7i1(CKbOUh#zYW73<@)k#|LVmZkYMXz=3Ru6LWnx%ULamDU=1rJ^5if*pQj!3GO zu^jpuLf&%hL;MOsE>S27aPlkrseE=o14#uVcU<9LM>0{3Y5s`)rNFQ<0cjvCi;bIH zwQKN(y<>_rft0{hx}Zn38ZDuSpM%@cmV;} zO5H`eSMYY@6SDr#fTP2(Dc+B^)eU7MB!LK(6F}%2kWAzi?)KZ|ukhmZv%9{XluyhI zUo%jg?+@hU8XtymzOFh=i@7ODj-_b!nNg^SEvFZ=witi~!2clLf4JxS^)AFzxDN_K zI0Af0zt>ScvYAW3j{3tSvm=Mm%^V~LwqlT*<8(~!HG_}yZuFU>3qG@ z=?z(50b9)8IzB5BEi#hmJfmP(CYvHK2|YZSH|-K{v3QuE*nxwYy33(yCAt z694VTimgNj{ujf{E{0R%_8Y^)ODy!eYeARC`jgOI@j_$P{kUDN$fx z_WmIlFfuhIxpX&jCK<>5Bq!Bbbk67jRsV)u`;_6 zka#iWP)kbQ)d1m4zisLF{)p;1lK1>_sb5jA%QMoJErK2L+#zFksIxN6D#PH4slBD zF;fl*^=b7?a<*hmc(-Bh_;#N<`-NKY#_Z?v_j3MP8<;UutZT1oK=?7blA2%mzT0y(EO1K2GI_;P}E{ z-&gui1gWG?PLdy;d7(c(Mn?X8lDzE?rrkFEIqEnQ<0w$0u^kwA<>u}l_4MSDKXFU; zI8HzAES>}Fk$k*p>vk~wH7gDKS_5-K`-_MaMrO~HQ+sNYqlmc&YEsAv1`iKg9?EDq%mY-8owQtykcdW z><;$XeXOxW{L<#o{I(o-8bd+-{v(YZN_VMf-?;`kUj9pcbV=}$mWFuyT>_r;2kJKU zx@O2UJ~m^pR@sk6%ugay&}s~920#d4q=zSdF;eg($l+8E1+6xca`F%jp}<0M5ad=P?d$Xl!S(#U@J45n&CQ;00;vfQu)QPk`Y@v`A|uw0`r7sK?`>5Ye~sjA zg6nst3EOc~DF%jCF6@cJhV$bv#5ZUVd8zkP>v)TiTwAD;%{F9{-{dsuRq&HR?MHKe z?2_ju6gOW_JBz=qS?llc#{p*D<&`~QuAJ~-OC+WPA}Y-hn=78FjJ4oCl(smLz7zI- z3zFI3&9Mu!T}p{DFW(J}b?yb!=Pkci+1|uUffp)m3}e=Os)ei4hm5Q%6J`)KD42_F zMeXJM&KuOH3j&6sHMi(J_Oy!Jb0L_GlWyK^>P6+F;ctBIOiB6F51?a~o&UWWlQ4N~ zpjHc!M%2Wo3ul1-0h~M*P-pc?7NE6i{u*-x5Tk{T^++>FB#dt0o%REz$N3>keltJU zFFq*3>O;vT&@)?}=X}KzZ^@)ydlt!_o}pFgjnzIpugu@wBf`uQ+KaE(J<$H-^sP~( z%QvWjKF67#6?(+>tC|Jv{=oq={YJBV%v9JxKdBy2=B({Mca16;v9?DJQ@eAZSf_uM zI!#q6uQJ>gcxjsSAEeoQ!OJmlk@ zeKM1dM&Ul-0#>IjI7~tm&?bIInfdc_&wqs4n@iZ?LvSyob9zX*p}3-3=d>_h0sLWl zZ8VjKSFZGk&C+D9$gr}sw=`6gL4o$pF1gkLJeX9}o#C=(tQjb@k|1=X;uD6BlWxnp z%lHz9rkp%~cT7@CBZ5G1i1BEgOhJ^PF#xWMeY@WmKJSWh`PPDej8F-)`N_|@Aw|2J zif23<(Yb<1PiWoFCUf7n0C;9CRgx*?VO4S30SCL%?2+#FIf46B8~IFg}het~_QzY^@=6%|3?iB=HmEiqdLcZ~{*9 zV}DFeJ)6+xwjniti_|SkV<{oU8z+($3w!u`&bCJgyBB%R5kSK-gW$E2;M%GIp+AvO z()gUMxaXL_3j#Af6rTK=4=OtlqcCZ4>L;-)1c)t~N?UxG^C)Ju;$3qZKabOn22$3g zom5`(9%T_w@F&>RHW8Vl+=kcSMj=jhacq2`8|J=!p)}==84WpsZ=t4Y#T?sm{Y)qX zxtk(;uK}C@N1HK|ch18c3-<#M|Lklh)#3YEWP$4y_EIF*9LXSLN|vP8ca$2V&i6oh z0K|XZr$L;Q#L+Zd`j6awuI8emgN%K`N7hz44_I%tzur&e3)1D+h}DrnRDC1paa)*_ zX$S8Snj;Y@BwWUTb1xH7u}ZRd<3U(rw`AWvmPQ`vlD6Bq(tth^xa(hwH;`BisNBXT z*aeWoq(9B2b(>7gfyUzgO6vieaRd_>n*q(8K47*Vq&UNYzi)0ZzW!3`Mjlpi_C_g> z^Zgp``F)Z<^5;FkdGWN4>lYtD3stXa+9}r-1IMXb`3u<60D?SjEgOB(lVd;?)b55&<5dyVWxX+@ovo`@{T9O@pj07b z*1?R|+hrjV9&v$*pgZ>~?(hVt`wB&rjf5!n{RS`QPMgn1#vafXIKGnC!SfudPM{Z+RUZ49AoT;geI zE}%7vazg@}!cL8pWcWwPomccCyT0xvf0eD)K9|~Xz)Hd?k9D(l%gz!YpA1$&2tu;)Ry16ol?qX;-sD}&^xtAA4>ofj z>%+G~Sr)my8;(s~3oynC33`vieiz#%C4#bz58F;V2AM&8ibE zZt$vd##<6lAUL(F$mZKK4MbjE<6DeQ3}=o4;I}ymVzp+Y1y-if*N;0?rI9y~Oh!R` zjEgEKbvNh2IGf?)pM+n=Gl$~71x?EThCfvhul(He8e)fWadA?_+E#zSOQfb4J>eRa z#!s%(a<-oOs}QmDkL6}Y-0VlWb@sSr<4MZGFX<}%LXU;tAek^T15fU5!g{$D%jcTD zz?Pwie67<~6;&D<9`v^qRMduzOjfuJisW)&D;L`YNKh%R94UuiefLK>g4S?m8iv*< zY*jUs^tGSe>m50-(l1^!N)@hdJ$PJ?N_S+42)d|gS`fyM2h5ZgCHx-O`zy_g3`z*` zM^&E$6si)14qC=58<6z323B{&yoir~zV%paWas&tIK*0JS66*z!ptA4siEZE+7oW; z*N*lS6y@B+r*^H^p*9-qvlUV7rCgR{fklp-smll$W+b2x$ZSMhekG=k)Jnsh&a6_x zD#$c=4ZdHgwYKUMr0{ZEJT};tUs}wE<*-D|P1*71v?q7(+i|dEAMYt^s@i}fq%St? zqWw0#N>tT&Dg$5`M*7c>!)h3uId_NG1!~q$w%$AVxD;cOxhQwIS8G!kvJZfk8rFw0-c+HtePj|aR*{*zL8EA#z15bI*YaF1 zRM>#Be^#PTWGx%#JpmI61;ms-av1*7;Y3qkNdFppaJ;?Em-<1%IJO%Eu@|&sbE}WtDp7sZ{wXi!gK zKF(2+n*AD4H<^UvS$9ktJu|~N4tyllQ7NrYn50^s^T~Me@U6bqWFe?>a3CAT7WOzm zFOcJ^y_(w&@&F&Waa4*mhRY?*HJFALW=}Zks78Hnr%S0W_PW0Yj=#M|kQ9Zr#^=0zUGm(76*vjp#v>Va#)4 zqvqedD3u;?M4rB~SET?M;@8@@j0AErsZq??;D@HKvjO3dLIPt&-uzQjMYmhP?YZp5<6Q)Keh6t-$AWLZwP6S<`+ArS>i8h!=?tq!z= zMY~0|A7Re^D6z-$-^e!yhsh-Rt{GW(8+$oXLw-dKMa%ow1*#uM7SpqjvTB4vnXzkR zJXSvNbs@0b$WGnECHkyPw9vgB`Kt@@Lym;rB9A+EIHi~;$!OR3H{2bADuDLug<_uI8#Sm(N0owN=2qBWm?$ZC({J)EIC**bpwq$JR5y?X54^nVu8q{>@u#sYt6le- z%=MP4^o*c_*6Y(R4cOnHX(fN!+S95*y}I0<`tqD7IWqH=s18n-exE(P#sc^L(QvlZ5Pe zAfFFCN7@g`8^x*C4$h94T|Mg)BNjh9ztlkN#%0?~74)-pt)jprQBlx=q3YrWWp5lU zD;s0S?b}pax&phA#L7-_^pj`O@F!b!3C-%)vL)XdBB6tqB5tu}G;i47yfvUd1A&~# z!fQH*h=$32@T=(>pEsB|H-Pgu+XWsA%Cn0?{z^}YY!{~fa&t9q zQfmGHq!?Xln91vqt!ugZbS<`c%rZBzWApphD}A(Flvx{HEsf{iw#^>OT(o>0gaF4pX9)(1Jl4o5ihlpR95= z<(=s(O+sgTw7lAxeB#EyGm!_kp*D80K9&Tj=jpH}23vDYezwDDS zKaMx33fG>yX>aYeTO{LxL@WaSCVIs~iz}4YDv0VKa!X+)?JRGsu}0&n*(YeSD&uLb^FcWlOue zLw-_JsApfAn)v>%BJiQ`mx$-}mhu39&5@Jp(U4U|D?8eIBgWc18^)68QEyR{WwQGg zgk0?_aCAqOVu=G*+#)&nFeQonhHWvHI;t>hP(T8IvO(3uee)V*jfLOx)dy~f;3`D5 z>a>{%2@Qp?PcsIvGfAwchJ|fTs>-m3F*G?R=+`*-VavA&&_V-7;_Q#CWhUy-$xzi8 z=-2|zw9Tc@rG*Lc(G8v=L@hcj>RMRRpp1q+eD;lhJ#18KD&1DlE|ofxE1>Pwv-(VnUZva?CNaU z3|*5pO2>!zeeJ^#(2_*YH2g{j61EgMQ@&ox5VVx?EgR~xfGgiGUOV`UGAVR=sU`RB z{v=9PfL0C-#9_%CIXL1UZBv{Yn-oSuOZk~wP$ZSuOd3E7srUtLOD0L8K^8BB0cXjF z%k~C<(0S{#*2VD9!k?-LxMm(9%&5n=h_d(AaWT&@5$df$RQ z31^`Ew%hX8rgCtwutzE95SvCwxWr<+udh&iT2`Q0yjIS2#iKsA;i9Nvb~5C`EAbGK+QgiFBBBv{ONxTnXBa(oYRjE=*9 zr$*k+mHc!4K#4hWaVH=l?1P6>j;!LtjolikN<(!JT?21dl)_oCR3x*-0?cmz_Og0P zQa8xf@IuLt4KMC-Ci`tK`_@3uFUHmE0V7QS@*8m`AHkbhq;^ zt_uZ*bO=EV<{e&8my^v>X3s`b&hEEtneXbWtFx-@r+=}5@ga#{hO~<2s_pq)Xp8qv zV0Fr~rF<^7525cZzW`((NY=I-lboXB<)qUelwj3aF~fK25@z%O0dQ;8;o6RD@djxpcMe`>yrj^_@xkm-pwaf zQR-?FvwTyV2QhDf5w%rN7YtfO11GmB{j)4G*JzmX93hMd@uy%=CeJlnC3 z(S4F?GZA+HbWcYuF7RmU;hffM3ZpJ}hoA~<)B9i$IT9mOv!$piqpavaDvW{4ThSKd zeH5NmnF+rIXqH2J;NXdR`ps>=BDn@w7ed}@zELdB5ylzW1R=+oNLX|&la}iravAB! z`bk8h67=#>U7rAqg7Sd)2KS`l97JeMys}?6_AQsO!WG>$$wo1(8h4ny8tAO~kSe8D z32Z@!wKhnI<9L#~QX(wRAaA=h3muK*Ao{`&l_z59$bi-kKrlfuM!mqv;45gOFro(t z;&>L6Ql-2z34lW|FwU=d)+BVjm8&~2R?OlLm9J9kSYALyOIm-u=G~`%X;If<1BpU@ zQcI={!f_nga2{*^8+T%JZXApYjaf;s0Qa8b4G7s_0}%O2QzRpC#QT+f}38qqkNY%qElaFZM%v!BOU4l&XjAL*yh=CZJvqU$2)K31qkJYgNL(r^dGLcF)UPd?VV=Y3BPn3hFwy^!)5%sm9czKP&852;ax zofPVNB_Lp0=W(k@=bfo*;bCeT7(hSC7!ZS#|Apz$vtzvQ`0U^Z?|2I7pCY7Yzg(j* zf6slOGu7Vxw{$ircY1tnzgT2SIM64Bu?}K{(Apl80lXoT7A!~K`=oA55F%~Fd?}qY z9MTiAIpnA3t)^v`_(^8}E2A`pYke;Hr{}s)#c-HP+9#799-)(y>ZV8yC9_OMSh0zb z`6pZeZf-4BDLGZ@w16E6$cDna5{PETgw;Itie0T@j{n#i_1pw?Q-GVik2G8pRFTQc zX5f0raUZ;!b^cYJmPZ@$@=9rtYHy}1!$8Vj)#SSFr0+q8u1@!x)Vi}hC;VQF_qkZb z3^x=`MsA(E@!5ovX`gN369az|@@o9Zr+)6$9nlNfSCQX^Sh7@G@?Q}`DIE)DVh9)} zL$#M7C(Gxx8!K>RM(uv$T+J52nRD-1Olos?HD#Lno@H_3J<#`EYr2_~9>5};Yk>1d zGET|8Dv%VZnc-fF8=1_(TiZTb$CyWQ+5Qg~T&1x4{&D7g=Q&@o;_nJG?q6soNSdQb zJy_ZyG4`v3h8SXT&+ks##bhsw1T;v7!+HbJFnOfO@rH33qpbbYNnchXZts-H3wi+W zQxIIFo3j9BV$r*Hsv)GQGXcOfC;Q3ZLNNGZZA&|*An}&kI|v!C6R_Vi{7G|Hdi=}F zW`X3bC$<0oz%pm(DSv_DU7Z$phnGIpV=M@yx%{?ITSjrG>ra$-L{49~x4o1vm;@-N z%CV0`#JDsuYU0~mf?rO9Z@Z3G`g0azwHCdbMXdJbX4ZR+m3-%qHf}ooAWtUf)F5E< z`Bu_Sm)OV4tF_L?NKvc3!V3}26eU(o%J0f;|i)SzcFmsypVM0dsD z?EAJ+woJBJW(3C$2`bt3sjdgL;YESJrc^W^+isp$f*nqMy6*JfwcFf~9;hs-XKbmK z3>Jh=NCHa-j($@IytKU#gl4*Y2Gjm-NK>JkfoLlm>0YGxsQ2jlEJUDc&!Q4X!!zsWJbu?LTIebR4!~0-7!L+#hT_IIRHO4z>fk2Yh3_n}%}x zG)x{l26FD`cW<6A{ROwccLqptfk!d}7Cws4ZD)Y&`%}5S5mU^(>Oar)a4_cg&kqzo zaL!>pd}zRwCo!7lT%z<8C_oULS8Ge@Gls!HG~R4ynoCowd}2WM4xsAi zbzH}j%hQS=B5a3h?{#vl&4kDZ5IaZUr8RmWcsnWWan6Mmb}0 zhsuNp9#z>+u}+;N-7O$rr^4T#t4ct%#g0E$y4Zgdey};uu>$CT-Wknc<`JHs`ullE!Ts>UK?aG~A%f+` z1i)@&z-j8!TKmc^K8lSXcLosEC!{;e#y!NBGUp1DzSo;PGJ$$?cJ$%Avu&<~1uP3} zn(CRDVj4GmNl9o4N8#oTUNuQdF}8@?T*p<*94TDw!WtoppqHNOhE1s%`mUVN_)2~| z5zFi!=}<{>at?1_-oxN$DJb)pL=FWQVMr0b@zb>cV-3sJZye;r4l{BZn+yvfJexEAn^;IFFQ0%&K{PW=!VjT}AL((}JV}feX}m-T z`z!LYHWg16@ac>G%sZg-ZlTNlvfRqWTdn0?X9l7#WP7|YcUNPDIl?YN2#tK9ln=0Z z3=`Jx!&jPIXNrbdx{UE1Ni}SFYRe#L6FN=1nHdMM%TX;cLJCvr-A!VIFSQ1mV%Z2Q z5**A~KVe$7Sc*t)4Da>^5W%z)TV9NKVJ8l7ib1V=ETfcu%T26l;5+E>ZU^gMWVwj24)(RJ8%>9TQSwi z$^scZT=CyY>M=%Iflus}SCiTSZ^$MgG7|uik#!1`sq*B7H@jhs>ufutBg@TqmMET4 zQh9JGiG&|Um5#d~+-3N2N;{0?KLiRnRi7?f0nlxR;AtG$i$J2X6s`vSF?Co<2cW#T zF==k;Fh_SyvFP50HRng^Ib^kGAaf(;b?^BRL;h}*C2#Tjk@)SV#4<@e z@SnjPPEKsF3PXBMrHahd0k|Rx#OC0jUHrS;3c&L3D~efPyY3M~Kh-2Ml?}<$(-s?l zD{diFpW4c}*5axoM=(+@mY|I%A|U(R7ufud2t&epQv~$nkwOjJ#G9l^U`8=E^AiA< zbk0!%p7M{!PCCrPQ#>ML-Wi0UgP z^}Ap{d^OGAd=W%UfDHs8j)YJ3jDq|`aU-fD(d=>l&YrEGx7*P%2UX(pQtLXz z;MW{??+7a-0$L!w2`440Ce=ao7R&n^DIwAsCUHs55aQ*KV#Y3y=$Q$@zT5vW7T+o{ z3#BQ8%Ki0D@~0_YOq3y~zJ?s(~D;SE#A(yGcLrjxj>BsGk5}&cB>2; z-J^e0SNDbZH>0CRSl*?C3OLie8S#?oWtWNTQtkY3lQ}3RqYvc#(&f%YSvBPgy7(D5 ztoH$KapC@z4dX+&Ap-3}f^BEoFy{Wdd2O>dF1449fUGZMUNe;gI$$ZkUE$+?sPmej zj!>Yv$KRKV?Rb6kdQUCuzfVId8iPlUCBwm5y=q^%pki1>pEc!SjtC%0WU9cGtOom8 z4&{p%jHyz~a%m+k+eO0UU)E;4UsAbCQ%`rVWRhxHWZf=R2!hda&7Y~v?!<6wH%|ZD z-SbwuQGDWorGA$;pqk+GVH9siT?RcRaVOmja2V6-%p^Xu2+v9Hja;e00qcSf6Ov_@ ze17?MqJ}Hf!_qg>*vmU6gIU#^nb-zEPyi&TMH^801JOID!no(_2a*!SXa@iYWDapdhW zuQ$MG{!a0*7tw8&&z)Vq9Au{yIXdUIuxu-Iu+gx@c9Ij06dtZCrClctjV(rUZ;W7) z(7?#vZ-CCy!1?9;xN?~AIX4F-UhtwsKmdD%s+IgMwT#R}a<%5vX@rvr96`WH$_Ndv zx+Q@|w*@?I^0drmVeC|X;c9f^i=C7NX2?KoZ?14vp)fiNPt0hpMi6tn%E`OQzGy}U zu&KOdhOTO{?}g}^G>EMFhQ-PLDIZBB37uBIH&=5T{@|n5O25A5?6L;NZ=E`M5<_5h zBO`i)KgLs#=g5=h0gDaaVeor{X@7g@j~V_SS3akCw@6lSG9GrL_YjWlUR^Q+zEa8- z!}%Y3KRiXLce7jV#mEF{-s=OC)qs>ZQl)xheZwte) z2AASqtY~m41S?LV6bbHL3KS=}Q;HNTPzV~_-KBVOE$%Lb;_gt|^Yy>?J{RXaxyenQ z%r{xHGPBkwrm&Ig6U*GMR z(3b49Pt*%MAJnEQ%?1)+Kxk0byqnF4korYCCRrGAZQ;RkLSK(Y>S>%p(7W1c28XuE zaH+n$q_ceiH)kS4XKwX%u^@AOn^=g0>+&v;slFs**=D4S_GpX@JAfg2#5A<@v)QsX z(v#EMX{o-E&k-DnJk7GCLf?$!X{GZ%M~15U<_$?zLU$~vHa9l(jtL_Zl!~LjpGS&j zbw|gUx64~WXRQtRU%Jrm#M#voYd7{sBMJ?|Tyo2~FI^)M!m(%7iB0w8->w4D-rX)} zL72Z9-n5OmVYj_V4*rRNu2e3^{kk!%s>R$1N>;K%(J7Az0W;j+QQ|5tiSx5TB@oSE z&A)5Ms20buU>;Yj*73pUbH%QmZFPG%K}Nb)zb>XTtoo&iU|O~CrVbW+E?-uM71SiZ z7NH_yQw6C>oyI=S0ayBr@ybtL8f+61+^~?f&g_!KM8r*6&?Wy+=ElGXgJ;A*b~zsN zqmoV)s_-Bey6`9QX0743fL6>p*Z-`hIHlR6*n@N=ZvQ*$1LDBsDMg^P%H6H8Y1wY6 zk!Y+TBsjRWF!3~g4L6Ac9~vt#iS+LHZP~XbsX=yy?A!=8-Kp1j+J&*%g@`$|^`mr^ zzf2X&VO!IQBErILZyUMRS;FZnN39EB;1}^alJjKEoOY!e)0E|#KYl@4=OlSpcK`#K zG!eEiUMrPtJ(Ho?svin~|6=vc{#6$3b@Q@?Ey?M?&IXK+-(@TE(SlCHUd8*`8(zKl zr$IohrjT8rg3ysVM13iHYGBl6Ck%|YGxfO@*Ig4;z`0R9E-@-aK(PM1d4MQ1@s0tG z|4j<6KUD>KyAuI69CRP1^m>nvG2mV(Iv4PBnN-F#&(q(2bVdI|gFv(ZVToUi+qc7x z*Z0{azc6z``7JHJX_@%uMFh{8$2MGG?!M+kz^jj3BSL1oG~0&5gM;%}cP0Xc8D@dL z+TK(X?QssVX)RqJx_UE}1(WeHpcffL4;RfCV9t-|cd?}RB1;bLQTNoDX<pI5$cZ)z0Tx$2f!L7C1J9%r)oQp&{nuugxh^pvc~>H?xlx{$^obNVYuWyQY` z{WZAZ-02h$A)cBMK!nH}i}LQQ+R7g9&qB&emZ}XJ?l6f z+RHEDL(}D9f3@64wMx@ZORk%Bd|jG9Zfz8svW_J2(4?s@V_FMOp1zeDfzrtSK$On( zc6D_%=`9;|erPDT7xdh1W^gaE_hU;}ld#EkQw1Jj zpaH#EyqRi-nZ(W#QjQ6Pd`jWIE@4K6B`-ZEn&rR+$S?W>A z0yceJp?jNt>*8>bb@7%MgRQCI2V*#9R%?i?ca{>HS2Hjf1C~<^AMwAy-Uokm-_@Gi zul*O z^U5HmzUMj!*681ccojhUtcjRAP_#Ku?^dKDh5j)R$)H!NaW?LSI5%$M+Oc|a|EZ_| z8}K&=RRjTxyr{*JSm)BFd?L zJ}&}4a|_7qZe-H7cKNXbeRcnu(v{$uRKcK|9y376qRzZ|7diJ+aVNRZVT=)w69@S} zue5RRgcKM5_7SDmhaVyaL+kyLucny}Y=3D?^9AhW6jJI+0-4hjZ-(7>@J>R4S!^;v ziaTPdSLt8cvP~OUGTs_PU}{OoLE|h%*i0cWqnjoobD;*}^ib-`l#p0j^>GQ$G_9OV z0U2uQ6CbGdsH+5~mCei?#|q}^$^hcGt*U`e_tMGCAoZxhKce=Z`yky`qGt=3_$(7x@Z2s%?a&INeJbe&eYNy5g|*$ zU-^3C`^dJR6+JZ*?=vfSY71=zDxPbSZgEmRhm_@x%u=bE`OR!+C69Q=81_}i=~1C4 zh9PXzokRZV4auh*4U6j)pRA|QX7ZOP=};d3DEa0Nk-1#EVXxXEsfR{!<)eCdP`Cky zIes=H6qviO&J)TyI!q}+qN$O9_MfCso1WW}o32Hvexb9kSqG*>XhpEH1v-;#U6*Tn zyJEwrkR0_zyVxBP1ZKGkU&$D%5^CSwqk<@zQRo5r+{W5)M}u(WZ511ZyJDMGUV#jiPgbs%c~qx-Eqtk<*4A?u&f;-^tw_0ZLWJ?tn!_zY5W~;aR;b= z5|9kC*5skfp=hhN+W1Wh1-jUnuhD_M(4lKwP!`rVkY}cPk<|Qf!(}I%TTd^&E6DcP zF+xBjX9#d|)-{9W*gVJPNrJO_=^zlc);m}@44kf%xBUf<4fe5F5=b>Arve>mbwqFfsHx&uEhx2V9WwSthRRO~r(qCNWCo>j+ue zy?C@0ZMAR%>m>#xpxiye5B!0Ux+}*ZJHG0t)N3Gr{qA1I6^);NFE^q{!h!~w-5lCs ztr4gtMbV5IJc0nE1U_8FZCqKeyb_a52B5SKt3{p&4MR}CXnscTyItqBvhR{Me%hay z{KJM8YFpbP;GM^Y?_z9_`y+d#t1A#7bV4|hR_k+A4e-Wrl8_RNG7f6M7y>)r`Df@K z;>viNu(5Ys*la#RX4%%HM4knoVuwoDns>TWxJ|!Quo5-CjW=h#0_Z8U&S-{PG)w7Z zRpVb9P2kSxl`-SGMOoyQvdm;u;T@zIw+2>VM+|=TPho&BSzkPdrKO1A2Ft0j0@*B3 z3FM|LehL)-vGe#?uMDTjL;&2wSaE!`OB$?UCs%^>Z$6quIN4wZXlmsVlzUUbT`sIw z>cBLnsj=GSMj*{gPvG`MjYIL!FS7|~Z6il){yS2|1P_a0~K8HKH3^E$O?smiZXWjZ>HdqkartVZ>|F zhk~}p$iGe6_Xl#Ijw)jGj!RM_d!Fzn1LzAUkA_t72Wxp;kQ30(#WF5FXBc>=q->z6 z+*2im?qq{6#Y#sxpgX5*BuSn73*mN08~E2Zx2L_skvOy~Dw`@CL@e;Tyh?Nz?9x+R~vwUgfS&xN>?E!4S^cZ9jGL z?$vK>3z&+bnv0C{hC-Go#wr!4Q0UKwyyPq0q(sNrL?prW?+2J59IHCX$F;}X850!K z#{Gi$O6AnB*^(8Lw9`@i65Z$ix?E!{yz|3?09w@3V)p|UHIg7?1i{k~RFTfTyE!!A8SdD2Pn zeDCqaYucm98<&btbe(BKs8tdH7vn4+@;=_O<&Jl5+W+3iAOB8tw1Mw*vgss~1KHIq z`%O2%;byYtlX%VhYq8>I^6Gb-KaZ^kQp2r{C70M`98V9WnyyGviV-(vXYkY0vX5v- zf8$rf^scrAODiQ>Sa_UoH`1ECFC_q;V$xCa@$%T|==5jd&fi?l?Y*E#pMt>0U$}V7 z4qtlP4gcW@NG(c|WPwrhEbXS(F5jI$p1s&GJB_kd<1Q9{dC=kY$)qUQ=>>JK(l06` ze`r{k^^1m7}=RyL*U_>PXx-}hUF@i8zmCSX=rncSM=0%hkDW$&CY~8~dr4H{>Wn8_6 zkY2LRfPz4_ulmYjzef*Qkobx~coDslMV0&ZsOUx-=lYPyzcNH_xEleKDBMiFA9(lj zkyaXtJGg7#fHu5@d#A1V^%Kv%%dxYcwVA=^Tz#1Nw1`EekhQJ!al zBGYcd0M5ZY6BTD{OCoXx$&nms-jqrg{QfWt8P3)<%rYr1Ci8ekK=i33nlc;+ErN|< zD;4%C-~J{R6f-e83!-N*TM6GUbzOT~bI<3t^9!Z8KUhv;dhzGZ@1x^x)B}(8lM%jG zAZAX1{6t6tH9+|kf>3e3Ivz+#&ye2IF=8El0Y%2;>OeMwMG zh(bPt9#ErpkTBDZN;NA|FQP$`i3+fYGC@U**yq6z5L04gpJ8xXDV2|jqoycS-tI8x(5CL2E zEE4$rZM+^8#g#fdIYM^qEd_)iQy5*1@+(kuN7nyJ!&VKR7uf%;V!Pzd9|64qM5`4} zkdeDH7AfcoU8=|lqQDZ#_6cxI?=nj~1x_-~O)pwH8GZ14LeMsl@59>ddY_q#!cM*N zTsn>AsCcCooa3{ncvDo#_fw6Q5b^UKCOc`!*2s65oiU80XWg_bq`o?J7_h?cVlOdr zXpVHs6c`0RTXt6H59I46NTFsgBGIm4cu+Z}7bAkC>6#{fXkVDdLS}1EkUEQLlE*WA zt*UbsVc0HRY^{Bo;0?UQENFG%ut3E@R?@?&MexLIG$Rzr4NGr3t5drCEkGf^CEvSRC3F4@)T`Cp}0@dYxvTNWpy@m2H#t?FZ@~(A{1xtR0i^x6U^@ z=XbwvtX~MGk_%2#3r;q%PROsl&oFF2wb@qRu!MJE(Qb{Ps-Y(nx znX#%gJDUL)vfP=6|4FnJ904W$OmhC0M>(fNOHRG8I%MsKaUAkqdwq!X3xRuuW;9D{ z5H@AgC0!1eRB95ByNY+dCrwEoHnD$1Hxbf|ebBGE0ZfcMqNs`fHi(^z0kPup>6JxX zuVVS0mZm93!`G&>NIB8(y%Y<`Fn6R4u%-Id^USL)4F5BF*tEq3!*dGdS9AF&D#J?L z!#hb(UhAExL69W_MQ!ikr>uo1~@IvEMX>!#m77$%`~B zpH#C30yz{v>kM05|6mmF-Fh_*8qq}~9c(?jX4YV&4ts~wq?lMv#{THg|Kl9g&!kc6 z=A9#5e%=~s{dxd{&plT6^fO7gt9ro?dTB%lP~(mY7$xb9Ls|uq^O&Jm{yAaCGJ|An zDbz*iV{I5bsi4)%OG#>lGc;TUWC%Sg*CiQX?!{u8Jobe7@JV$Uh<|6)*m;epTIy`~ zuVYp;rXG5GqgZ0!U7ear!^Z5h%Dq$-Zx^JjI?>L((-2`Fd0BwA4KN0{e z$Jyi8qlF^l#jcqjr}@!{GNkc07fUiu7rjsgpwy@jU{Qihw?J0Z1f5HiQkQ$Bo!z?R zN^fL}bUfIKeez>)L3zhJJl2M(G5d~>&pR`qU}1YfF3`M=Ho0PSww9LKTiqP1F4g~m zC?q#LW*@hId&-+wBVIddY3vaOI&p*skSx}>M~4w0*Ey1>EYYmxB^p~w9I<}!iCb;S zjLt$MMXGc5M-swyXFmV+^Fz4GWAWCQ4pszGp;h=m$MHA^muZjpXhZWLA^g z(%UH4iy0r%uOUEK0;t4?Nd#m2%NNa+Tcstb(+4S`Q2(jnAxXV}>F<|5?XY;4s1ka$6X>fQsGdH>8%~k`*(Oj(dQUIZXT9Rh=4R zS`ugyZQeu2bj1~F#1*oVnD_evnSBMqf{o#_*O#biS(i+E#2q0&l9D8s8rv^n4V!aA zU4N<_&3n6?SD)Zh0<`93;yCGr2Jz_5z!0ON6K0Hf;mWdH zhh^#&0f&`R2)RxH8gsEtUAbSuNMgpjYUoL&E;mU|xzL6|#WHasc|v(BSVa&sWJit3 zZmW2TrFd2nt@0!Fie$y7H_6^c`;nZR>(z0r9PH5Xi4e={W$y${lOyb{K2ibTe3E_uIaZe@g^)>%~fMZ`3Wjp&bRIe~AS)tt>2*eo{Ae(a| z5~}+r^&aT|4KEbgj!zwGDEBgV&df?b2#8R?7np6km{g>J0GE840||8+?s89lv3E$8{0_l>mi&-U@(2O# z><9!yRKd>hYaU&oNt;wqMC;oNL(4mB&A){oOPU!kr*p+P5;JWOuPdDrhpo;`g{OsP zo8a{l%^ISnia@Q&=zfKQoyV}PR@m#aKy$fG#&0Rz72$amGlxnj39V1F8P9HUctkkq zD;k!nI(CPWC>;d{xVHwIkU_$%Cp5@@xG!%TB% zrL940fR2P7cg@;j`w~CTZPCZAGhSa8b3ZvV_^xlOGtQ@Q{rB$=yH=aB-sF0@IK31} zq2^FEg$r!I5}3AAKQF(~O?*fY7Oo^-5wTXQjIWQ>)Za6QGL>d>JjE~Mb4QjXj>G^y z2A}en?Cn8vFPXK#0TFJ6zXv8CZ6F2J(qnS5e zoHBcMg2{#D|Mdc#$rJmDc}2!cmZ!d%sm;brh&PzZZ=2ZmTy_0ROKxd+YjNQk#ptcC zX^F6YSfjk%HlPuc8y$I?=Kdx&K|KQbofI~-F8h?_%w?tDgT~ORU0SQ}ylH?hZ zI`NBehdtxX{cXr`3K-pRWQE0!AWHFgJR#Q5o$~n6dDR=27`q#cc-l?VQ(5^$G(j%2 z$(s$fTLJyo+zrF>R>$8H&W#D(jqNO4^=n8}>X~f}^R#MbUi$*NPDzNzPvZDFA3fqY ziEo(!VOT1E-_TW(E{dX0@6)-=6jcAn8KAz{A@_Y59llh4q+1I`~5yAblSA36y z@dE1OQ6!)OBi1m1hm|P@BS@k6dmh~+lQGR^YEl^dwMh92-I=g!OE-EIN2rFQvY$b9 z|8K{K+SgH-Hpr~2aJ%QdjZ-kA7D&XkiXTG}ik#dBQt5g!(t~*TUwzF21ZLloP3EW| z_bCxpqecw&bo8($R`VoSu1dt)qxwtz?3+WgR0kqbp6B{;65KyZ4!bnT)L5CGe+1=E zYPq!V5kk{tC-&2}4$FWwIgvTo1z%AMrvJ6mo5WC?{1{KJ-w~T4zlW>%UFX*sYbvYg zk#l>znyhW+PM78|KYSu+cX}|eni#F2i)!<&?UsFyKF0i^MN@eM>O1R&)orQ1OTTMz zVEQRNRZTu8G;p#uZ|_W%4ezeHSRS710zp`6OhC!{AFxEMD`AU4Sp#-dCEX&9i!i!z z!HcmK>+WX|6XRIN`dDr0snGjlesX)gOH)uAE^lf>5rR_05x!)%^{`*hRSVW=h@9h& z7C0H?65R{>dWr>nKJ4jJu6!|Wdl;piaE_w=oqq!4(~@%K+2mAn8oQ(N(!GX(lO;Va zG~feK(u)}6h?W6_n5#=sld-*8LZRmE!ib2GYIOQLTztFrH~KwccLS8HFMAJ^Ct@Qh&C1EV?5Zu4;OW!Ubvym-;DRl*if;E&`fVWxI$CkM^W6=Iiq7HaEQP1u(tb zotSyAKH{)|I5B~!p@xSFy23FH!|X#?i-^2rji+r!^%V)zeTwlY!1K|2%$G;xTV`=Q zO zn!JL=SZY*lzXMr+_guGi%o{bdxHiV9LPYTdXk408shCW)mL;T<6R3ENjH!sN$UY}4 zJ>BwB`@M2*9d?QTs>tYt4AmYce{rOb5t=`miHZ_&m@45L6lE>FMYWVE+n?VJ|HCel zsW=+W*H{0C$@rr+C!~lEq>0LaOZ3Te=Z3EwsIbRI8hpbxdThf^H!Y}6!q^uW)z@!o zBhM|L4T+QHlzm8)C`7G(->R-(pd42gS=Tn4M%77R3;DzvQuV>K^NMajgrf-XI~eoE*c7gJ(ID;iky~;#leRqz@>@_k_mZJOd4J`91Xc0eNEo zCQV2RxoL=1UOSKDr!!8A3`u4dZQ_%mYbS2$accHIxMH5bO$oa+4Ab~W5^-!~KO=a; zBLZOY+o;X-bM$%@`p?zgQ#%BBoEQ(=*dJ&SN=4+m0-GF5sNib1Fy+tdBZ}EmJnfWs zUkpLWD?!{E+FQQHKPLEj_o9;FGriIhOh9{l#l2j(>w+OOtvVtZKTN9Cfl1qb59{>k zh-CMfTqzT5Du$&Xv^b!lZ{aO_n9N^@gCSDovk}|8K}xqMB%yLLSn?73vz7*i=)@8S z{Bun2YcdHQ<|tVi@8Xg-FENTJ^wNccK!NdqHx>H4T$?8aMUgyayp8 z1qtlh_7dT=9QfX|N4BRUz<9ABAr}k)#t7&AEX7Ch`MM4ZFfQ=^4B4w3q55BRVURb7!I!A*XG0oLKH$5yp=D#Xm=%%`hWk6w+nSKuE^3QWgqc z@79J53#0ZE@@jGf3?f$M66Ph@03!(fSsZ$XIx(Tg;b;Fr8}s|l{(x9(@FC$RAvT3D zPSdkkfc~J|jc&pQJhd{E*RWv5;+Ga;XjaoZr&#y`JFhE80@E;B1V6vD5fKhHL~pqk zC1PExIR*9_<@adm;M*lx@YoyO#D{3G7R+{~#Mp}=O0oGuv|fJcOIqSodAdt`$$?nq>u z${?9$2DYNg60*QD>%i&w)U@_2I4KCoNY?S7exEP%afkm#SN2#$i$w9`vc0%>gw1Y? z4zFp+z0_mDBB?+GHU8yP!{}u2a#16V)_NPdH zv10KyZ!;B4X!nqd?l^(EVyS)pPD?7V9~WfU;p2^=eju9P{+n9nce=>@{T&YFZg6oJ z(yOnR4QN*v3(xx}cmb}YO`Z&ZPM!gZsVV3TU?ui$LG(Y7up{eVX7>6YpE&+*;6Vi5 z@s>JJzsQ24uJ}#hu95pkn_)vd=1vKfo2KzuS8U&&_q@pb+gXQmRq~gSbB-1dCQ%E|{dsnj6~maW6hW1}lKCTGPO3ji zg%nnY=*AQR{f;W3{TueQcgF?o97S8bM5?Eyi>Ir?#LO8-39q2N@?9m_n7VO^ZkJjS zzUzAC{b#Rh*DG(hebk@ldrtRRh2Py|GW|I%$(V!0vpvgH#iApzYyOO6Op_Xk$v@uBH^Xf7u|H=R4IQ7=V9TOC%;pM*abZdqE z_i}t}{BOZ%{#EI&HhUh2!_~aD(5U1v-#lPFjZQ|3yJU%*0@g$fe@Mf^ z2C_chraj`nKr=U7`aO1a^{z5y2BYq3?GR**g-PeP`qa=rkN1Z_u^nx%Ta&#JJ!9;w z=kyP#sogHF$)YyPdqiaMR8`^|gxVPM>UjS)s2@YL(IoR`kNI@$@**ML?&c!RRP>HTZ8%x`onf%b zhx%`SC!JPSde%{;40XkZT_jSj8fkx#-HvXR#!Y9tjooTV_q4>^pklejJedB0 zFOC7w!_BvkF+w}uy~ADM)OAfaU6{{z{jz9pB-TG(;h%T4iz|K5K&$K+9;zZIQ&qvM z`F0ESgPq!CS`%4+%dBc*Nrr`JV$lb#E|+n%DhdEaWY)^Jx1tQk;`%%-c;8VnCF~e* zicI~k&U*ghfNm&5b}>eG@3$8TyJ3;?_^0#)oog!h6}AQi!*7d*Ij0LDTR(5A9Mp!y z?rwo@qjg+)$-7@j)vXv1M+2{5gWn~Z5mTjvm(SW4NZ$}-KmHc+VPP?S*x2mBhgIW4 zkcZ*ZfeCxGw7LFwTS_l}pR_lbudLM_k|y&xP<6KB!QX;zU%u%feCS*aw!0|eDDw!9 zeQ~!oN$5d|>(|s8)!Hk-d|tj7l0@`ktvOgcFVW2v`K*4n+u~K<)A~KlQL;4=n`p-)@0@5UR?6`&Q4JtNkEwCOaAkx=kzZX$Z>UraU~l^m0__s}(vTq6AAlVdKJ^ijXql`?2eq=ITb88!;hBiX z`gc3Z8PEdHlq@=op6(+$C@3GCWH)!8YB!V&Z~9Af46V(p*N+Bh-KUrx$CNd~MI zwoV7y#t8ykR?svOf$R<<-6+T*hD|bHtuJm86-zen?pBkV1*PdLK~|q6uQ%$=JE7}8 zm4|wj+)KwFg!ifQYT#FI86_bZ)Qn#jeO<)EEnF;N=wHCSc(9Q`Vq}r|d_8y%B4}pk zm~t=6DyBRSHCW#I1+5GNZ+qhZc!D{frb+Etpnky!VPEIl$m|Ogjg9yuqu46$jt+aw zQ(wtcR>ra&Ms_S(H=Rn5qVMA{A?g%A@!+xcaTt!uEkuRw-dZx5{CSw69#&A+BIwyT z-yDfDIr&uBoSf#zLkV(1?`2;n+GwPQhv{AkaG3#Kmy11}=;2{0`y!_Qr?a(ceC{Y@ z61u>5(fl7}P2`A37&nP1yk2l_yB4f@xyG8kT!a?tN}E2CIGmH)p>xAT|XRLEkTa*IrAO!jbE)MxCQR-n$9u zr`LFCBfP@5E?(IRoNY#2dhZ1pP}SIAwqsoioXRrOb8c?Zz|3kU39`!M^hSJ=rk@Th zYoAOA0l+Ek1GMZ@VJREV6IX*k&B9?eR~U(%i_SFKcoYOCgNn`5Y1V)0H-*|ef(|DK zDf<96Vj>%bQEW`ep@6<+b&0%D`lS#nP!;QwBkhKj02HY{A`o~7KISYdd5!9(i{dzU z%kZj${Owf?LO9@lrPFL~BoPCV>LXG96=N-|7mRDPFT3$VC8mhPyDM*-ufRS6g z16vh|(I$+snwSxVF?I%6O$8<=yg0OgQJE-DQGw0QAYouJzOr#fpdy$0SZLR_hffef z!hg{)2diG7{l|PlnmjOlB!yTZ)5(*h`%Dc)oh?~sFJv8~+$hZe*Gf!=;oft@cQNS%AA6dp8F^`I52G1`^d6OU~= z67W1~B9dcc8FXCZg(yyo95CEzRH+g5f9o|Py&To3d;-G1198`yw(aD)6qm=iLyqWr zM|`Z!yH^Iz$hw01;vvsa!+e2@Ud`o#r+OizNRG9hOFYmrYZP=$QI%Jwl<546c3^mR z6`QxWXN${?+4NO1%P*3S;8k0E&*^ZgNj_mTj`bHMJJWLdK&y_9$rv?~wMSss?Wfg# z(yWeF2^{1uv_p-dkK$8W1}Y%fT*Tit*D7=9NT4WX%vNd9WoxQ-SUWycU&0OO+F639 z+8DT(nP6sPZ7?>u%Q&ymYkCJ0dLzJZrWwN^qX54a5zUJcF*uR>V2`yokj;yu>fxcDG+c6^nttEfgCS6s6%3Oe`is-x-1 zmo#;~!hg$qXlq_pJA6*CM0a|cPEaLZtZMx={s^OsGX77QV@37ci3b0zBw%k|Dsrb( zUGW3Nw`R0|;@cHcx6y6BrQdjpV6gf`$>SgHm)V3V0hR#tBE~j_mI`!ln`m;DXJ5!s zS~q@@e}U}jF>38|&{Yur_v1TMlO`)=PHwCYd(7TbdGb^O|^WGXGP5 zFfugtL9e0EMfcT9{A*Ar^zxRDpHolGT1jSY7U^f)IkD>pdpezOBA9jEugOHX>7gAm zm9<{4eNnGohq7vn+`iu(MLs0$bH;j4u93TZx^ZO@n0ScK^$4EZ4hP$W1NP_0CJmo_ zAAfCmxI4RnnGROuj|klx-uj6 zdFIQq!%~QVD2*HXPO#Z9^^{ir{*O-IS%kqVx5V)h*Xlg;cYeNXUl`D;_;uJ z7fP1-r=vv~FEf!TuxlSQFe)gUlR4uqn%mR`^_!VN%XOYbydgu(Ip=dHP)e5+OHHuL zuLOcY|EuK*yZ@h-cR}XTAlFU|!V|^LGqL#AYh?ex#%LzUjlojqi~wjIwrBsZbf3-4M6arS2n2^D)3uhmuKFrQgT@3UkvMOy|R+ZhrFS7Ivvfm zwtET;ft)Y*?gulc>{7Ev5OaJk4xQz>EiCZAd(mv{8P2U_6QtdaU!@ffcW1Q^CYKE0 zjhrYfF*k4P^>NU(O{(Tfd>ixL4990ClvX2yCAft40JW!L`mW(#-m>~3y{2rAkpU?u zYWc=bpfZy9p24Af-xh*Ks3=e|e~3(ktR7m(ZNZ+!nwa}Exy`Ztrm=8WnWSoSVzB(d z0*YtLr&=aZ(#T*h;aic;8STl%e2A)}Q>9BOEr_ts)TtO4)iqK>D@~})q_5|8#ej5a zz%{uln3n7HSAJzGB+O7a_^Jdxvwi{Z@i9>`onDGP>}CB@KNy|=WKCgL`gS^9kki*n zhJk3%Q`PDT7P%Eg2hKiZ-|J(im@Ow8h#vR_>nZU)LDvYbMmJ zV8MwL)B>LLueeU>hFmOjzv0F(^n{;;jb?0@zA@T-ub5cU-$o=gv`#Yje)43yHq-^d zo#@=bU2~@VLn}e_&6E00z!b9(ik8bDWHn(Th)D4pPohUMNz*&UmJe3%hCOi~8J#F3 z?6yC+a5Ot#yl8_>zw%X)*cNxOWba83m=6bMcMAoK4fYoMB3*Ko@HM~V>k;1>2@pt1 zj`fx0@Lbdk-wU_#I!%r8xtP5Rn(p6qV$od`%nPNA$71i>$p6%yE7bYV<(otJT(P6WM3Br zTnB|muqh7q%0lA1daomu*&w=@mMb=gPAoz!CvnP)882;GO>LTev~j2uTAot~Q3)td z8h>S7zZGy`uK!!SoftAywq1&_DpgLj>5#7Cvq85oeU6Tlbs9{@vudwd*s4D{h8|rU z@cFZX>}Ue{Z3@|K|H48_6Y}~!ab7%d^Wrc~c{INjBH)i!(`Jrmaw8-7TYQ-U9mS7c zCw2cy5pL5|MZO)JLcwi?`YciNCCSQ*RS3~|HqipXOl#Jkq~~t#q?paXpoqWbWG0i2 z1phKXDb%a{J7O&;dFVhH6C_Kwtq_x9)dIKs$^J9jns<2RFtLPJvwyl!jha0#$qgwZ zWM8Ik<+NY0OROj9DAR9Z^_h`dP?_-Sw}}y6mC9`Iw{wi5-*%+*e;qAPiZGucWhms; zEL_1Occ>S8et%+Wg|!tlRIy!3c4K~OSZidFwebGxtGZ?Bj!Rwcy<7zAwVxB)5W(id z0pPPSt%0JC8$GQ$gmfHa>C%%Rv{~oO7XMJnGU_gB{(jQM7EHivDI^j3k~1vYjyi3Z zR7T77_KO`0yQV()LxgycpnItnRht&iBwo|xzNguP|9AkINngwdi?XsW#zu%Eg9RkaoB?Xip>+V#8#nZSEV~alK+DA$RT}U zdL1r0@Mtkg;vgQ{=^6T!{p;D$RLIddqqwGy8vmJ$m-XL@=Kh_XK&RT#kY~Jd$l(6) zs$r)~4e2g?xcm@vg!iztTl}pZ7@l%F~xtT1(cGh{ko67s?_pqjyjnrSNVD-dkP}FtNUx zG9hb-D8dX1)*UJkv0y@GN@XW>wqzdy%oux|1)@(>>Tg)gJ^h$P%yOfM4vMn9S@_@| zj?4;DA9eZ17AI#C2bEJ%J1Q~az9<|Rtt*xnkbP@>`BE1uX4$bS$Kjq&$YM#^KCBhb z_RW83{YEUIe>;fH$^OD!$!=ygKL?!^$6K*B@@5N-s;VGVVLcsq=FpU{Mzz3H6`TXX64yk06h+|s2nHFE$ZNzkK+%85(0 z?r{ISG()*??`uR+r7fqYwsN_yqNU5gHYZk;^ zOJM}!!kZ8hG0SI_>{ZIrHAJk5$zIsmI}>oio~m;NNSqkNWgouGCtN&~4$Cr~O$Kl& zI2J`h8XzMaAsTe4V(#RY>?Tp=%ACj3ioeFv37KD6FigBDqOv?8Qnj?$DpVBP;Yv-y zoUk5$BTGXfw{pl0JMZl!9cID5OB{;*no`Of->doDvLm91;Wg;1xMrzxBT9qX4n4u~ zZcK^^A+vP~q=X@5OfCNl;zIDvtQPZ5Uq;E7fs2iphz3>{7aj0VW&2CaAxvKxqEXir zD{mtaz6z~EwN#3fdg*Z~kI*)@Soy*dbY4j!jjTmHVqDKOYUPn$&8#K+MGNO~dg6I1 zncQ7k5o+z!;g^%q=I;(-Z6-7svK}{e~%Sf*?IM{RU!m0Q^8+;GKt=cr!tV|&K_i9}( z`bY~*-hx0F=L)jYTD=CUKk?aLH4eMQ#e3#`${Hl^Wl2^VVzx6d$-VrMdiTc2pX>fz zX+e@fA*tu9Ox|~#s`l%#@?f<1IO-s1Kc>LVkHnHOCKH~TOY;ksW>^2XGCmQacP%!u zq(KJ1IP`M;!ln(U@;GhE3uXp?dh3hWgk8`z!-iXHf$EzV(X~~<-8!-JTu<@;-lDboS3m!>H=Z@Sd$)Il4NkOy|?@% zek~azk-`Q}T3dC< zP<+QN07bjhKTM70b$Ci`=KR~&q{l0)I^b62bj|rm10qx90A}4M?3_TW_BOs|!#P$t z67B@S1xEO?hsMEzy=T4q!MfAtV7WY4)uHNf73x~kVQV%fRPxQhYWM|XK83ocY7J|a zR@z2VumUxorQjCp*Pe>0Q!z=zLD*o*ielxjWd$h%Nsx0?ZrD~oy5Dg~HsABql>I{D z@o?)%1^pi@=U0OelaBll(OYVbE4ST1HK7cbRVTk_($qhjetMK z^E!NdZwBl_6wXmbFUS_e4!;-d?`}JkwIFTVUX^eVBf(vkk6#LUyaaEGI@AB6Po|g~% zNWC6NNC^J2@6mT-nng$%N$T@C%z3tyezpzqeRAu!yIkb}-NXthN1I#P_(IIxIoc-Mh`9jTBr*}d& z5BL1lHifHl{to&L>wi=B1Q~;(RAA&$wNh!LCLZI1Z;^Rh?5D6CZ3+vKbjmVFKEvAl zZBieC3@@y!;;|?TJ2sLm4pjL3?qG-#4o0=KuduW^YwUrr1r=p&jlDPX?ccd7{oX?k2i>hK5Eh-> z3hB{<^fpQ@6?>IiKb#HMldt|DTNvIbVljKi)DVP|4{O@`+TYS1&rZ3LHc#oX=?Z!>VPi++YS>4NP)OjW?j+R6B zwX8bUrU6v;B0Vn*UB(uXzTAzQ)E1i6yw>S~zYFL?={R@=Fn@-F3|svl%BG`?40Mx? z8y@3zeb}Rump^MoeY`{V=Z7uAZH&+>)&}dAK+DnG61@EPi7W3wM(dO-%7MOLra z;nIbgd&Qmvzp?%99P8O;x0;kB@6gDqF!rwHvf> z&%VhETn5J)LAGFhjlGni2fP!TPw_pe>ZQs_sr?o(LVMz&muw_q%5`6ju$^Cl)zYSE zO8L}zUk+}tu_gReBD_-WxnM^Ae*zl<VYY3S~sv z*_r%GE|oZ)5~#|=D7s8CcuWc#a=|^tBm=?yNF=yJu%n`D{fM$wbcdrVli;3`!XcBz zcW}RziAivWOwZ3ppPNYrk4d4B3$BKVPn-_R*8(M#iGm5{G7jgK)dpDirBEC(1;3Ij zoZ@s$pn69n)_0Z3vgk^92jDHE3?7rh{_dw2rgl>I_DjT{XayICN0(dC6`CW;TG3?| z+*49G6kL`i@>5LxWLk`Z+h^*o7m5);c*81#Ln&Mic0a#3VcM$`-Z6{Q;gQ%i1OXv% z%it-d&yJV?c?W@XGKj!Rw3our{*Q-yCroQV0>oc-<@N2~v045IS^UB5=|BXU)$Yog z^&PPJOe%vjU`op$B;EYu5zUVeXntS};m4%#3V~X1k1>5f`1i*p{Jg)zU|&uWoPQ7@cMcugBI?=oq}n#+A%#o@(S*edXo1y|J@+I zWtG996aoo9Az*`uJ4Z~{2!DBM9{>5A9{vFE2m1)M#R`H2o~dPU7EEsdZ13;zpQk7M wRRU;T<3$SByJ7bJm)(#n0dTk}#u9}R$)4RX_GBl?GKfeR%UH6L zC1b|!vS%6I->B~Uy5Hw|?|+`p`+1(v^LhR-{N{I_$8ntB<9mG1<8%h=>#CilW}*gx zKxZ}7RSZF(KXib3!=H!1F0r z^?OJVh~_i-=U9tNt{n)(-ld_UWc1i#DP>}T*TkmzhuG$SL*j-)Db^~ubp zM=AuSuntK>5{O{%1emWxN;sZ`1B1I@3NQlcAQeR%{y4*{OvPbTOas}@)AN~c4rgA5 z1)NjP<&Hv9aRg{GK!Sh=yT5rD;2@6g6Qp9u!$SH5`S|!M-DWp7`bq-NDN`-o4%&fU ze6W0yY)a&BX8*E#7C$x}`IOWU2@SYxRJ5*BsLID$Eoi^dbmqfApo_xcfv}uUg^|P$ zN2VElQVpK+omrcoFW?D~S`>$3a(PpP@{oHyp zMh$Q2b=+{8nd~doa!6)>+vmJ6miYL%Dt_z=eysY^URDgvw|Fsc8%on_Cvzgq#YXo< zvK`Eb%}rcaIf;}U#DOnE>?v-u6|p_^;BHfhwEJT8Fd^u-V>*Zw6{J$A`C#_V&C2Ys z)WqilZ4G(02_2G(+IhnR7|~U#kXDRRE5==POYI+s+@aBBt+A`vvDWOYz=a2^>8s$* zD&vYmOBMgQR)p*P5Kmbr?Qf_!5%6;exOo_z`wj9;PtUN2b3*GY6o}82=ZV|App% zIBUcNh=3#{6trJ*&@abHl`{OZiiv6aC2enT@%faNI$13Fnl``daN~=MZ|2%+S$2Md z$=9nv`NvJhZ{Rop>8lwa>!LA^$KBg|eh|>vfGvK)k**Hhz>${Z(|)uo?#m`B^~+2& znf_CCKCU;`lMXO`GXGJsdPtG`U-lFa2L9EVal+~xJBi|Nq_293UD5MzB($yN@F4AQ z(mBuZ&wlZ?41tC?HC$2P|4bT8QS-#p<*fuTSTk+`;N_z!pA}ryr zf+tglLkb%g)O!n=`idtA9e8KU>s?_}0u;M72||=B?O)KVmom+93nK{<=PdU#Cb9>e zEO*^L?uSPsiFF&*6AHbwio+QHCmKH%xAzeSUz@Rjy3cz!!qTOL6ddD)^%kS2*KKXJ z^QITLi4JQ;D@L+AtCg8Ex9^G*m+SVK>tjqOyc&x|P-l>E`y93}HWHWil83Rcbwd@K zXd#0M$T+v?FA&e}t~A-4@%!As{#KphZHQx?sVLQo=!(R2Tpx;+snbQk85E4xuoyny z@7w8a&V5BFWQ1Pb-6iX`5-c7n?5;>l{h463;8KeQuY+}LPE1s9Z5PQ9`${Z3T^zs; z?tone%?k)P2m$9L`Yn38>feFngsiF_%+G&&-*~1K!#zwuUn|T>!=w4i{hf3@amH2G z(Z0|AIuAuaXV(>Zuk#U?*7(s%xPAgc#D=J%8_qu5q6_c5A2ZTo@9t6bYHHNW zQ)}=XT$;hwPtE;(qn@<)d@!OImDSgqnyLx(H+gWQ_Rubf=d-Ua=1F8k=Re)}@^;1h z;MT`)N+zjpP8N0F8DG5}hLiEl;=MkZ-46FMNAB6$bl$N&Etwrra+_(kAm5#|qqQWX zS2v#^={Rz&itYhEvYh}0-vE-66!J-}#JnW_gy4LUBMYzvM`*{MHt{oE0=7OLqVMA$ zx7&wx^l%S&7}>b%2KIy`ltAJ#m!QoMDY;Rquh({s(+$B4TnHg}PnTtv0MT$w?E(?4 zXl?YeU&|l8UXyYJPIZb*6w)M?c>tlef)gjAA2E}5N6dpvd_>f(q^0WD@caHc05$rQ zGI=thp&8-TS5MH&G#OuVfR{&5$-QpH1iZav4zxh;kvREcvp2O%$YR3<;S3D-e&uk} z^)vD#Gq$;&Ljqw)@R8K8x8qOLdNj>e%0gA{ZUGEbYS z74a?8O5gAr%X4^pZE7xs20am4i&$^h&%LJxqcklT&7(*tJX_i#3TuAJ<$*2TnbLt| zNS?3VtIxN|vTL3GWsr`dl>7s;ONEk#%F=t zOgllEo8jwN!{VcmaKaSH-Wivzlg~%os96LPqkAs)-bvN<_mF;x5Mq+9X{4L2=vctE zqSvogz5i?$dvTS&uk5og&@j5ox=%*)-z?-~*�$E>};Wa<@_aT#p%mGO%ir68xy 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 Ms;)}0vX%e;0q%(dV*mgE literal 0 HcmV?d00001