From d63e52c8050027c2df55c871bc80fe8d7406ac21 Mon Sep 17 00:00:00 2001 From: Shafin Date: Tue, 11 Jan 2022 18:58:08 -0500 Subject: [PATCH 1/9] commit dockerfile requirement.txt --- Dockerfile | 9 +++++++++ requirements.txt | 1 + 2 files changed, 10 insertions(+) create mode 100644 Dockerfile create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..77d2c4b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.7 + +COPY . /app + +WORKDIR /app + +RUN pip install -r requirements.txt + +CMD ["python","web.py"] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4a5cb4c --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +Flask==0.12 From 5895a6169dad4e826a04808eef04b4a2fffe6ed1 Mon Sep 17 00:00:00 2001 From: Shafin Date: Wed, 12 Jan 2022 00:05:04 -0500 Subject: [PATCH 2/9] adding docker file and requirements --- Dockerfile | 10 +++------- web.py | 2 +- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 77d2c4b..50c5378 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,5 @@ FROM python:3.7 - -COPY . /app - -WORKDIR /app - -RUN pip install -r requirements.txt - +COPY . . +RUN pip install --no-cache-dir -r requirements.txt +EXPOSE 5000 CMD ["python","web.py"] diff --git a/web.py b/web.py index 9e772ec..a56c2ef 100644 --- a/web.py +++ b/web.py @@ -6,4 +6,4 @@ def main(): return render_template('index.html') if __name__ == "__main__": - app.run(host="localhost", port=8080, debug=True) \ No newline at end of file + app.run(host='0.0.0.0') From d2985ea3d84579ccad8f4d821a6c1d007060c0ad Mon Sep 17 00:00:00 2001 From: Shafin Date: Wed, 12 Jan 2022 00:06:30 -0500 Subject: [PATCH 3/9] adding steps --- steps.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 steps.txt diff --git a/steps.txt b/steps.txt new file mode 100644 index 0000000..16480ad --- /dev/null +++ b/steps.txt @@ -0,0 +1,2 @@ +docker build -t web . +docker run --name mycontainer -p 5000:5000 -d web From e8535b06605366798cfbd792f72a5492d0667624 Mon Sep 17 00:00:00 2001 From: Shafin Ahsan <90466433+shafcloud@users.noreply.github.com> Date: Thu, 3 Mar 2022 01:39:33 -0500 Subject: [PATCH 4/9] Update README.md --- README.md | 86 ++++++++++++------------------------------------------- 1 file changed, 19 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 7839529..2eabb88 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,22 @@ -# SBA Kubernetes Cluster -* **Objective** - Create a CI/CD Pipeline that builds an image from github and deploys it to a kubernetes cluster -* **Purpose** - To demonstrate container orchestration skillset - - - -## Software Used in This Project +# Components * Git CLI + * Used to commit and push code to remote code repository * Docker + * Used to create image of the code build +* DockerHub + * Used to store docker image that is built * minikube -* kubectl -* Python - * Flask - * Jenkins - -## Instructions -* Fork and clone this project locally. -* Create a respective `requirements.txt` to download any `pip` dependencies for this python project. - * Ensure you `push` the newly created file: `requirements.txt` -* Create a `Dockerfile` to build the image. Push it to github -* Build the image -* Push image to one of your repos on [Dockerhub](https://hub.docker.com/). -* Create a `kubernetes.yml` which will pull the aforementioned Dockerhub image and create 3 running copies of it. -* Use the `kubernetes.yml` to launch your application. Push this file to your github repo as well. If possible have jenkins start the app by this method. -* Write and run a script to determine the state of your kubernetes cluster including the information about the services, pods, nodes, ip addresses, etc. - * upload script to github `kubernetes-cluster-information.sh` - * run script and redirect the output of the `kuberenetes-cluster-information.sh` to `kuberenetes-cluster-information-output` - * push the script output to your github repo - - -### How to Download - -#### Part 1 - Forking the Project -* To _fork_ the project, click the `Fork` button located at the top right of the project. - - -#### Part 2 - Navigating to _forked_ Repository -* Navigate to your github profile to find the _newly forked repository_. -* Copy the URL of the project to the clipboard. - -#### Part 3 - Cloning _forked_ repository -* Clone the repository from **your account** into the directory where you keep projects e.g. ~/projects - * clone the project by executing the following command: - * `git clone https://github.com/MYUSERNAME/NAMEOFPROJECT` - -## How to run this -* Upon executing `python web.py`, navigate to `localhost:8080` to view the webpage. - - - - -## Grading SBA (1100 pts total) - Points Breakdown - - * 150 pushed a requirements.txt file to their repo - * 150 built the new image w/jenkins - * 150 pushed Dockerfile to repo - * 150 Pushed built image to dockerhub - * 150 deployed image to k8s cluster - * 150 screenshot showing their browser with the spinning flasks - * 150 script+output to show k8s cluster status, 400 points if output shows correct functioning(e.g. pods, nodes, deployments, etc... of app) output+script pushed to github - * 50 submitted pull request with all their changes - - -## How to Submit - -#### Submitting assignment -* from the browser, navigate to the _forked_ project from **your** github account. -* click the `Pull Requests` tab. -* select `New Pull Request` + * Used to spawn kubernetes nodes +* Python - Flask + * Used to run the web application +* Jenkins + * Used to create continuous integration and delivery build pipeline. This runs the docker commands to build the image and upload to DockerHub +* Terraform + * Used to deploy kubernetes cluster onto the cloud (ex. AWS) + +# Monitoring +* Monitoring is done using the ELK stack and Metricbeat: + * Metricbeat - collects monitoring metrics such as CPU/Memory/Disk usage and feeds data to Logstash + * Elasticsearch - used to index log data and make it queryable + * Logstash - used for collect log data, enrich it, and send it to Elasticsearch. Sends email alerts if thresholds are breached for CPU usage + * Kibana - used to visualize log data and provide a front end graphical user interface for the user to search through logs From 4dba1e6c9d57d477b79956b667034c1fb7b5787d Mon Sep 17 00:00:00 2001 From: Shafin Ahsan <90466433+shafcloud@users.noreply.github.com> Date: Thu, 3 Mar 2022 01:40:07 -0500 Subject: [PATCH 5/9] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 2eabb88..7562194 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,22 @@ # Components * Git CLI - * Used to commit and push code to remote code repository +** Used to commit and push code to remote code repository * Docker - * Used to create image of the code build +** Used to create image of the code build * DockerHub - * Used to store docker image that is built +** Used to store docker image that is built * minikube - * Used to spawn kubernetes nodes +** Used to spawn kubernetes nodes * Python - Flask - * Used to run the web application +** Used to run the web application * Jenkins - * Used to create continuous integration and delivery build pipeline. This runs the docker commands to build the image and upload to DockerHub +** Used to create continuous integration and delivery build pipeline. This runs the docker commands to build the image and upload to DockerHub * Terraform - * Used to deploy kubernetes cluster onto the cloud (ex. AWS) +** Used to deploy kubernetes cluster onto the cloud (ex. AWS) # Monitoring * Monitoring is done using the ELK stack and Metricbeat: - * Metricbeat - collects monitoring metrics such as CPU/Memory/Disk usage and feeds data to Logstash - * Elasticsearch - used to index log data and make it queryable - * Logstash - used for collect log data, enrich it, and send it to Elasticsearch. Sends email alerts if thresholds are breached for CPU usage - * Kibana - used to visualize log data and provide a front end graphical user interface for the user to search through logs +** Metricbeat - collects monitoring metrics such as CPU/Memory/Disk usage and feeds data to Logstash +** Elasticsearch - used to index log data and make it queryable +** Logstash - used for collect log data, enrich it, and send it to Elasticsearch. Sends email alerts if thresholds are breached for CPU usage +** Kibana - used to visualize log data and provide a front end graphical user interface for the user to search through logs From 938d5486238c1c122f098a011bb41326fd784ded Mon Sep 17 00:00:00 2001 From: Shafin Ahsan <90466433+shafcloud@users.noreply.github.com> Date: Thu, 3 Mar 2022 01:41:08 -0500 Subject: [PATCH 6/9] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7562194..3486203 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Components * Git CLI -** Used to commit and push code to remote code repository + * Used to commit and push code to remote code repository * Docker -** Used to create image of the code build + * Used to create image of the code build * DockerHub -** Used to store docker image that is built + * Used to store docker image that is built * minikube ** Used to spawn kubernetes nodes * Python - Flask From 43c9a63bf6e012317962d7920e3d868db75440a9 Mon Sep 17 00:00:00 2001 From: Shafin Ahsan <90466433+shafcloud@users.noreply.github.com> Date: Thu, 3 Mar 2022 01:42:42 -0500 Subject: [PATCH 7/9] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3486203..bf00e51 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,17 @@ * DockerHub * Used to store docker image that is built * minikube -** Used to spawn kubernetes nodes + * Used to spawn kubernetes nodes * Python - Flask -** Used to run the web application + * Used to run the web application * Jenkins -** Used to create continuous integration and delivery build pipeline. This runs the docker commands to build the image and upload to DockerHub + * Used to create continuous integration and delivery build pipeline. This runs the docker commands to build the image and upload to DockerHub * Terraform -** Used to deploy kubernetes cluster onto the cloud (ex. AWS) + * Used to deploy kubernetes cluster onto the cloud (ex. AWS) # Monitoring * Monitoring is done using the ELK stack and Metricbeat: -** Metricbeat - collects monitoring metrics such as CPU/Memory/Disk usage and feeds data to Logstash -** Elasticsearch - used to index log data and make it queryable -** Logstash - used for collect log data, enrich it, and send it to Elasticsearch. Sends email alerts if thresholds are breached for CPU usage -** Kibana - used to visualize log data and provide a front end graphical user interface for the user to search through logs + * Metricbeat - collects monitoring metrics such as CPU/Memory/Disk usage and feeds data to Logstash + * Elasticsearch - used to index log data and make it queryable + * Logstash - used for collect log data, enrich it, and send it to Elasticsearch. Sends email alerts if thresholds are breached for CPU usage + * Kibana - used to visualize log data and provide a front end graphical user interface for the user to search through logs From 62a3d0c129d30076a18b471e88805269d112bb1e Mon Sep 17 00:00:00 2001 From: Shafin Ahsan <90466433+shafcloud@users.noreply.github.com> Date: Thu, 3 Mar 2022 01:43:33 -0500 Subject: [PATCH 8/9] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bf00e51..1fe9aff 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # Components -* Git CLI +* Git CLI * Used to commit and push code to remote code repository -* Docker +* Docker * Used to create image of the code build * DockerHub * Used to store docker image that is built -* minikube +* minikube * Used to spawn kubernetes nodes -* Python - Flask +* Python - Flask * Used to run the web application * Jenkins * Used to create continuous integration and delivery build pipeline. This runs the docker commands to build the image and upload to DockerHub From eac52a14cd7eed70a9415c657d06e675864dbb4c Mon Sep 17 00:00:00 2001 From: Shafin Ahsan <90466433+shafcloud@users.noreply.github.com> Date: Thu, 3 Mar 2022 01:48:41 -0500 Subject: [PATCH 9/9] upload diagram --- CI_CD_diagram.pdf | Bin 0 -> 24163 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CI_CD_diagram.pdf diff --git a/CI_CD_diagram.pdf b/CI_CD_diagram.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f98de6e6172c4efff372438298effe4d58246ea2 GIT binary patch literal 24163 zcmagGQ;=ps(=FV#ZFAbT?e3?0+O}=mHm7adwrzXbw$8lo|3!Q!;#~X}RXZ{(bJxYL z*tIGv)*@FF6{lmO=YSy}@E-^m2pkB4VIpEAvNN=V;pJse@vt{xP&6n`4J&anHW;k%@ccPTc8oS?KYo9ye$Bl#V@pU zu+hKFwPT)vPMnySsx;7l^Bb#t|M~f{3;TK76nH(9^6)Fd^?Tdw{TbcQ z{XS#x`?>J@+BA4S_2d6M?fqigex2<7ym%BSp?tgfkqh(t5IAcUke80Q;Ck2YOVpcG*#9N)Hf6>81t|N3__4V@eAn0+ zdXiDzQRyX95J-#VsiB|`J8aNYRC;w3i!sNJ|EB2W|VG3HHD%2a(p1Cy)ES1^UKcrac_LR z#EZlKvQRyvyqeW7#<42Dq+KLa+mYd$Z+Glu*P|!JjiyiD$Xk?q%(e;{qcO6$u4Z-| zksvNgQbh|J4R$9c4#L0nm@>2o9K2^*L7(8|Z|UZQSxQXybyxg<3~;%s^%1pIS)X=O#GEFwLO_Dc(w0u6)d zIn6_vGp%)svqw08AYHoXi(DnLapcW$dVzD^iLDNF|3a?&k6SDtGstR`$Y4KNNHgoY zLEU!ERm%PJ~gA37o29$wXG83p~vX+es@X^rXrcAxc?yJh)F@`-(8G9nO}SI-+7D+=W&snpM$aJi=P*f#tl z`DGj+q~QUhtjt%Qp5oG#I$IiPd8`=U1YBqe-^LEHVHB%<{(0s1bA02+_gOl)`~4-* zLILl!Q)IAIWU#8uN0}mf5T)oF7;C1?ml~v?Rf=vYjnk?iD^|u@$lQ#lmVffNT8a_S zkRe^omLZ+^N|GEd$}FKkg(`L28zNoo&-@vf#2`7nP=$E!vNh;M{}t+4u(A_qb;>>U43#ea6CRevf?9la!`dVBt>xus`O%3V#X{a5-@8xOre!Nb@H_53 zQ2OZ!vn@pC!DOc^$19Kz>en=_h0?*t+aDP{83n^FIy%9&Fb9E$6y+p@Xd?DOXLj1 zETEx$&#x-)CE*^hBsBcKG032e*kBfVZDH5y;)pHn%5Z>LHyGjL-kQz!oIR|r)!YKm zF(?k|TX8Ws%;gqcih<_tWs+A&lP>Cf)9)M%>8|OMAe(^T3W|8ge5C0L@?mkO%%+Fi zyyRBu06;<&K<%QgToI#Gzpd^U*~5I{hIFo}a;?m|c}P%G#15RIn=E-`JT2NXhX>>; zEqpKhdT1Y=lU4gJK{cL$G!zXxd9{!5v zqCAnrm!2^VEVUMyGOqNKPqp8s&hXS!_iC&3FK~wp?kwaD9^8Sh*mXwJpkKI)Tlv=Z zu*fD)&26lyMu&TOJ_ui)!go@DnWmeBcbzXvO>bT^%Kb7MD*iExJHQvCSB$J}d$)-G z+3j3c{!I9aJgf%6O}JkFrcpCiHx=<}L+C-mM(Qf;TK*p?;|FkKFF4NR`!_n`g#wgI z@=m5P5xFJ=HX#=IvLcYFkYDV6exV1ak`{6Y*p`;meo0FG&(X8!+je2BS!?~=@D8rw zjUw4!JqMQ^E}-cvniu8-Dg3u`Y5bV1KyHkvsdU(}$qwG#!oUkkJ=fsp-byn0iVMwv zG})RC)x@E^*w9we8xB$iq=b>u`4(k}9_&`Nlu&k&W^Jrr2{qpM6_)ihq4H}tb9L<& z#wv|WHj&KpOYFZw*q+vSZo6&w7n|4VQ9b2=Qh_VAh&Ln72!>#x&(eySw14r48(nE) zqMra^w$NfI44MflWeZsPrnybTD=bfv@jYrO?x=sK)b4`xwj@vCD zg=a570nifoAT&MvRY0>^ZE9k8TB-t3raP^xzq_iJ|AfVH)obbo$K`B&BfQeo=Z2WT ze7gVszS%zph9~*ef{bl>()iQDIB|wP@!v9;eAVt*k^n>N5sgK?15r~sD*X9U zSh49lKZ}k`!QF2rJ5>az?XB@!j2LEz!aiknDE`|~zR&rWJkBm#_eHN93;v{IeR$?_ zGQe`hB)9S~>AxGBOH=>*{$KVWOv;rDBf=;%ir#gY`YoDI}6EPys@RCeTrT+cOoPDyGw$TV9!6o%p zVrg2zkaNkF<6lg(&Nf+w%mq3ST?b_(l+zGR4fF3bVsr7K+rSrd+*8o$`+pdl&z$>q zreC2N@B3F69|54~C)~YCO&c`u&)#F6c~tTtri&&v0;|Cs?pJE}nuHx&@j>glEb+s0 z91r=(QgOmB$u25wVN+7GZ?VwaLXRYDL8Nc3qW-0pi%PbON`G_(Vbu5GOsLjvNM)jV zB<_Qx8<@RaWaRRxT|;&8E1FZD|4drCI9y+}_OJIQ zHsYe5$RFPj)C-I}tGxK2SZ*{gNF>b}P36d@!cM)=08KiJtl=cwgAvwbeltoy*&`!{ zH5(%~A~BnQq;eOD8PLIMRhB@Gmea&V$pQQBV9U_x(PzgAgVik;8w^*W)a<*I7-X%1 z7z9?$Y4%j1{G!8O@Et5^xy6=o$^qAEZ2+S6SwyCj;HYZdvnFEQ<(I$3OQeGWliIQ# za8Wad<(8do`@@H2-Qyap5k6?T0$FSa@-DQqXu+6%*Y1kWh^= zUzwl^8_N#8uQSbEGn)~->VeHJy47{lt*w6H_%lhNR3sMwjw!+~Kz7!wVyL?wIr<;D zwz*VoGfRuLlll?5jBv(ebwN44PzwW*_~R=WYW%Ifc@hLP{7*0Km_0OAgIcsx>@&hO z)nSI9K_oUyOG3;+*6AhX9IOEjPq;<;XS3ng3|pn$RZ@|^**&U%wPkbb2{3G!-wk*9 z0e1nqxo zh%qtqBp8S>C$HjyzNtGQ=Yf7G)^J0x6_!LM*#i7fn})(?hhRQl(jNDVJ_(P$RwcXar4Jaf8 zaICmOZ4Z!`z2iQlKdQSXSxviEL9j!!aP!R7YA3@e#i4*yOsQi0orNjij!$HA zb1rQ2CJ_+>>3`Cf+)%L=Y0x0fMl?UNsSAp!2n<&Nn}N2s2B=J}PNgnJ7~e%2ZO<{M zQnyxjp+f!bC|Z>Y&!N2|x>7gB-_3Q=$Up4({EXjp)PMObZe>BKJboVn_fv2S!{^f= zqJgvxSx^{}hvZwS>2x_$rY(z!R8I}DPv+>_b<5+1L^)+3Q?hnMPCMAhP1_{xi6LeQ z)g&V{^zx1sV7dEZ6_COU>03@}Q|nmeYgcN5Ou9TZ9sYy8&y>9v*vARQLgLq>CKl?l z3es)FXuKtg@#-40_L*}CW)5y+(U3flFi}k7vv|?stjo>aIaShz^m9BzKDHK=l{Gf= zJ#{T1pyx0Ajy7TM$>OY&aOOM)9IuAwXEzCpg>PG>Cy$cLXIQyz!gVV~{$%XC(19Td zEx)Sm_ux|`DrdAZo{tN71&tV3-mC4PPjLe&uu4$5$luBmTdIYLUnm&x-!Bw4Dzs1C z3sOi_dMh9mI=~*(^6=4ZNWA2)*!(|$h77m+eUBjGtt2y*kg#B+^Y222}A@# z=$aaMzlPtYGidP^{X4Ph?T+df2%Q?CbD|BHK*ssNXkj=`bG*y?9 zn&wcXLk%d4sWqh>W+KzXJb|Hf&#JhoJQ|cphgCp{l`$FFHJGfry;sIuC|Dd!`t6a{ zfY;vkoIK6yL*_WGVa~?ykYjyevoc1MU^b+{|K2z~$9t{3OXCnhyW;lxfq(K-a zTFHb*tds<#yJu%DCg(57h(xq#{mGs=xjlVB{ka1q3XG`WQd080lIQa0FSY+EzgpKC z=y}$;F>&fiGrKzWxI5ko$(~^JlTk1r8dk=7B`Y6ZMJ3e*2cS=Q6}2en@^Z-zM$HNkU28s1%TAx&=m0qytdoDC4H z?Pw!Gz9!8Dy<@4is(W*DN1!q{JQPjTzFZjKOUN#oj3)fWj4JPr&QrgS3h8f;*wG>O z%QPmuUzr)q&>-vmx<#da!{}j|{e9eRIu)ZunG{&W?P7+Q9Pk(4dmopY!uB78@&YH*#9M6vh8d%@u0M?|1V%aK}iKQWMSs^iQCq5 zgmIx-DW&Dj*~P*1e75291oKogr9`z;L}HW|_u&%uWPO8cHq`En$w#I<)E9~clhJo& zdx!0Y#dWmM;qOds>as#!gf^;n-d{fZo5nd&?7-rx9A)!@OJe3&^y<<%(Uj6EOJE){ z{zY}H9YHiFu3Si^A%vFx(=F73G6y0K1UKO59z)WZ!f8739jk!+S;{j>$@WwjI%15r z;sz627WF<^aUiEWQWh)MfsPPce#=0Zy|rM65Q!3QvKC}U*4tPBSnA`zx;nSMTTNF_ z?Du$uT&dmb#bqRAYEqBL>PQCp?#)!955zHSm^SUHh*;X&IWZ<>YwsX6^5}3FnNF3m zdNK6wPdqGY+EU(9#hX3ceC9<$;iTgQF{TtjoQ$cUZwIPAvNf5$a~@Yeo2JT^>9znV z1tB#xQXM^xevf9lB7_uu9jc&fnpu37{3|GPv-tolL`@XHGV5t_NyFRn0&KZyM6}eB zIRjoyHi$x2G48}MRE4SMD*9_>v&P1|$kwp$c3YXlWx{~e>~47pCC45odN@Utpnt~t`xqK_7 zO8~#pCFHH^*Z~(4k@xjHGO5+tswsSyS6t!R`-OPNw}Ra2t_Rlem;?>om&2QRlJz1f zuyCOo58L{j5eA5} zxpDfz6T6ETvll;~DFd${P*62L6{|T*Jh=D%`BEO5P!RG%x>DC&ys})Ud4?#Ay+>OO z)M=^UELmmOD2Ql5D!E}3N0!oCo#;w76#uLsa}U0JgS_mZtKj76 z{pQM9gEoYlsE}!7Q2f$%#R!K?JQdhqnTk87Y_n33#Q~ktA&()K)w=4l<~HRI51|`` zRJtF=sr(k82~tc*849{^qOmpbqBG6q0b@lqU?it^?bX3PS3JX$)s0f*YfXWxIqvPq zp1i_whpm2CI<^mXA)spo?%>zR#Bd8h60f{_NT;ohqV>O^Qe zKW$tER>QYn&d-8tJ6Bjoe_og0_Sm#g*(_&TL4nVVIf(!QWBV|);kO(vs)b>KRzw#? zQF$Pyr3r`I)=sGltYj6Itrz4)HIRoI;JZ^Nb_9-Kw3#o9h4#Fcp}6OfM~F7qmQ}uJ zfrcp{XR0q)uqHPYpEyZ9;Sbj>*q&c#gHn%;3lTM!Iov?QR||;dMyg-gXecHKuBJm5 z<{4^m^QN;w=dAEvV#&i{DLNzS?UAArt>&PsNTSU}Pt~oQztYzDQI}WLQt~Zn z*y7{dXX}-HV#Tz&&>qLd37FKu(PM2sx?(O0VdvL0r1buo;FQeSOpj&$nY=<3e7y3EdLZT$X z#wJK;H@24-VvgDFehdjTzMsv%ySR9w$QXeBb56@CPPVNI^sZ<>MbcOdF13S>*Z2tk zu#E)M|D;i-unw1D2D)kp^sR|bK224YE&TPn{?0&dR7Md5-wm#mwmh{phZ(4(e35Hd zB8%(yQ!$4V48ZU3d3A^-(oct`cr3VC+b#h*P`U^eu<5y(9GN46hJ*iw9uIZkX8+4Z z1KDsmsR0B#Tk^?xV<3k(Qz{oatxVsVS-DG1Al-E{rf14{VGY5h8zb*`7@H8;3j;e7 zbbnn0vs@2oaoE{9sy8Se^*L#I3Td1v6u0RWPwvwuv&-gA|WX@ULSQ5W9YC+L`h7cpT07qsyr%bWMoZ6^s_3U@Bv%GT$qCZF`07_CZAkWK| zQ43bhP+=-lStKHDtOfs^;gyTFWecLEjuS7>^l>gcxZi#mGBS($Na|_L^ful68uPE? z?v?V(R>l-Pp)HXH_Eo09h_TDl^?-f+Qk1UQ(j?IrHm6V{z~wcj-g=wwY^boNq+w~% zcA_#3hFv+W&UDKCQ5)~_ad4BCW9DWcyGos0`4Eiq(A z-pMC2sTCLn#x?WZt6LFK<=SFZ$K5J;qaa?L0 zQ@PNWd5xBeq5RN){{>Ja9P+#4)AIMs*R+jDR2!S9h6|A=qa{%e1}@2sz_vLX#JL;9 zy*N52MyNWWH3rVu+*i`h8F3e9mE0&+s5&RB6dhBe6dkhHmvQt?7l}iu$U31{=Avov zNE@p`bK=e!iliOZql|HXnVJ31I147loi%zb_e)?aLb`#@pYCwV+?-x`@(kl9JBnhX zxY&Tdzn<%M3ZIBUy^5uXDIdBKE^|sZ{kx?S>)qsJ+!A{+1x1aoo0B!j0W*M;gBgf= zR3-MI`3c=9^!9-PRJ3NT?7l2HLj^~@LKNm!-_1UEc=n08%idY?YOcEER6`@G--9mW zH=T2;^WK+H-ZQ;bdebf?%{acz!af0dHrEfnEsPXWOwLsW84$igHk(8dWy2|hPzTWE zU4_lesCFbFLL&jT9BFqw&g=n}gmyC&K(z1CV_`rXGi{$U7&T8HBU-l=^fb=C5pi_Y z^!)IKB{O?fC)0DCrhnh$b09YJG5G;uUKhh_XRqu!%z9k+`{?mj2@B?+;#foVx5Z}g zXiD_xRtm2$(DNJ0%)#7Z&>j_EiUrzS8S)Ek9F3(!fVHPN@Ve=07yrMh^VqQ2xeXB~ z=26{PV+4NZl7}ypT)~~(E}RBE?7S3LR`@*)gwZ3?T@{laoWZ#aXugS>j4v|JgBHF) z<3qZP8Ewz$Z$uK<(@DsbIAtaiqiHt+seEG;i>d!P^hv!WQEoT)!=O0TWo!*VSdsbgUa z%_(QPoI}UF%UD}0R=t_p$8yqkt@$ohFXk^jKcxjk!G|5oJV5h#g zl#k3zxpy};7JYJWZq+bX^&i94pQ~$8<# z^tI;tEWHFlZLp=gSyjN{<2#^m)O9ZI^=vNg)y}!i_3fYufpMTPJ3QJUaMT%w8?(23 zoo7F45pdM)!VRSY4-F9`9)|5HWk44|#H`ipWB`&eA=Up7IE&&E31{`Olr~`3wonJ{ zqkJZ0*qX}Pj-Q`a~`ybtP8({06OQYUifnzSTmo$ zIE$KbSB}!Vq4t|n>+Hi&GOXkA_xZvChu}@4{OLrP*EP10ug~%)K+2@-P(TFVE$2|m zWv&tb*H*A5&HQM2vF8%fAO-vqHV_rKs}0*A1QgF(=qrG6irG-TN1ZKN<>{4G7MSsL z;u!G9gTBQ8S;k*n-5;gD(>pTi*HVJf5iNY5XEYKI4)rCmZ~>obJ{u;^qdavXL%8d0 zSM7m^(=O1LK2sg$BqwWvyj&5gHD@d>-%{VGgRw<#3cD^NVd#o(|AG)D}(*0q*bO~108yDSPJvWQDm2D zJD`l{dG!n9Xp6szN-N&V3fvmnGA1N5g?sVtvq!y7uXu)i*)%~V#dn5I@jMaytp(+| z`DV%eug}aRHaWX@?%l2J86lgr2{`ZgT=C_vT!{k-7^}=B2nOK7iBAlYNYu$eURM9d zK5{S*#q4Q!0^ZOTeh)SN{%DT|+WM!xw~$Wml{U19BcK{x`p4eeF*yU#cw6VAlMB7|`>^*(N;CJ)`r09RDNYd3+x7j$%|x0lfX) z8Dw9Qi5K`!p1Z+v@)5h|yDm7FWw0)q}K{+ITW z&K}_R{*q3vM~%dEsl?K3NJAp9*)1^dGF}C0?Ks%dH;J@g5V}&aYx#!DH=^33Yr%X{93NCsd@fQ`S?a;dm`3xzQ6zXLTsgaEJcZ zy;nO@X9W}U3Y-GJ-R!qp{StS&Wi+PJ88p?5Q=e(3Vf7yx_&&rYU53n8W zK&}2oTxA?_$r}ypdis5zTF-a*5cJYAWbf&ig@AuO>D<=Dh*Dw$?RhImOvJxwHHxse$jd^6+=GV_ulwlddC~`8>nC^(}z3k}qTjgGc%P-B}Hg4}mG&o$ROL!+P`#}`9{W0eF) zzwKgAkOTNh=5Vbh%+~wDdL2B`{0{lOss-#+nig@rs!OcV4_2yb4a2vS^SJb2l`fmp zSb7c?Yna+BeN~y-zBM{ladm&7yso_St)|($u7rJWv;w>s(I06 zhpWz;JyPS?uBc9f&o^Tp16yuxZLYS0&C3w6BGaG}XUBW1NNuX-$9o~i`XEIS7b8-C zNas-v?&1iMrU)UlI;w= zH4aaHOLOuI@(_J`q6~61V`3r|g6~?4^IWM&g#d6ik*ctyvhhOdx~yJj{56(*t%2zL zAm$v0lJNLxu@D2G@B{UeqW7EAiO1FHYPJQ5IKRN9oM5;KKUt|DW#0nsEy>GP7|my{9hy z11jdG()R%T!Fl#P&Khm{v}ahON}Z3Cd^<~r6!Wbo+1YJ8Je7=vXEzBvddR%DNUHB~ z_zyx>UtAOPE0(9}U>!7ER-cy*h|K8{E_;9hYTGbHo$E}a0jfJ%R$sX=dM_`V$Dcnk zrmzkK1Mh{<7e>YWf2FUc4YzDybq?lD@g-chGq|2X%Rxgww~hJFWINetwM&`jPBq#F#wdO5pcda_Syu%XQP3qwt|Z)a zf@7TqAoPB?du**&p}tTif-jU%mvJO6633*ElIq|vGNfIhsbvy&RX=XPR|!f4EIOPO z*o2huM!jq}I^cieuiY08g}y?;?JVDCfU@6&@9i%*fH~ROJ=R$qoOE3|HbzRBz z#jKcyi+gnb^%@dXrOqyk6#mG#q2%99r(| zwO378pyG6&S{*nS(x2=fxmx~OBE{Bob^pL)uQ$RWG2Z@@RF`V^4fziFz2FB{$;%){`-7oQ0``Ty`iy;lZLexgXl zMbi1o3<9C+xu|T2u28a5ysG^wC+5xRfj7Wb+Gr91K;Td_$s?zEo1?8 zqA1J0=lq36tP4M}c9p`J3+<{+IW~b(FU4$UiFnm^q~=2h-cfQ^VKC+e9&TF1Cwx}# z>0-kcQc@}e$=I8$CP=vxR>FJxDhIm8MFik|&AA0F*VQqrrvcBX#yk@`0qvZn)D0Zi z$(8x2Rc!^?Zd22*C&u!Xl@gO$PzT0%_VhV>}aS~LK*&QJjHn&F2N}ogRhU;K~x7H(Zjk1ne zJ?ql*5pZR-+t<4Ym95FVZDvM*SCAyKmT+}8|7Df~)oFll{SR5J^#2E0tn|+WeYQ>6 zTb|QgN-vdj-U1L)PN_qjY%J3w=$C&hNL!3%*4maW=VZ6)Z^CxV{fyY4W-*+xhT-kW zR81$r3w{)?TLzPi1MfIb*gjaBkzD2SkPmL5cVTDgd^dy5s@X4#lLh;Vk1*hJG#?fQ zTeFf7%b)s7LY0GP;oBQETE;TpvzTI|L@=FqUnVJeF#8w|{4v0bziQp)q1I91;;yFb ze{gtNnWe9el(iTfToiKx6H}cK!MPDz24dGgK~3T~5LelV2yoUpWMhm61%2~{E4l!h zgY&qkJfdT|iR-RDLo)Le4hutgalsmEw+ar`C|s;cc&=xdZBPAh=#G1{sybrO8sCO! z%-`^hw)9FnI`w$lvatDq0k$JeIGA;Oe5L^4r60r%qP-N`;g(igLS8Ds?$}vYR~T}2 zJ}9s$`7~@IaW|~-wRjj^@uFHY&bl$q`Vg(jm@S2|U#*dB-Uy?OAF$v#5)*0zRz(3( zu#RT(!sNB(A`m`-nV8Bur_ChoA)0}h zl4XE5*avMZzFC?77Ugp#>0Y2GCSO-JL<(~JH4XDki)Y|gE}g!b+{~nMnrRya6{PC< z((cQ*RsUVL<^*c`93XjQf8I4;ejr5C+FN$UBanc802X}R=DJ8#u0Y2AR^3< z6GK$EcsdJA2sZP#VH^Hu@Tp(h?_Yvq_5XGP@;f+XD*={YrrcYC%?K(Ng3aH-DZGl+ zZmKqr6~9vg0xa=kcSfBb{|)_{AmqQn_$M&|mVEr24_hIYIwi1WD^H&hwZ1cuGa!2} z&qJ$M+g76`H4%2;8V8lLQYwvs){6{p)Y?LI`?d6Z_XVP3vtwEoo2|6c^bY0~+6PlA z?b){z!G?1NnKQis7__0M=frjV4gyY4t6-m~DNNNoNooq} z`FvoV+`o{H?^#@+_~uw(Fi^bEZ8E&>6o2x}cx>SG!9((6*G50UT-6PmsxhmE`{ zs;T<*Br0m?Y%cq+`uOqrR@;oJ5j=xI!PQ9iDk5^oliQl-QzVJ6p$zJ#xfFVJ)#XIc z5D5pcoY)h=KzoMd06yVjsxg_kCO#?C23mH!SQ&osH>|3R+H{0>l%!l~7~XU>x-~_k z@a9d$cVkWl>dV@;i%R!zoMZ5GNUBjqc_MNEu4z1j8i(rK%WwOts4#WRerIUjD-d_O zJ>{dV(z%;?XIJtj%P2^`txT$UdlTMOaz~r`uNm+Yi`gN2kpKyWiEzu>`@!NQ;@&wJ zYA1pyw}Edr(>s19_2ZG)m~+gwZ57umQXU&qc@m@RwySc{s+0WYfN#fs!@rVqm%=a- zRN?5*x`~$U0o#D3!-``f+Ccv2yz?TcqK43;U-|)Sjy{%Uu(*wueSCKj!6VW#=;{9O znjQ8yLq}Gm9QZ_`B$=5@2!t>u`jBXUto7+sXwYoJ5VWJX)vchk*^wFviB~>>@6;7ZU`WG~E_eCzl;29vKrGIF%WZb3~3S>Ti zXv1g`u_UjCf*5E$Pg`+5#vDOkP`3;U99zF1b!N=I$436x_iVvxZ{3@O-~LJvaTJ~U zt>OivN_V+UQa?D1c$V|+t5c9(#X1KI?vFpSk)d$_eo8E(0z(5~Dw64Qw(7h2Z5y1mK z45BEZ)b#lsYjI)*c1CQFKfezJ)%vwKR_V!EDP}_aQRyO!5wZB_#fgh1>!pjwPP91e z&SlI#@v4fE%yg}aU}Wvem<8kN{H*#SopY66PPD0?)^SF{McNAqe{WrxYFh8v{l$Y_&Kz-wsE>nuWOfl6N)1^lczV^Uwy zU*JB=Ui=F5XD4-jXbNvh!h{Ev;F;T<>oZ7Pn=9Ae`Aw6W^gE346+fik=M~Y5;AdYp zYnis_YKoBAEg96e)P#7R0=P0fsCAipJT+x9OU47+_GDL0UzxmI?=Qo(r&~Mhwn=Tj z$rRdRFXkQd@v}?Wc$H$((79YslCEl5gjF8J8@E(eCGW2xZ)b0s>i!h5aq_J?N9eK$ zZFzSSVW!hOiW*$T2g&N&8?Y&3u=@3gbO$M1`;0g-Q1ER^;zJ*A47? zApl+uai~4MTZ`>`=9|Fb84GYAuVpy2zH15eSLdOMp0yiUd6m^1RoN{_q`{7?$Iki- zo_FASNIV(K->#7#uh1nJ7!x1 zj?nN`B4Xd_6b}z&<_cv-w@7+p>23ufX+ov)}G!%Fc+P_sPY$*P^FW z3$0`=2n!b8_!E7B|BEdBuM#e$Dh+kzSkOiSL)-IErHmg`taN-A-+3SncMo%TX#;5lQ6dVkheF?^16)10#cWR&F7*z6soJPN_ zn8_qb-B8FLxXdlf-H@nw?fEtuC7!fQeY#)ZL#GvD$xtZ zuYQA4^!3&AIARuGU=C765_O@drqe$FG@ET6j-ZIdBF==EWiBTqgXY0lrnDzjpv2xY zEwMdOz;`mU0wgHlfOh3R@!g=Igpno|FgVS}O1~L^fOhMy`1ze=iEs>?f zyb=1bKF4oT_CE{X;cJN*4zw{A7a^`!+IOycZeLrTWof;31w{ad*|}GzJXWeK7uxt& z4C<0G2Sukqy2{iZ^@Hf-f%#MgTlr|$$gJP+BAf-SJ@bZqXv#uveiK-K7^l~D(6-Zt zq!$w}T|y*=9jf$fW4)`01R94^ew9RztpCll%yt#M6HUZ?PsJSgvO9O7)x zb%pC^+|bH~Xdrx*3lbU+YpY&c*sDDbH8SzJnmCW1#2tKGA9SWxKPK$`@;iD+p8pST z?tf@-|HGhT`+pd8%*-sT|9=EJEiJ1}Ni^S=+Vr##G)pm-!g+9MVuuFu0AV8A-1mc# z$iiwmTnz;H$I+WDGCfvqiP#pKfm9!=%LvxfkD0G%*$9RoT)@}twxK;gfju)lL}_cK zl>AON&lhJ$2hroBweBD7qPR2fcIl|6te2bdw_$TZK0Sf5@8WDvVr&T7TSI1DIQgHG zU~yfvgu5@nuX%TF&USZ^k)O*bs)vH1$i))Qy927G0}1tLUOu}>P=zy)UD1$=WsbJt zjKK0qASpM@69zhl2QCJt*;NPbSCf#yB++DQdy}~?#$@|s8Snm|_&W-P7|p}0#!V|8 zaaqb*8z1fqbUQBEmJ<##b%f_>!eF>lGqBS_U+z@7`oA;uj_irkv;v{QnYs9oTQ41o zUfWlT9kQ55ljC7kpZ6oj&H;oTvWXKJ(H-mnJN!&#hMIzNXjj~!N+bYsoGzzIQXC-} zdeA~3?`?&oJ09uYBy`mgWEjR)ltycx5LSFB3sF-ETR43?aVwGJ1 zCc)*4nr)Yq1AS;*s%+cS1ZJb&o8rY4%wi%`-0Ws7 zWk0|n)MQ}j4LkaZT62P6ii`Mu+r|&&N!{TW2_cZWb0a%ylI!qfVCz{T1LYy*%Z(c@ zk64TRx}|Tev~IB$34{}?<7C1#Q?Vef+g5YJ8wGaV8{$XDk}vxBWAXZ2{&-`LVrE&6 z?di!4#BNMD6g{@kSfDu5EN$~!eP!{9aZQnui!1@uA~WCUIz0w!C~z4x%r@4Vyryn5 zQk;p+$}_=2NGihzuiwqPbHSI4NZdCaU?+2VO+-8tv0yZ8^@{V%#`Wj?-yFpwc`bRs zt493VmIrfcA(Htjf3h2;->nsWbkixFw7@V6CnwQ|n9XyFR?S zz+n9&|H=N+P)4pTZA)#8m4M#4J_)2CU_?7@%J?1p#52W8HJY9A1=nsBc~cF3C!CBB zihc%Vl>Ftir5T_Q)a)ZNRyqG;(S`9wajxA3N+wlhVn-( zUy=%9c)Q-a;;JfgXnxDik;EMD(;lHHk)xi2V$+WNm9MfW1Y3G^yU1f_r&V?>rG9Kx zZaaOB>r)G5_2?-Z$+J)J!evDk_pKB|{TsAWYA(AAvq3Tywa8lx_fuDR%X7^Y%YTto z_!sj^XBrGLFQ)zel>rc;_6Q6J9Cau;>_OFr!Ty$M`38Fz`nIYfg(Nx2<%=b*oS_`$ z;c`(WYc6~bT{=t+gc7>^+xW3@8-tEcO!w5Y(twhShT;fl)OUmx!WGw`36MJ;Pud?MC;Sh(Q8M@Nbp|<{Xt3NJpFC-sUoZpZu+1>bjAq z8;NYv3s7`1-Q{en6-13chl52Moj$bBkWRL@NaeEYgbBA_On9H zLUuy@okXy2Y4^Jha)aM@B>|NvFspQZ7Edg28*T;lipZE1M(O(YdIRP~<-l3HVjhmeG1t!A+b@gS&VTe*!WW@AsJcdE8~o~l1Fa{e zX~eFyW50kL6PDEo2XMVK=l7nW`$=j&%+32s%N3dodNURLOxEdYSMG90KrPCo$N-vf zX;m$BKu&~c_99uoN>3O{AsLYW%EbGkW++*qi$=jLy?}~>8XLcVnGVlcMWesER%ZDq zB-Er{RB2<(prA^6}*qL^9WwQ2hxI>Ac>{((ESRo z6(VRpM4oSi@FuAEz;VIt)7$g5YhszekACqDKKnB3_-SA4Zt-7ak078V+I-Bp`bY8@ z1Q$c}3rXr0`n`XZjF@;z_n9boRDsp+?ZTVO(RJtI@|*`SosiTMT)xXh^hjLl9X5=r-en$%{o*dMNPM}m z951ASI!C=UrSJK{*gos%_*|FDd><5lA=Q(Crf}cZ8vGW`RY)KGL=rH}V-$O-?{d0fUgO zt=+%8|4X}o{a^6^Of78SWFr3W)eMp*)~+Vb7DfgP$}az>lq(Hu;_AYRpCY)nLKR#X zgWAM4OlC3(ivg+xB_N9g#RbHWOdy(#Fp+?QD1w5ZSgnW%h`VTAaD%FdR>Xo9aj6I* zDpjmi+{NAR&O|W5K2{s}k(o1RyLaAu&bc>vPB=j}K_ELJAbLF%ho=&BGmt4G;9!|@ zv@%-OcK@L#g5#(3GRLUo5)+g=eNwr9xLg*c#ZA!f{7L8EeDE?wu1CV~PtN{SOR2DS>SEvcNLQTLGY67lM6L5u^fGgAlT%ji53N-;& zs0p}Yn}92}3AkdLfGf5MxMG`tE4B%^Vw->~wh6dmn}93!XX1*=WCnQ*`%FxIBxeGi zFca{EeI}kh^7k{b)KSjB)ye+hGjTD&Q&jLYrm`V0>Et^z9GW8pCbA4q8MC4g7;#5dFtJoF?ZC={sK{?j z1@l6!1!F3hLn>MuQ-S{&xn7N_2nV9FZwD$1qUsl8D!>61VT`E=M3uqDL|~s<;Ko!I zL{;0yL=FUe=;#&zA{9izD)>-tV+P^e19WdAWGW>e6zX)o3(7)K7J_nF9E8I{8E}w{ zkmGa@0qntt)G{?Lmnm@w*NGHrIqsmANEzhfm1xDdhCW^^mPsI?N=n3lJsu=biX9l_ zo`qcI`iJ63k%nNvlu4C_4wkc2ri4aEMvIgT*awe|QE4R6bOtYh5Qq~AIZ>w6779%Rn?_3J%3JBlu+dAC+HHcO=ScUOIFKXiC*#=Yu1 zm3-NrJhW)OrBCcwZ}UoPM*f7If@bHNDe1?Lt(|DI zc-FSno!+DbDLLXva+~#)v0V>sv|P|M$W39?DF zQZuduL;(m zB{x)qrq{OijLW@cO`pAcCmQMS{UVz+N5;Ok!shf|yx`UhUDq`p*O?(IrmN}0l z&+bt>xTx+yT15}_cLNScXY{-+zPxbKwQf!GZE_w@ADyhV%}E+Cx#G}#ce$v*ymu|_ zf&W?FwVJbob_}LRn)ABttEyet`Jt6hXXQ@zbVT=CY}b7pc|+n)+$L-F`CEt0X5UJ( zqTlJp$XwYfm=fu5Ev@Km2hH};suCVq11tHp^oZa#h#?kS!8OUT;^yPk#aKm1Gmq^hdY z`mokrmoDDAS=ALAeQunfIN|%)>5Xp#zUL#H<;7Q4ooS+_zu3_rzmxZSUCvB1+eKmB zYz6k-widT*dY?$|^u)b;R0H>ih9{wiriWa;_j0C3e%_lYt@(NWZ%%DWs2%p#^JL-L z6S+J=HPJkOaX&s3s1S1A+$bFB_#{sF$KTtU1M6<4&Q`7){H;2*IW<0^v{^8$J1_tF zZNHLd`<6M>_~MTTiB|-N9+^6^;YMTpk<#qCtfH#nvrCqT`kipd+PeP9U8u3j%dfV+ z@Wmv@L*?7!8b=dl#X} z5aBNM5hd4*9RK6#3YN2Ab=nCIr**DtW=;06f%`8t7A_qk_PV~w&2E@~$3&&6KAAN_r~%U z-x{|*_N$uL^RdU(e;i5wQ=ajP^K_y&YhI?+SEuc|kJvV;f9RYf&p)dzZbO@by`EUo z;*$BW{a+Sa0yc$MruvMnhWA{VckcdLq<=){#Ag?==oF#b+yC(k<3s_+`ZEQ!AsSK3 zwz+inL3-}OHL7`I9EHiKGGWI%<=F?V7k7@cbS{DwFJG)#Bk@$s!^%%JKU?B)WBZzc zGwVv<28Q(swb&oFb^GjB+M}a1o^{y|_q+U-RuqPn_jeVX;Vt;?O!(Z3%O+iX{j;54 zt^LiVTe<|kT6D`RwZ)>ws!JBOah!TnynCNf>nDzK4+*|`r)EZK$)?^{0#W6*E(eDl z{MEiVoV-eVaqO4c`=v{3raob6o2CUT>O&h2HtdUheA+ARuQEs1t2Vky%ni>TXZPIk zD6_PGWpm!c)U$AKSYDPzmrZ@T^c?*r{``}Rg#+QZWvjZy$4z)+(>o^fY19UOuVC!A zrKfit@3U|iu1g3-&i$UTXtiL{g+rdgyJ;IezbU5OyQ{msM&d7fvGF@|KkqfodmXFx zM%VpOKQq+PdSYYMnc49xmt?HYx>e?5KhtspBQNgt%cui44o3uDjb6|+_r?C#fsRk^ z{Jm4Y_^o~1H14aSL-zL)>~m%D3%#$jUiN5=z%O6g>~dFXccP0iEkMhn|er;EGz>Z^=E&lV~(>&GrLAm@DQMPu?^-;V* z5u2jc4%iYGRcyV58##F8z0TKP>t>=fwr#mK01Ix2?(h=kYT~2JZK> zMy(T9CJN2Gw>St9DI3x9uJ~EP(aZ6tQ{J^KwmbPQdtKBY{wpRp z`<|@8mPX3Z`x`4Z&%E=p$m%vX_Tz3UoIZxhu-wZG3rd$Hzyh2-a~Q&VuA7W{q$pQ<$&21DU=+%5Uygh(PHMD3X$VI%FQ zrIUTfe@N~;cb!@!o`n-oI36KWy3%NnOyWul=J>LF)gE}H%qvcV3*-EP#BsC4&Jvot zn|-I z-%El!S6U=Ns9j(VH9No4rX+$k`U>b%4mB^$9pYc^28dM znk>~IQmZIjr6oxJ^-f8|?V8nEjhxae5yQ9~SCA*`Fyerae(DFHP`5KHqaCQhIEYmW zSSL~gMwTI?ukWW>6$<#hm%vYn*hNa7^Ac_%wOS6&+evR>P$lx<50AjKkbfjILE_Mj znxxTkLVqEbkzTsUMal?QnvN;Kr6R4Ipt=2X3Ce@Xxsc1;^cR#C(w1JcfhjRr=BhM$ z8)HNfpEhP#nRYNi$&x18G#VI@e0WEnIjRqM>0qXPB!)WMOaVN)P(?IOR>y8+&CX;Y zOq3hM;)alY(~=W*W16#8!{Sb@bz`!tHfFongYI? zRx6XZNTnhicSa;k3Cj^-Vvd-Y>FmT|F{OwT2bZ#>Yzc}`Lo${%Rw__N6C$M;|1U}n zWGSWk7hFc`D&V%Mrq1O(Kopg$A`FAA!4Z*wKaI!c zvN>#&i*Zpdhl_AAw~r~IFy(@NxPfg!nT=tvP!@-S0b?*Zxb~3;PXjw@2n_|vqho(@ z{bp@)ATIq7!*y$!=Suvn0<5}S>#=xUqI_i0sov|i77ra+>Bc_2+rpBbbSO2s&kWJ% z)ZrG%)&=Vxbf)V%*_H9_63yoH(cAs9+$c0g2#09>Z0oB^OH{TdlWri>b{&meDgIpHUE_7k4euLguY&~ zG47$osM=-Yx#2cB&#eVnLz6jPD_7C&C!D-}xux%;Q5HGZnOCoGoRT=k>bg~0lem{o|Hq1!RfpsPM@ZMo*qQefALB%13Mj~j48%sbXM1z9j5T{Nhl7nEu>V)@u^!qq2xN|8ld zR#%wiU3dOw&qDlgna>Vr$;89QXB|E^XKq