From fb439c511d899800dce96c871f5e7d52407dbac6 Mon Sep 17 00:00:00 2001 From: JulienDavat Date: Sun, 6 Jun 2021 15:56:18 +0200 Subject: [PATCH] Experiments for SaGe backends --- README.md | 105 +++++++++++++++++++++++++++ Snakefile | 2 + configs/sage/backends.yaml | 37 ++++++++++ configs/sage/sage-hdt.yaml | 9 +++ configs/sage/sage-psql.yaml | 17 +++++ configs/sage/sage-sqlite.yaml | 9 +++ figures/execution_times.png | Bin 0 -> 26087 bytes figures/spo_execution_times.png | Bin 0 -> 66176 bytes figures/suspend_resume_times.png | Bin 0 -> 83139 bytes requirements.txt | 6 ++ rules/exec.smk | 26 +++++++ rules/plot.smk | 70 ++++++++++++++++++ scripts/merge_csv.sh | 3 + scripts/plots.py | 118 +++++++++++++++++++++++++++++++ scripts/query_sage.py | 87 +++++++++++++++++++++++ scripts/query_virtuoso.py | 49 +++++++++++++ scripts/utils.py | 8 +++ workloads/indexes/OSP.rq | 1 + workloads/indexes/POS.rq | 1 + workloads/indexes/SPO.rq | 1 + workloads/spo/SPO.rq | 1 + 21 files changed, 550 insertions(+) create mode 100644 README.md create mode 100644 Snakefile create mode 100644 configs/sage/backends.yaml create mode 100644 configs/sage/sage-hdt.yaml create mode 100644 configs/sage/sage-psql.yaml create mode 100644 configs/sage/sage-sqlite.yaml create mode 100644 figures/execution_times.png create mode 100644 figures/spo_execution_times.png create mode 100644 figures/suspend_resume_times.png create mode 100644 requirements.txt create mode 100644 rules/exec.smk create mode 100644 rules/plot.smk create mode 100644 scripts/merge_csv.sh create mode 100644 scripts/plots.py create mode 100644 scripts/query_sage.py create mode 100644 scripts/query_virtuoso.py create mode 100644 scripts/utils.py create mode 100644 workloads/indexes/OSP.rq create mode 100644 workloads/indexes/POS.rq create mode 100644 workloads/indexes/SPO.rq create mode 100644 workloads/spo/SPO.rq diff --git a/README.md b/README.md new file mode 100644 index 0000000..8031085 --- /dev/null +++ b/README.md @@ -0,0 +1,105 @@ +# SaGe: A Preemptive SPARQL Server for Online Knowledge Graphs + +**Authors:** Julien Aimonier-Davat (LS2N), Hala Skaf-Molli (LS2N), Pascal Molli (LS2N) and Thomas Minier + +**Abstract** +In order to provide stable and responsive SPARQL endpoints to the community, public SPARQL endpoints enforce fair use policies. Unfortunately, long-running SPARQL queries cannot be executed under the fair use policy restrictions, providing only partial results. In this paper, we present SaGe, a SPARQL server based on the web preemption principle. Instead of stopping queries after a quota of time, SaGe suspends the current query and returns it to the user. The user is then free to continue executing the query from the point where it was stopped by simply returning the suspended query to the server. In this paper, we describe the current state of the SaGe server, including the latest advances on the expressiveness of the server and its ability to support updates. + +# Experimental results + +## Dataset and Queries + +In our experiments, we re-use the RDF dataset and the +SPARQL queries from the [BrTPF](https://doi.org/10.1007/978-3-319-48472-3_48) +experimental study. The dataset contains 10M triples and we randomly picked 60 +queries such that all queries complete at least in 30 minutes. + +## Machine configuration + +We run all our experiments on a `MacBook Pro` with a `2,3 GHz Intel Core i7` +processor and a `1TB SSD disk`. + +## Plots + +**Plot 1**: Execution time of the query `?s ?p ?o` using the different backends. + +![](figures/spo_execution_times.png?raw=true) + +**Plot 2**: Supend/Resume time of the different backends and triple pattern shapes. + +![](figures/suspend_resume_times.png?raw=true) + +**Plot 3**: The execution time of the different backends on the `WatDiv` queries. + +![](figures/execution_times.png?raw=true) + +# Experimental study + +## Dependencies + +To run our experiments, the following softwares and packages have to be installed on your system. +* [Python3.7](https://www.python.org) with developpement headers +* [Virtualenv](https://pypi.org/project/virtualenv) +* [sage-engine](https://github.com/sage-org/sage-engine) +* [PostgreSQL](https://www.postgresql.org) +* [HBase](https://hbase.apache.org) + +## Installation + +Once all dependencies have been installed, clone this repository and install the project. + +```bash +# clone the project repository +git clone https://github.com/JulienDavat/sage-backends-experiments.git +cd sage-backends-experiments +# create a virtual environement to isolate project dependencies +virtualenv sage-env +# activate the virtual environement +source sage-env/bin/activate +# install the main dependencies +pip install -r requirements.txt +``` + +## Preparation + +```bash +# download datasets into the graphs directory +mkdir graphs && cd graphs +wget nas.jadserver.fr/thesis/projects/sage/datasets/watdiv10M.hdt +wget nas.jadserver.fr/thesis/projects/sage/datasets/watdiv10M.nt +cd .. +# download queries into the workloads directory +cd workloads +wget nas.jadserver.fr/thesis/projects/sage/queries/watdiv_workloads.gz +cd .. +# insert data into PostgreSQL +sage-postgres-init --no-index configs/sage/backends.yaml sage_psql +sage-postgres-put graphs/watdiv10M.nt configs/sage/backends.yaml sage_psql +sage-postgres-index configs/sage/backends.yaml sage_psql +# insert data into SQLite +sage-sqlite-init --no-index configs/sage/backends.yaml sage_sqlite +sage-sqlite-put graphs/watdiv10M.nt configs/sage/backends.yaml sage_sqlite +sage-sqlite-index configs/sage/backends.yaml sage_sqlite +# insert data into HBase +sage-hbase-init --no-index configs/sage/backends.yaml sage_hbase +sage-hbase-put graphs/watdiv10M.nt configs/sage/backends.yaml sage_hbase +sage-hbase-index configs/sage/backends.yaml sage_hbase +# run the SaGe server +sage configs/sage/backends.yaml -w 1 -p 8080 +``` + +## Running the experiments + +Our experimental study is powered by **Snakemake**. The main commands used in our +experimental study are given below: + +```bash +# Plot backends execution times for the ?s ?p ?o query +snakemake --cores 1 figures/spo_execution_times.png + +# Plot backends suspend/resume times +snakemake --cores 1 figures/suspend_resume_times.png + +# Plot backends execution times for a given WatDiv workload +snakemake --cores 1 figures/[workload directory]/execution_times.png +``` diff --git a/Snakefile b/Snakefile new file mode 100644 index 0000000..74594b1 --- /dev/null +++ b/Snakefile @@ -0,0 +1,2 @@ +include: "rules/exec.smk" +include: "rules/plot.smk" diff --git a/configs/sage/backends.yaml b/configs/sage/backends.yaml new file mode 100644 index 0000000..84f52a9 --- /dev/null +++ b/configs/sage/backends.yaml @@ -0,0 +1,37 @@ +name: SaGe experimental server +quota: 60000 +max_results: 10000 +graphs: +- name: sage_psql + uri: http://localhost:8080/sparql/sage_psql + backend: postgres + dbname: sage + user: sage + password: 'sage' +- + name: sage_psql_catalog + uri: http://localhost:8080/sparql/sage_psql_catalog + backend: postgres-catalog + dbname: sage + user: sage + password: 'sage' +- + name: sage_sqlite + uri: http://localhost:8080/sparql/sage_sqlite + backend: sqlite + database: graphs/sage-sqlite.db +- + name: sage_sqlite_catalog + uri: http://localhost:8080/sparql/sage_sqlite_catalog + backend: sqlite-catalog + database: graphs/sage-sqlite-catalog.db +- + name: sage_hdt + uri: http://localhost:8080/sparql/sage_hdt + backend: hdt-file + file: graphs/watdiv.10M.hdt +- + name: sage_hbase + uri: http://localhost:8080/sparql/sage_hbase + backend: hbase + thrift_host: localhost diff --git a/configs/sage/sage-hdt.yaml b/configs/sage/sage-hdt.yaml new file mode 100644 index 0000000..440ade2 --- /dev/null +++ b/configs/sage/sage-hdt.yaml @@ -0,0 +1,9 @@ +name: SaGe experimental server +quota: 60000 +max_results: 10000 +graphs: +- + name: sage_hdt + uri: http://localhost:8080/sparql/sage_hdt + backend: hdt-file + file: graphs/watdiv.100M.hdt diff --git a/configs/sage/sage-psql.yaml b/configs/sage/sage-psql.yaml new file mode 100644 index 0000000..8187bf4 --- /dev/null +++ b/configs/sage/sage-psql.yaml @@ -0,0 +1,17 @@ +name: SaGe experimental server +quota: 60000 +max_results: 10000 +graphs: +- name: sage_psql + uri: http://localhost:8080/sparql/sage_psql + backend: postgres + dbname: sage + user: sage + password: 'sage' +- + name: sage_psql_catalog + uri: http://localhost:8080/sparql/sage_psql_catalog + backend: postgres-catalog + dbname: sage + user: sage + password: 'sage' diff --git a/configs/sage/sage-sqlite.yaml b/configs/sage/sage-sqlite.yaml new file mode 100644 index 0000000..b234c69 --- /dev/null +++ b/configs/sage/sage-sqlite.yaml @@ -0,0 +1,9 @@ +name: SaGe experimental server +quota: 60000 +max_results: 10000 +graphs: +- + name: sage_sqlite_100M + uri: http://localhost:8080/sparql/sage_sqlite + backend: sqlite + database: graphs/sage-sqlite-100M.db diff --git a/figures/execution_times.png b/figures/execution_times.png new file mode 100644 index 0000000000000000000000000000000000000000..61138d76c5832b54b5cfc7f88313d3d1b98c8a90 GIT binary patch literal 26087 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 b!Qs)_PM@eezdpu4T~SsoU!ys(G$QVwT83SA literal 0 HcmV?d00001 diff --git a/figures/spo_execution_times.png b/figures/spo_execution_times.png new file mode 100644 index 0000000000000000000000000000000000000000..1a76536fb1b1fb466484d953c60b610587d85f01 GIT binary patch literal 66176 zcmcG$byU?`+b+E9Z7U)O25c!&LP|oy0$HRYNC_w)DIz5e#3-gKd}o|7PW*8gV~=gISZn^~yzi^-`RJU|*{z!xH&G~*tyI}FDiq2( z{Bq5Qzt-b_X6+4*_@Ah)w1({kOCwwRE7n&jidSrJT(h*jW~$G8^QyItspWM69zh;H zE@l&3+Z#4wyu23w{SSC7t&MqG8n(a0i)_3ht7$`_9Qa87TXnt0PLi^ULZO~Hsp=5& zv%}s+X=Y_*y#M)``%ic1k4eM}88mmMwrVkXFmkKCX3EJ3_kS{P`|41p+3rm9v7|dR zcVg*I{$#jwhLzvVy~jS(lBdPT(Xri9SeT<(wBNOJtS2YgrfN91DQ+@%eeq#=@N;COzDFcF7GHv#qK^);u-Nr}*?sSye+&(U z{_{S!^p1`ui#twyHsp^od&j^?@$&Gf>n(r5eaD^MkNWoQTL!iNdU2gIXU+`F)r2G@ zBy8G!_*r~uSi%})LM+8SB0v4`&6zduy_`s}8^ z{(8zP;WB&9aiYiP?%mVz`#DatSUfo(!SBDB_7F2YJ^dZ`f4|FtGeCh|R7~u!UcSqh z7rf!)^LICFSD6-JV6&zR}6{dVX{F6UtHMMa$W=+n5h~Vo4pXhcQF_WU2^`;k> zJM)|yBdNQnb?SPqyZbjzIl3bgACl9q|Cj9)FR?(c+D01^>Kwo7r2QM%0+`__!ZzTUfxc-TJC>YQ#o9+u`WtJ)9QyzsEF06EXyu`*52xHJ+*|3Y74(d8uOg(@m$z7 zlq$xW=O+6TEW7gK>Ml~=Ts*RDud00D-c?(nI@O!>&UX8Cj#NI`wQpadv?rbE()_fT z<3!}@)vIZD?`Fe;etziuDYbaj^Bp;MjX8GayScRl3)7Us#N+TLO#7=sbDXB*N4pAm zg@uLjcdC`a!s^&3Q$q3sism7T!;DqzbqS}S+Qt(!($dm{<3CF0hf@lsn)TdG zt3pKQr|Olb3s#n}QuhtB>8+LR!`jOR%rugoKHZ`7&RSYM`BH6;-LRnJgkh3ifi5=g z=Ye?5wLCLFTV9uV?=`-5ukM6{L-ze``{M%zj7zlW@kut*^9)gaFglRH&=43d*u@C=y`P;iaqJ47sd+Ae|}93I%W~nnrZ$beq`0H7cG8g zuWZ_uF&`vMg_F)9!Me37wxBe9d_w`g3tHn_{b=QNNl>V=(20F zQyx}~U_CCDKHl#g&VoZfGpaMv@m}4JL;2#lb5HZ<`u09QtR}Z+{g%%kf>tva|N2(w zw6Zkg9e(%Dot}}Aq({3rzI1izoqcjZ4KHCg`|C=eLiCoz!Se5Sw@cO}YNoSN*KMY2 za30Hxahe_~>*&z=`|rOeW@egSoqmvUy(34&@*n*mF}rvfuRT}VHEaiJPU_^?o*%4> zy2>AD`~Bm(B&|$2Y}Drk1qEWZ11|^bV>tGlTT5Y<2t97Egukr&QTl{UI=sBoX_))@ z5p|{Czklc0kA;yvvj6x^lj<;uaetf1KE+J4M!Ed_eBVesnFPH8H?ox{`YID{-JuUKfbG|xbc*wiHuDQj^OnIn!KKsU%yooPIQgtnx z5(629uP4%RYaK$Rms!3=Xz7V6-_;~;EXA;i8Mao+D(`2PE{&r@xL&&&lUoXnzMNuZ#DWCP* z_Qm2*m6evB#jdJP)_ITW9OOii-R$!IV5N|GlR{&H`U~16!*Nt-hD$8WHf5p5vm_UO z3jF9#(#|rvY@xetxH(1GX|v1HbaUz*_iFRnh@b;pre z`U~~ZikWUpPG~@6^<3wt&dbWme%ZU4a^mpAhYxF_6@yu+D)HkM?Y<)8TIOaq;RYJnHJ| zSPDhdEp_buhSz7eb8Ea|E~NC3^{y1|igjC>x3;%`k(ZaZiH~*QVKzbtWB3N zR>4kC%XP47jJt65wTyQizT4YkX=w?kfQy~Sv@Y@y-}|t+t~={C>+k1aWzL<)R z$IHRNLCP+-Rz?kKG^@1owJV)nU0qU5%WQJbo|YN%Ul+r6iq3akh$lbj#*K$I8n$v$ z>3k2S{5dbM*LGcT>8lD&cyB)@=iBK#CP4~Gt*fs4k{xL$z7YlK*y7K+f2^TAWgP9y zGZ%j2*9)(smr^p^RZ-O4Cf6G`=RaM-{sum9K4x_hE8 zuY^rcIgVF8W2B>Fmy(j2o0}U%&2EedcZ;{opJT5wSR5~9nwXmM+WqalP5pE{H}jz8Dy~|!iY}!q$4-8)@bv~9=*G7e+T42i;+-6UC*+Dl zbdDW7_)()X-}QZt?I6vttLxmvRh@hnO;38>rl)_O7PK2`5P4AHGW-2Okhr6DVsoY6 zlf}9IaIH6&Z;y63r?!N-y1F(-NN+Z1(&luMX-8o)Lu+!H>9AMJy57P1LfEEHVe5V| z!NTBM^m7%hZEbtY-B*^f2w>^SDK-pa)A8loBEpH2eqBM5-?CGjh50Ya2^ojw+yELB zA|dv5jz7GGRTDK*Sx3|pHTdjC+cnGmx$AKtGi~~nGOu@tN!!V8MXNghVB3D%i5{wF z^B9^Uz8oDLO-sBONFn+1{K$)wnQL$LuuvWfX4#MFqC6_7*z$kR{^!Ai@|G6Ok=9Id zFx6h2TK6tHd!Q=xIBAsl^r~bry4)6$@Dj#b-U)2px>XJJgMiB3iogqiTo?V=6`%3y zN#47650zV9%;DF|+FgT=y1Ke%_0is863)?RSmpyYubf6Qn^j}a{oR4nR{nyw8HYF1 zanfjdu>NdPVKkX=D*$D-tg-52GQfk%TcAs z8{*N)i9|;r@1Arz=|DVS!8`6L`SbDXw;xFK*nQ+nW24&b+qcOl$-r9e7q$NMHRi_m zj}z0=jVNS|DSA@W+EpmUW}44*B4u|Ph#oz94)yHV9e2xurMJt|Dek0axw*Lo@n7{o z-QGWZN=y>nt`TotEyLuzH=~doN|h==!1C;m?FPa0OBF%&G_rLZ;Vu#JY6gpD7IsxM|g8bS^yhjQ4bU;~uyjK03UXuR$)`Ut^6`3s}RU8ic# zmVGJBa$j*X5PkQ~>o}SqiWAktEjFBS)d!_eu{fj3pn2>^A%l`FRR3meqkEg_kNK}z zy}IG$$u&B8PHNk>ZDSO<@sd%*L{V~TZS_fvwf1ty-e$QEb z!ikwO>&rj$P+sBk<;%Wb-n%X3NIUxY_>i88Iu}#s$8m(8Uj;v+38!&?|1tnyBN}IS zMG>jOuD=R5;7m5)V+r2;sWCm;(WWnZ`^AeF*W0uIrp}LKb?Hz4O1Kd7*lB9u6>8Xd zVDVH9fGL6Lp+kGq8NtsU5W}bV;(eTRa>+AQtogokj;KHmnLfY3&_=Nt)q9P%y z?lV97ahBzMJ6&gVutmziEAaSLaWcFu0B@tPIbu)VT`y+S=f$oN@Dj)=!MgWL$+5nk zcHl0&C-p?#8{T_`$r-m@S$6%Ad95XF@VUBf>cCEoG{Z6xjyb-)$8RQ%&jpJ+rb#Pj zV*v+}vO4R6E%W10R@eq-tokY#)Z$d67iPw?W|fZif0OsFz6PK^)nXhzh(1N0FoDnh z+}Z>_$LqX*i~bU3a$FG5l>l|;nN})W}B9Icz zo9ZjMGfN^mN$ zHg!r*#qw*xZ1-l*C0*wcA<~Cemd4z7Gcv|2OU|7+`*`0Y;TT!Kja>>KEiElmnA~Ph zs!Y|C?&46=NEF^K{4`?HytuTgN{NSuhc1O%`>n$A^0Kw9Z9_`IGUJ%y%7@!)yu~f7 zdZpI*9uX1I09&}=NyqKA?**QUdULXlUC-y8`z4%IRi>PIjeb>g*^joDD7?iUB%7SO zDOidgOQw9|Yff;mwny6zMn*H219;xM`;Tg9Yim~q36Wk)<*^6u9e3l1EHQ3EdBC>1 zu)H|OCcWW`uw`c=7B=om(S7Xt=MNq{z&45jb}7|#t6(<0y?UK*`!RvZ)NtO-lv`fE zzCU1M%v*^X$o&9pM(Q5ch;#R$b0+}8n(uGj+g*{maIn9);)c=`P%Ta_8x>X5Q}~-E zI={hc+R=>^L$kE^y0Zjl(;&>f`V#+jmK@`ucj-(yyro+`dZvpM6ea>mH-I*kAranc(BQ zckkXDZ8!bdT;RUqP@bq)kbn4M;vp*Cg6zu7yRQZA1w5CspMFVt)HgC>F-1FyCCqID za_9=^<>dqQQoO#69uPCt)`h@e?&j!_P0eJ9(kWy;pl{)f(I3Chnzvsg?6+uiaZ$uivm?7-zE9JSC6a*w}bCukIxj+G9?; zFD6{9{Q7&2<1XOExj2<5Rw|2(*Hb)j!fMbOIk~vF3Ui#Do#lPsTC~yiS6t>>A;`t| z>XXyoq@QzXst{!C;_9lFX{JWyzu(Y?-knlhDsDT4envMogPJ1mQDr>&RSwtjinq`i#M4Xs1>stdREL8YqfFX#?)C+wBOb@SMJvC z8p1a)N;qZUUB5&NBXy8e^=_^i;Dxg5ZIh)NeD%Q*(O;jZq@*Z?OL7Cety{mIQPfbs zFP5*r*T%-ib9(KvW8alyV5?5QzTF;o0)`Z{XcZI{6&*x7*UEQ!H$Ocb1EnEe*5@F8 z)Hz>{zK6;cKiHb~@}^E3VW%nGaMf}(I-(XIxoXXN6F?mDeyhSH63}@VhgW6_R>}Z_ zXGJYLb4#q{c$N*S0`{eIQ7HUtpekgV*30O*%|$h(=%t_)nxmGLIL>21=d0b94X&;H zdz=-@rtd{+%oVRZ|5$OpYH`HcXpk`hU>ydV8ZDY-bw6 zS^@j}1DqrQ(v%)QsVwtQv{3m{-LQam@+HwFFhnPCvR?f2U%zf7X{O7dWWS0WIMaRX z*fDgWXHT9er}g;8wVHCP;tNpySnlLwz!bxZx&_jGf$P&!Q^^T4iewodA3r}g z(d&2VrjZB-4lkk6;H#{T1)tc@uDVrm2kh%!aBy&YM~B_QZ;QG4d9B2S{&08OZy#1s z<&N&yX%k&H3$_rCf;!X?=NCD^;Rl@Ch(c)h^D7_0rDJ(BVNHpe20tM~93Wuv%9Sf+ z+o~w0#o~NtPn@^~1hDJpIuo}q*ZBjxe@eUn_VnJvcM8Y*93GESh{!9nEfc`rO%Mr|zC~0Pj*mpX~1V4USdDBgHc~7nqrvdcMGI2@A?br7Mcj(b1W1HBTX2 z*tj~Z5!;RCn!7^Z2wNNw0$o}4D$3^y!X+c5J%@l&$R37dMPxN#A|3R>XSAUySttlp zp8Ak3b(K4gx9U~G#2s0s`}u+5^&_^ku3}EO0-mD?*jT(`n$eP=B+64g8>J8B&|6!-l#K{lJ6oSiv>cz4M1_I+K@I^W_e%#U8uq+SoGtuYiPl_ZpNwX3MsalPt2Lj#XcKb?Tm1Z@)V) zG)5u+7^Tpl9)5%CZBgpwS+1_|+Zs4M++6+HLIl+7 zb zpgiAV@z$Ngg4Kin({RmzK5FIInhvSbQ0i8RQhW|4>lGw}*lXv~L0Sb~ zGJ$FfCGctFKs#f&%fzGNo9JcrM^bVl2>nOVAjgr&EW5ch&H+x=W2Zp;J4~ovXQ$Bn zneOx;nh2ZzDpTxI8SC%MOAFdP7i@0ar~!j)0B&BlZe1Mk zJ1OtzGm*Y*@`pi!03;hy4N5bNDj8AZhM-LFJJGH-y^1$Tkp9Py9~-bY!TeQ6+Ol4x zr>DEPxJ;p04&fd7My$C~-CwlO@i8z#6sra-d;^q4A&XX3)XC>i+yK68A%dVSDMG6e zblSXSzgR=}?R%P7JtBp>LJL7U=K{t`Knh<_b|J?KOgO&J z$uR?Mp}YFErNtCa87Tib5JeK3yuV3TzAMDVZ~}VZNF9PC2DKsRxP3B6&td8ppeOJz zW3R)qiYSKy{!nO7yDrc5AJ%yD(u!Lp;>^Y$otFU{h?oxEA!OYni}I_K=R9)}YuNkk z+e-+;|51V)(J0UajEUgUIJ|{odYi(mQcSPs@`^Wq_F$ofoIh6_7LMWF$qK9hAX+4Z z$f3f!8~%u{E`}fswRo`H6W-#y*f#j!@^9>QL1>AV_{k{`9G)CBJlc4OAZE}lwbBf! zxxLxh*`MBTljSB98$_caN}gWAX^K2DL0|JyLBr2aMY@`OY4_}j1sym0{_&nwvOV@J z@Vj^CeLn945?W&gEBOEnwB~o7Ld@JdH`d6#5`UE6)s*+Jl}WcuxuV z5fBstimX(+rKQp#+CNK5N;-J(V210$O^dF4iB4CGYu5x_W^cUaxO@p>RWhNLurp+M zSZpL;_rp6Is#lh3bYEHMVqJF%3RnUfCworllPB9(ouHiXz(b5XaeFn{pX5vf=$R9W zc3to7HBD}v990OG4>Oa`y*f4jdwXFOMynaoCy;_ zoo&SF>=y6W%dsspc>uhDBHxf{uD%3akQCE9EL*cVC{Lg7pqvS^vb9wO$|GGp?(~Cg z=wdI@jH?gyza?u6nQ017f&l9rs~`8R`zlOB-T-U)UjA?yh1qGk@sG|nH#<9kKAZ!w zk(GRqiC@3Y!O}C>D)l%Hk5J5gIhT%0gP^<5*ufx*ekiM`EozY7h0Gdcp;|^m^IOp` z*vI@x>+Lm80As~4aZO-$vIPmh##v4PEhUry|Ly3{N0+U|bIE}EL;Mc#ojROixC1wz z^XO>dkkx-Hylc>#DX>@E;mt&Ub&6)X(cq^?yK?XiiBy*gLg3L$Wr$ct(C!iS`#@=#E%h%>P(#DNPsCX5Ro8E?iYylq9iasw*L?j1WW^L@(3!vpeqPE5$? z5$#-uRI{c;a`*;+wxl~P&RXT34uwbja%o}49L0&ew{82yB7rUkThfhj2wxC623s&5 zFGN6beMTqcX^_JCva)}|zEp)vr2rwfw6qk9CLWF!TWO2ZexkzRu4<(Aq4@lRv%=*A zW|aFzM}h~d{Ejo|cndz~b(S0%qB&l0K&1=3RM39((r!+bPkSaN(`JbxXZU#sRR!8; z#?^8_Xf7;g9~0V4 znk96T7+9{MVs>(%rF=%;uj9Dhc_)$-h(qMIFe1DJ%p${64BV68Fy75@Nq|DB(}Q13 z)NeEvSzlO(e_Q`g@u#)s9D zL!g*&y1Tn~2)P~K~h74hqe-9t7eo`1nPhBvl@m07fIW4bcxEQ&3?l?lEH>QU4dJ}H}O8*6J{ zKoLmj(J&+9p>d_9my79@HT6IO3lg>rL%HvPUIB9vNrQM4 z=PJSP@-KKA@$>AuKW!wUlYJg?xsMEaz0|A#s`3m&mVi$$eNHe>p;xy;Kl&W5t|coC~*Lx^+b>Ygk5$RbuOZppbUb4A)wez52iAa~|dAg3hyI~7o0BKf5iRORlPvO^U zde^okheaaar#ABh4cwh0Ku7Svava7ZZjQ7@jpZ*Wffm*iD-Bi0*mk$ineQ{BoQo?P zjy}yfb?THYfjwNflOk=D}qY;`KcHsj=S&f-F~Ll{4ICZ zFdZ6jJAqwP4uj+=+=>JJ?|!2A5#J&=FHgvQ*@gI|XrLZhi61_kK$lj)d%1{wRB;aJ zM<8_s3)*+N#z?x(n|yi3i6>8;K1Qw0YbklW{|Gg8NWT(mLkp%r+6hn=;N3mRxt?9* zbfC!BK^^h`d)i5J<-i-az60shksHrD)08MX0$U*qBoSdsN(%UGW~{3jDU?i$wqyIn z9nO)22_%*j$hp9`YVd;j-{Nq-2Yu+~TENNjfwsq5*4!-IDfX#x&AQKA#M;6dLfry@ z@9gXh60wR{Tw1c58aPjQ1R8eLuUB-uo?yBsh&#(lm=IA^0DCwfO(E0u8IcX>vUS*q z-MKqGOd-QC^6CF$wX+Qd8*vFB0wBOtM;%Y-SR5kbqQ6{9$-Yk@#5gP))4-d&kDYl`@s~2(wdk=>P^UKy{p& z9XFuX_NQfaI>}>;_`y&|6N-W8V+MHKnr^Io=W0i;;|1hA_>()(ixT0y$C0xQix&a| zAG;jY%?*zy*+l);#Ad zadB}3fTRXH?7O_vL%^U6Jt!r3B?pZSku7pOOQn>wJ78wTPAg6D@}Y}8gWwER*cLJkNb`9Vo$8lb z`Qn7g0F%i3#$QZ|$3HuSjX>Ad0OkykU(*nGA=99A+f}rssx-2WI34o7D6hmEgB(+# zzjv|=XsyEu*6`G?@2B%tmKP3Ri1s3taeiwBGm3%7q;n2%5_z!XP?3X#RVAJjI6X<~ z^rGafG22XeI5=4?C49$yJSyA-p$&q(5C||sjj;0Hb>KjO2LKI#*g9H3|#*34_6(JehVvNQtkfs-#2)u;k(HMNdN12_Ct2?HWR4Q8>(pSXo(nx0dPS z^`r52_Y{R!haP{y=|m5t!UL@%_?U$+E6LW>wx^GdjxzEa%7zTHD+WaZBT{{}vaTlq zo|gtM2!Xb00dkU-#woV0EW@;3y?klpTZY zM1;O^oI2kZY{~!T*oi)vDp$Blg&3-UGNwT!WATavo9^4cUk%JOZ|QfN7?w7o7xY3K zyWt!tVQ)`QBrq-kKhRAdlV^nQ-rF|6umGJ|Q$ZK{@h$^8k;#JW`}%94AAm$%#6ck6 zM`#5enO3@ycjUm|`}&rCFm}!@CZ=FFTtKN&1KR{T{UjYViT9fB zbd&75s$%rY8%vA7CgBZYzai)aZ9^S}cM7|=G`RbeheUZdG@$9C?NYHgqC^8g1L54h zeY;}tF-0u;xc@FXx@eUC0c6w8p{P7NZhsvoL=i#L^N>r0Al8YvSM#w=3ur)jgs88E zxJBVaf#`Wx{Zm=NnV3&y%>y81u6j9jS_=HP5HX2~D+efaP% z?n~L{Al#8twr}6QXOPaJV4lDVeW~023!N|-d`{M*s#F9UQlpL4j_zAc&AG}j32hSn zfPMhkgBj|RTJj}LXm5?2PHwcfry_6-|0fPtN{%$xQZA49BszBlEz6qhI^ZKe;F`a#c;TAmMe2p<+T+-}#A?!mb>)Z`f{fEvx(TTnr?DrzV$~ z`LGL+SGdPFoJ70-^VfGaG2j|;Ko{zSU06E;IyE58wkvnlSA;&%hNEv$$|J`J!3WAC zv0C7Ri(orX8Ye%X$7_Js6_7|GYcn_dB-fy?*Od=cK8P^}6F!cUeZ|4#(rA;|6GBCyB|hAteHE93K62eMWWgLDALy(iO`N8gWW$HLz5Na?LcuM>{Da%_({jrHYTyN8@Y< z>#ULm+)I-*QcsZ&fO=(6nGqH=GK*R?g#vj9Hd^;IG0OqF2)ZO*7tkF?R^W*ol9M8V zO(FL6|J$5Y@wCHv^x6MKPU?bx==m8`kOmZFHYz@*V(sZ5NNxipZ;7tYrMrFeW`X<_ zq~?PAcI}Glv;Sor?i!7-P*b-MxFktxK*ehU6zX=lL2I)*F91jmNgEExJxj(OI5ah|M7zb7^Nfoim263v_=9Hl63R5EOW>2`*Ugf4i(%@{O7^jdDOeJ6=}1fZS#-QwWO%(ESpxT6=kxk{ z4d+(o*BBT{qZflf2Dl+)F_N++`DJM1hT>K)A|@T@;rWSg3sYIt&JrIP)9t#qZJs)Lus?C&t18v}IEid%`3@{=BQp5ST~; z6E0p@+y0a6AcVvP5wRTkntB@Dw;tQZsNLimJ^?{iHeDcAByA00qydVE9V88sgdzU? z%aeBv5w?LUP2zvZ#8BTHc;vbs0->ow&-1Ti<+;mvC~D{#yV{SvgKSIwHJ+$BpnWUK z&toR3WJriZ@L`F<%|<2ZMi?RbBjH*jf5a-MDHF&!Uyyd&#jb$b^njpiZw3Jw42Wz( znRbfgI?r6s-JTAIx%cPKL`V;2FolRd zPgW4J9BKb0{ln-viglSK+Ln1yhz^l#V{59x15nLO+d-A*yn4Fe@C2K)Qo-%z-v|$( z*?Vn>id$k<^0;n~hdhPTOKg&Ppcewh$=d~@djY+R$gU6?iia{^XpLlpwZPtw2A$a> z(Vb<{#tzeu6q1r_%>^sV&Oy^3+dvnKB|3-{oR!Q-Zv70Clwx+SqaJB5+hE(mgNoPlZ{Fr1Q1a9VcG@_f!pb0 zW9<3Uq%U{6Oezw2lUm@1iXJQX{O}*a_`0M`N)$R&9G;WY@1KDLcSHBpR;VE^FgaeQ zEfAZvCr1Zy=c8|-KY5b;IXb^Q;gk63jcHfqiH!wW;UcKTkI<>2pFrXzmFFwQG9%-4 z^K!s=VsOad*TsWsl<}|}arUvf{p86LzO`w{vycf4AA_bugv}Wthr>%U%Qe~-6ztql zB5X=kL2CX;8)6M~B3gydt4w?uSjn`;Cn~s7t6xHUBBKrX#IisG z%~(qB6Iz6E$yk;I6kWI=UwCI7sC5cRYl&7fNDQ)0vd~2d9~MMNa%rJ!#UC${s%Vz+ z1LT_UHdbk=52DcGJ?Oa25>pTrBa;=VriUTrKpY~N$FO#CK^jThVdNo6ogUXBWicab zYhpc01MG}L)H#{`vHi??t}Quq4$Y5K^8Q~J}bJv)o#37+7+`Uf!!sN??B&(F)#=lbkn9ybzu42 z`2{rf3F^EsW6MDIaI=L6x~YCru%P zka~#Fk2K^Fe>`vKibkoH*yVNrzao=zS(p!Da`|-|^psS7G9!ciu5`m;5l%%W^n1_Y z71WA7m8hifred7Ls=aW|YC;x<@9sD-;-23nu7v*o+ z?6)em46K^Eq_FsILC1R*3C?P47yxD5F{ zR?}}EZqsqNr?19vWJ#_6f?pCPo-k z@I;{n9|rvbpHl+ddy>8waI$Xox=pO_ER6aLr1YA~5eZxeYxXX}7Eq%zAQXYz2l(0u z_+0{%dqEqz#T_9Yt3E0tg1CG=#9Buy^3KXddn);I@{qKB8`LNJ&G;h_Q=Y2}`*Ca>f7^3!vA(FEDScMc%cGEZ;9Ga<7wOf1O{ zj>P?)S#TH9W-R7VIIAY(L`8UtJ5CFMtN}@ljEoRsE9;@uJL!`1qUc+Q22|cg~Yl3e;kGQ7qk-XbsZfNg=u7{gv#$^ zT8uR4D}v=cdGjCI74Ct+L{MKjZ-Htc|J5nvl1p2q`exKmt!kS6)Xu@}q-}hYQ-c1C zjEostsc(ey74em|l6laCi$432GiI=-aq{QSpI+ZO;EmG!Y^+N+u6Ae+44*$MEnWO2 zllBE_0U5|6Ljbn(Q>LMkuC3X8;N=R5xsUkRelt9akkamp>9Epy^8f=3K&O7R5?hX9 z-5)j0NfSs&^hF>!i;Ovtvy!c&lkajP=`A13ISYeKlpKxD4p`&OH?xX=FTN^6kE^5B zt3&!W=&j6kU3iO4kPH{{b5RjXmAU7?o1+^{iFW7CSKw+Kt*1Y`cw7A_+3HzVoaXy1 z%+o+A_Ne}+hYg7;X_3F}e*t4$^n{Dit3bFZD+T z(B!Z`jbO44yn6+Z_3@;{p2<}g^?RfI@w*`$O_^XsjVvyuls5L!Ta#5t&5*c2h&u^lq*^ zJ%v5Vt^35&abN)H0&b(dLj6ZJBAH6EIOsIy$Xf%i$!E@&DzNRa(KvO@QfxQktOzM%7IHIkwAK%~TdfRLmYBw+j)ENs%AX%P z;^}Iz-i4-ogziPa!YBLGKspRSa`SxAUzV@V*n*vM34wrYK7}ud<)&-ox8{4;KEmtqhgJV}_MM}9#f_v)8twFI|J4GC`#e(dF?@FwQ0e)vgvha@9t zPu#6!)X6X$}phC%@I)^}xh)aX_XUG>+7&3V@|9~`a-L}cDbhQ1A+lDL2 zVPF;JRj;Q#;Cz2^Kt=PO z|BmkNfud95Hm+m*i6ejV7mD%jefvVwd?Pq4sn_l#WIRLD+Zg&FYM@qF zWwHPJw{MqSVW^XVn;zg;s1|>wALb7Aoi6|6^p3svQhS!A9zq*PGVwQ^xr}UG$(lr% z6k1ci6)cdYA&TxqPuXi|*>ONdbp2Osmb+(L7Y~lemQ8ri!=of&0liDb9H|?(bo-uDxsndNX!_ySD$)pn zk)v?d;}ISxnI|&}bbj|f{oMGheX~22PJlh;?AW1nK*5sW-+#Y)#U95U)qf{oflY8x zAgQ<_bZ)VK#*yzqVR8GI)ihU|j_NRbJ6Q%@-Oo+U4 zD$m!-T^o1vToNhEbN3qt>?Ni>VJl0(^K{!!bkpbs>qYMGD=^j{TQ#`SxnX18hFcY% zii@Q!S~F^2=()wAh7wtY2=(Lpt?=AQls)xpzjT#1gPpDyCtLF#Utftp^;4Vy6`Ysr ziaf(S1t!F~qL%G%=+A{$_IGDj6`}o*3mx%vH}5_iiGwBQaliv+ z#CI@jueZ^?ce5d_l35rMNQ&ss`u8b%4)d8~n0>Hn@sq4dno;H2G=7_dU)6OTrD4`z z1iI!9i!9}M6{1V!gWiRi@ZnM>cU7EQZv))|Hyxk@6{x~Qp2@A@Q_()P(I;x<{Q!yd zhX|Aw&+xv3f)azO*%2_yEH2*uneU)9N76C9ze*N$<>LcRpR6p()?;t7<#DL39`u|C z93ertdvGhEw9P{;CET7^r(9eW1C3IMRv3iOPS{f)xv#H8(#3M>)+5J4H&jg`NBPny zS}z|Yp(N}Dsz;cnH6SpVGR8ioWneJPXcPY=m47To<~aYn1SJwG;Rce|Ci#%@R-~k^ z^J%|ve5=Sg*I!a`LswAGpa+0cvw4rEmH)`+&$1+zpkn(*m~GBWz_a4l{>9&Imcsyn zB~P1(%7zW&gzE;Zlsp({6$Zq)*p@C`JJ9I@IP0mIU0G!0Nz3VLwB5lT-YamwoG-R; z6eKZC$YCm%FTVu8H41qU?tX5^iw2XkMh;AdH!D_q+3w!G`>K!qD?By^jlIm1{8IO} z{`J>6+{8{68Iw;BcM|IXQ6>^cBziXtFGeZ1T%eAtwQbyS z`Ul2P%TkR#c#v^ml6!{eT?=GJOGoG5mu`+(+*pi7LuT=1_55C+oSgipbo}`78Yc{v zx6Q`4QtXqzRp7A&JgTnO0@iHA)W7XlbNQI5#$zo9q6FsgwEydZmiWj42)oE?z9u#rfvxS?scuWt>Oa^yxQ$kxM}oIA zJemjLk0aL0dkYnswwR3lpwv0gyCVKQSk(m^^nZ_fF~~aVI&Is$mZlCO1i1tN{IL;0 z07}v2sR<;jo5`#gwf6MDuAqJ0j(z(IR7#>8j&A35S)5HpSUPYs;I#N}z(bA^;*qONl*Jva1{-}!P=Kn#udwQc57?$@{8|9GMfXSiULpIB_mX>2@ z9xO)PKXq>tLwWUzuKxPE=>H+%&EuKlJd^BGUEI~EMI4Sx{zPc_waJS;6UQz-eYdXiQYaw5bZ!5kSPGN!+omF5d>3Y*rk z7OF~7P3`5{e0+yfiNOX|PB&c9-~H(TW3+Mp&kW+=^#LxCP~LdDqu5PKDj<2g#C>lwaKDD~SMsL&AE$5ah@GHv%3oaSu7|@; ztwSR2M@Xgsr|)EsM4xo|B>iR-ECC(|qpA?oDO!bx7*E7EvvJPPEEaBHVtvQc#Ej@D z3F=R~L2BHU_caFk#Wt z7aZMSm_JAzh?^p0+Nn8`4ruj9gbUCdxvIj-D#Ty(fqv%zTf-=DC3{@%v$sWyd3&MS zqKHd$jzIA?cNr63(Xmic;AM01qqX^Z^^)&=-qze$h<1CL50H63>Kq{|sNQlOVP}T( zW;*3F&XNQ=0dg4TlJh03QG9^POAPFg^_?VMzWWK1hl%w`Th^Aa? zE%?jp8M9L}3V_LcGU1=vOA{eU`9|C=8}Hy)1iCDFGdCMqB4ng>kn+&h>esiEjtJZ< zuX3ImxYGV<&BICrr2~ZQ!8hshrYjCey2N5GKv`v~au_NbcN4~P#0%FJK{PD6z%xm$ z<}y<0hgtba`#utnd~LrVqYD95YP5m13}F=ncz)`shD*A7jV^&2%Vp4iy}f1w83XWa zCQ$H+)UpPI5ZN1D=vRya8{58q)wuLaP6bTNi`nqZnSY2X0d35ooZKXX-*{iS2O+-v z*V@)WviXTcbIh`ni___CUca%rk_V;+iADmz0$S>PM?#@n%Xm4IW2#fh18SYD$7rnx zL}!sK2GDA&*Wx$6eGm+6scSzz0-}I~!{x+j;LqBE<>?ew#ru9V*qeSxgW%11F>7H> z>ND)k!PUHiryzQjIHu-bDO!)7!(DbYI&wc59r6)$LqZCH3#UX2auo*wXF#gE1~Kka zJWoW3bP1#_rK(=3K;C~ixgZoB>1MgcYU8F&Dk!Y*ze?7wxrwvNC}tbWx7iF?75(YH zd5m=>0n-59EY*Y7I57D__DFzYR^s>yBC?E9YQwXJ>a#Eoy{i`?SO{XOYHfKQ6xoQv zxe8WtZ2`mvG8}+dPcpG^e%f3>ibL(S%vNe0RJTZM#NziBCr+G5oK*g=YVxo}zI|VY zQztPzaAS$8)LT}Pz9lX-tLu0%eaXZ387@0Gmh|3l-zRd}hrRSCI&6tEH>XP7V^V%4 zG_tO>(3tb{a?ZPUVG6;Z=ftJ$U3-PhSUJU3EH8x*Lb6S8Us-X+ zw{8ZN6Tw$zCMG82S{l3Wf2yw+C>#*KWdgf^IMz^Yqk;F#AU_jJIwUl-7ag0JQ2`&_ zkX=r_FX)1iLQ=cLZvKoV<4Ncgeh_T_lb%_E8|53pyIk?ezLMl4Fjqh(eS+W^deCx4 z5Xz}sPT-d9b0z^JF9fjTAS0LpZs7F-pwn_9Pz1nliojIKX^Ktr0zJb#$j8gwM=r+V zDMGtbAyWdl4~QiFk=$2BHGo7!62GR9zlj%sg*OcO8a1#t6!^sqK?bDw0->73L!={q z1h#RG%Ul{hXf*a4qw+6|oG|tu{ebFc3W_rSt7!XflqpaOGE(L=oRp=C5fa$F(H836SzWV+z@~2Wbo_5gc&`z;fzf36Rt(fe*x4CMhud(Gbu8AqTZAuV9Q))h_{84&XYNcLbO9G!H@t96zqO znPeQ$g5Z0zlZ+HZ{sxpXa_30LI~#KQLKE1qDrTGUVc0o0n98+&$3Pny?#2hL1&vb0 zA#ue>3ekGuj*zP-may`8!sMPSw9e;vO^x0y4E$$E*o@pl1WkEJYGv*TV(%%KktdOC zVp^(!JBX~wHA2PrL%k$ZS1XJCQp9-lpy$2bBXsyu_8VMOMYAOFt(T00lOfl?d`UJ6 za8Mlu2#@;^4h0%nb$~`W?sz~o^i+F{1nNb!di*yC*&kCBkI)-q+>jYVs{V@~#}n*& zGBpVkgbeOs2xk*%Hg#iqr zh5?(9%YTs0SB0ca2Fx)a{kghY8A1}gwFIJCd3IKn%{jBOX6E13QzgU;L&s!xoQ!@R z5O;V~=fjm%MJl#DZBVfGxa(o=mCWgwT63kNC745V*tBiiMRcPn zOc^oW{tn1YjvmUZKd65K&@fwE#j}hbAbkyR!H8N7e5;IdeGVxFlAKurFeZhctI%g}*x12)zp z$&Q;=R<*D#rn^>_n;p!;Y4lvi?-45mvKfP4ix-oWWYbN)H3dd^T20uPNQLqW+d-NkRc<2V5Sc8e8k8gcRmenRk)A+Xo^fs$yhg@!|iD*s;*%#jXd=@ajZz?BPSfE z-C~Qo*Pjc4jH@4K@erE?=01^+F@VB;@#rhCUM)CzcO>qkd65G-h=NCwum-(N?dir( zYSULcgy95l!u$qF*kWr0NxJ4hZ96db8-1DFH^+TPjBod0Ray7N@dsq?5dDO-t9kfu zdo3ODH#Iny_1COZ_^*D6#ik^JM@at?SSEvom5q%bU^OvX5KcXfdZc_Kqj0i$4?_~( z+Qwvry-DAJp#E&&?Z!Bb)Cj1533y6`-;>h5Yv2977p#{LJfeD!eWNFS1!kv+-MIaL zIGGgG?`?(|;DH`#>LVo}ls8_o_Y3aG;>(G_$KkaNeNOww{&ei$Pbxm}-a{eAk6^_l zDvJ~Rw1;w8uJt^kkZA1kQ2od-lG|J_{nA7^ua*D)E(ssx;mIG6T0t)0gIIf&Pp-JE zj7rkxkfwKSp*+TYG{_66AWR}XFTm+Ud%;EGO#SB5w|s`6k&|Of?$kr|X(SiapkkBA z-P)B~h6tlX;lv6e20*g$0P`f?g}VhC;M0+rDq>@Vr0bKmhQZQWatjKi&(G-3H*elV zSo%DQk|2yh^0+&5dC3mN!VyarIV;{mj?|RA-$AI|uMzkpkzn%j81f+39U|~(NiI)7 z*xm42IHU5+a6{Z{&`EP}E3@Y0P;yfgu4y1Se*{#?J1u#_l!CZb>7M9o$1uA`Lc+k` zsz}A4xhRq=rO2DYPk@j&4bE;(t~4Mw!H}oB#SA>V4oyH1mo1Sv1!fcAMCc=ChiDDS zmMEn&wD5068V%>1Xp$&gP3V?LogO4fF$5%JpL?oIb{PW*IrTnQ@9FM7h^ZZ9CKCX? ziAZ3u?se2a*f}!kNZu4elk}Tp-@kijir>wHe~{}8Ng^GtHJLjhh6_<`IFv%pA$g@2 z8TV)&kDYXDTuY;Z_v(*uG=XHooernb7LZ%mjWT>5Sa;J4bAix}8F3?!+zTFVl3+Z3JOOl(QPRaBr0X;v zlpqsyW^(o*9B zRMHr&_~+(8q(?x)pL=?GBA56Q_?Z|i^=N_KVUpuzNWGHWEPA;s?(-rJJtpQ1LRW|* z4J;R>`K$UG)?*&_9cGjMR#$IcTU~@(7;C@;NlK2~vlk`zoLrv<_;HLp0K}x_#0GcQ2gAs*o8H;;<7Of?@U^L=H*56zK>&X=;52FYcb9<2+LL<75bJsJ$g_ zEHeB0<`v1PKyoBElMpDk?SOdf_o4?J382`oQHI5weSd}WqHYcnZZ`u7T5oE>Q+6Kz*tNELh;Z40h# zbl}{w=jaIl8Z~6GyuM5FdP1^n`Apx8^9m<}tzKsbg|{1gkqlC?4!$4DuLo2JDHM`p zFgGnNH);ANxhaR~X>FtI1=042fjkDQ8Qn57f>Z!8h5#4we(LedxIgfwc%AJ;vTrhm2Usoi}_|L3o%b%WhkO<2-s-{(3Cy=r1$w1b95f6G>) zfUj?6Um^*3GK7gZW+EU@ENCIocN=F`e=09(UsF<5#Z&358OcW8-DgqtQLp4vLFv)Q zzyh@qDI(IF?O3M-;s9!Bm;MhPoRv}E`q>xrc;-Ei6jM6gO$)VJeKfCz9=Juhr7#Q> zkLsryB07SsRRhLNS^7%=O?n0g13T3!Zh*Q%G)>3MB`>*(Nh2cNX|?7_h`l&-NoYOb zD4liaRRTG3oci1&lr$Q&Y9Jv6Xj~)@jo~IQ-E4|4rYGGgXFt9!X-pV*tQ~_-Dv0@lXjDAiT|_HwidLC^$F9PaTt2vm=M_P4I9*W5=yt^$u4}5>#+(q3#{-MsSYgMFKVxnK8<;8I?h%W+Q!}%of_^Tf;&vi%+#7l17BNZZh*5a|{=k}AqEht4g$N@nf<)vVs-tGK~f4ZLsbK9O@k zuayHskpY<*Ybd|0`2rQl+&5vAfE&gwf8J#JYrM%nU%28|Ezv7^&%eL>zqyUMyoU19 zTXE_;fc~@FemmFv`w9%?@@FV-zO35XZK~YIPp`R!)9M?scMl_DkdNAb#s~Q;h@7&` zx-US}tPHOMPM*35=)5Iy0aL-oZxpmYV7P(TE~$Q-c#j4jgTp3T=REPz?~V`cvRt`n`!Zn|6i$_O7N z7YM{Tg>2bQk-;Dq_$LOjuE<>c&*%Ak)O7cvAOA^8%}IYR6wwS74ZG-nK9+O z=Q-bVzV&|V`_{LPYn}5%9A^IW|KIn$_rCUZT^l91=1=nKFBKmzzxn^GKioV4ckZq` z0Vh*)bM4i*xOC~?|MqgtRSvVppG6~bkZv1$(EP;E*xKJYZzzM-s?o}3YhKsZra$Co zqGj;aZ2zV%pLWxJNtbhv^;Y^kDl79cX~Pz!I!jN!srjc33-eAcyw<#DvzOKS3%=Ae zQ6E+svqp*VYG}FgqPBC}O&MfO=Jwxoo>u(Z9@YQzO6_y{ubsUA^P6z?I52 zAAs5LNNuph|o2YVz#%B5@#* z9ro-xMeQ{{F$l-8fHs4jg_H-DAi6P?M{B3ry_T_>@5vqpuQW}iBPah=l;+Eeko zGe)JHSukBUjE%9^Z8@I{AP0&Y-9Y*Nx39z`oNAnp=1 zPdVw)F!j6FPiK8uX>K5o+Ad~lRs}6Cm8UNDn6;|mU-X2PAi2Mx3X)XNsZ&eTuWnHu z(}U=wD!#UN{frs+tFN8gw%HBz^ia;h35hulOCN2Yf8XQ`h(D)&h?1gwI$)#oStj*ZmH=L*Dj)mHfXYb)aoqca}qqMHtxf1^6LloTtgoLaX zn>xYy;5{}t`U(6{cC$KM_&lun^S!=b-Q+4MeWZMOAm2V;u8gm<1BBt+Y!^tLQbGf6 zt{R#39OQ4e^Mi72HgGY4d)xix=vy2$!jh@$wTP@)iVig^sr?#-3kTj&v?r=e8pyk; zP|rFJC5mDU)K*0mHaVsOI&>z@y{{3(2ruArm$Ku@yw=s^f^7rsJv>~ygI-0n?NWI40Xr6fKdwJ64+}ie7PmsH~ zPJ8J>h*(}J-CtfYr}Zq__UFA}`nc|YN z)FR$BM(`4uqx*j0UA+|@?sIs;k27C-8jbp)CyyRYxmqw%Ek+I=zHdSJk1l@eEhiGU z>X1OGv{29*PGe)g1056=yZn{@$MX<#_tYjps1vc)7jQ&qK>!`-UcVD#0ctHn6>Xnu z1ewFHGO~Wk9P&_Ck9$J%#<41LsWwqO+^#Hi<5%pB zb2twV1%VKN0jx}HaF7Q_3b1qQ*nW;^uLn(r5955MVbpmibz&x>n z7K?nJsbd~C#(IqhT|^ibz)V_8z-=P=RttgL@qzW)QRK&BLj#r!E80^Wd|>;+uQAlw zr_-t(L-{O55cl6LU$H`PCpMK+{AN&Il%<+J z&2OM(<4%SIDekgVq_aYdJDV85+ha-IZvOn&O|t9DbK5W=v}%XGW8;B}A0N?L9#{F~ z!2=~<0@H}WDelx{&3_*ZA}!XX9A&}q{>l1%sUgImj8fpUx^=H|vE}IMq68v}Dxr(H zc9j#o(mlW;hSQR2)@d*mwEKJp3&w^XuXqiK>y*g*c?eQUh!z11%LYl6+P1f5Ic@0s zg`(CD8~nUPgou#RnmrZ_*eJt6q{U*_7eG-uN6t$sY+1MG#@zu~mPQou(U#{U>xWdP z30jAoPjW+qYla;@W&}r)Qz09$98B# z9!w9HS+jPAmy!g^(!kxxQVlx3J-kXfV%*+gYVq~h21*+5MGM3%1h{s~U2&r7dF*vX zMZo-@LIofo#uJ{|P*%&q_mR$#NM5-TePs8laF9>54AaEzvKu_ZFXw(H!_BYnVPzR>X5 zw;ttgEtx)#{i70uv7mmn>S}z0ln-^}JuS|+Reb991$neAa`l79k44_t@kA9{SW0pF zUi2-Uxm%t4c?mnHkacB#J9NbdeBvjZTyXV%9P;ZmJ1+%pmyLVsGfnbh@$io?T-w&$ z#=$QV$tL;zh0<8};fKU!A5L=(?NyQ*OPP4zwVAPTudl zj`dOk*2p2ufQ=cmTF-mmj?)d$v_E@C1bhtESxpNeoRcFyAwhZ!VwE7K8NleSNsku2 zg6|x~6^bN=T4fg}`LNYHOdfEu^qX`47aDDt=(vlw1clDxdkLBi=Kp}1UEzU`eqKg} zr4d->KLrVgOEgOsI|oZaUKwBM{0p{Nfa83=;eIfc3-P1ar3@@sv0!~GyxlnGRBF!I z4xHu=x5WMy`m$UfY3*KOr8J~v!xIT$taio=9?GpJvYlFbnuRfJirf;H2Gt@+P-lUz z6S0g{??G%-YD_uT4)9;qeN>lr-;c`ra-yPJcPPT=y}_T|T?3z;{023MEzK4>J3Upx zQxs1h>HAa4<&a?fCftgB+LWiQ`{qxY4|C0^^MPKsDW_e%1GbqQ7|qjG)wf+|MY14f zhy_#T9{f(TwKgopaVz|5w9jkqPUI}Z9kkRfxck&AVal1u;eNKacY*mNPE&5J9xcRU zsdtCk^x~{$?^6GAc3b}S0nfF7*Ra9midvZ~QO$_o7w-ikYj(o!szh|$Wf$arpihYm zEkXi-&_`%11jOZYB}AJ5jM%aiwKtU^v|@(X6a$ohVu^8a^+Kx7Q%|yT&2X zc-H7l2<5=NHWWdnuW0+MQ4}&+appoM$T2UY zy@01VlkL#=5K2A~HVd_ZRqQq~C}7rwY$Q3UCDS2^L?k7SQ@CxA5YWKyNdS+qDbaj_ z#c<8YxU~mrId>s%uwlg+syK6`YhZRli#576$TM$m+O4i`@}0}MPd_@U*{xM*FI4eA zKh)gL|KHpYnQ>=fnf>N*?%D%2%zktoTz>hnk>)FIh!kL7^XLCA@b>@2um9Iz-qvt4 zK(k#iVJC1vQ}F%6J4PS|2CMNu#woti5;=`9o8#FE#=7h?65<|oshOkGH>J=CBM}7t zWBDP<91}*@$t#7J$S0^De5_~}-f;K%#4Hg2Ea^(MC7@I=HS=&j;( zDuEXzgJ|@ghg6V!kX&E>v|73`1cXd5pPoxA7eGE4!h}9+C`3L8=@+DlnLK|H*iimW zAP-*3?{<;jR131lUq*6{jYf&N{CGJi!-LxE`6HxGDn9w1mRGZmaJp2|ob1l3< z*c_c(f93=$5Sjmg%XfD=;{H%^-eA@+wE!b++U#_=HGsHID>GP$>ChM!$l8|<{~n0g zNhLO0-1`s*bKM?vdP2~v%k)HN6zq=6h$459oEJ39m)nzNMEHwf6>^p zirOZiaQ^Lu9WR>^qq5Mpt3;GS>J~V)O80hs$o~(6qCk_js)+}?ohVL?31E>!z2!vL!E-FT)lo+JEm-QEzwXLR>@y^vHkC|p_pLj48}dWE<) zsOY(AW1hF#%&E_wvoAi^I-9nw>Q<{yO%qaWag5fWXR^cbZryr!(8I8C6mDoN!GrQ@ zX5{DRPwo>7Z4>0Fedp(^`q9#NsijCM(%yp&zF#VaPl2{z&#q}oF$${`3eN;pad-Pj zYeUz!Bw4HGCxTuHIahsu+lcE<>o~YzloptFeAxZIk@kHQjy3g?eZ=&JTFRCRK9-?bDDmFz>VKQLleMuI_vwV^r; zJh=?wsHoIcVrfdvct6kUKcIsHI9&RqtwdafK|9XkFjm-D>IZ(hTQ~P>#pVVwae@Lx zgbBdXQryV-5o1P6S|;kLG6@{}5xSne`4A?k*pzD~`%uc+#mqz+BX;yEX=uRU_|4(g z@NIp@;B|3aDTj{um>w?HHAvEbcJyyN2V)jE*ZPC+B+k!pc=ht-k;ij7s@P$1Z{CtK zN*}WOoC{Rbrub%UAGD<3ZP$m438Lm*Q}IsNK~#z*e3;AuC}aj06-XL+BlY`LxQQB2 zmcO#;)*Y{8a;S_uVmvTkcva8#lDEY+||My9Brc)_`zwJUTS?Q?xS`Ut!Ik|1YI9|8q%-*va$sC;a#b zfVl_+OdN2fuAzlMQZPcEF$s>;{FHaf-O)Pcg>E0C2ojt zEwdOHcT;_N=`a{&;pm~e>0fwi!d-5AIku^<>2uh$r17D9M7)9*!{F{s7P9hAd86S z+5x7#`THxxIYnH*X)qonpA&>DZKa3yQxu^i6Y40y(W5vdxGqarYO?jvZ$xrzrQE(f z$kAO?9Ar?!nSu?pSKr)Ys{9pZG=igR`?M*I!Xjs5*%1XUWcK8?A~2Qv$uSnm6{R$& zR#}UO17txdrmsRH%09VpuFUcVo*nh`7Hw2lIF3qqt*E3?DAs{g%6q5BL#h+QL2*e1 z;R~OBL%W?U?1IbmlHpWFOnb`>nKo{a_U9Xd!{2}5qWy10(F#Rd?SHzQ%Uts5?8ShI zN9iQ0#4!v)2M;k9N@He)Lk(t`NIj=OHdAn}W9vaVA zh=&pNHQ+1ervqC}|F}L(Lp?ry2Fj^ak@5#_pKyPU3ihWMq|#twKF-V*xw=lz#Vuwd z6wiQ*pi_z8eBjCT3vYp4MA*h@Ki}WP^ja+iUK5>Fl1ivwceV~+sg!QUH0zGqm$Z#e z>!D`>tgnLA%PZ=B{&}F1S=JG%?Yj4f>B4)E_IFkFTk_6F{rWl6x5B@hQm?l5-<|E? z<2aCf@=G%GT6KF0c>-4?a+wx6IwH@-1i4gkoKvRUx-}kbV$^JhS)hc{k{Mn->2@>S zr$r2JtYAV_fMmZwZ9-dR-HS0IR0emp8gtc#i=c(fOh(1 z*Oi-SP>9J<4*9K6QLkp}zO~u@;n_7utARq1fhn25W-r|XX0Qm&Ph~A=7<6=rX5c#d zPBywLdzt2=XJJm@6k;$?%H_vV+J8|v+U;pkLwB><`nun2?azi3z+AQfc(H^Nc+iXw z*X=q-%RQef=#tq&fyg0ofUIg>P=R0rHj(A|40a5C_ahH5Oou3duF?HF<`T&t|KX-K z_4TU3y9BTkcJybM4ti7tSn1kgLh2V1@S`o-EJWcrWKUg1?b@})3qj5ZALK8IM(hdkLsZPJ{uz3wtOu^4YT={LA_@=i;cc8M}2lm?cCII-JvNV9I-G)vGD*cK3*E ztoz_>_brOMnxt4zrx$}DDy!*Y?fvH~T*U2CMTf-l#UR)u8$M`T77g03ze>2dzubx%suW}VwS?+#F(uiLUL9r3C7vSH#TkHI4>p|XsV&`Ii=dG z@{j4vEBm98lh!HiL!$pRkyt#s+{$$c9ch0^SyCXd{%R7klL>__|A3HfY z(L-taXfWM9p+<`X9r8Z&1TBFK=4WuEpTbhO!or284=eUhQq1!-#aRY(UGWtb@+a7z zd4g^gTkP3XRKwqcEL8#kaKYBA9~p^4Cp2V43LZ+Qh@8E0ngVpxbNRuPhKXf!rnUFrA z$@gRCeK*#v+2xA&KX0A;^OH|^oGGeUJYaENZr|M3@3v(`#@pOktT|BjP3+abW^B92 z$Vef12k+Q%fHF(8b{zLPUY~1kP^@FG#)_do{GhQTLv1F>8;f*P{0Et*^xKNo)?Qu* z3I~Egi&Z&2q0@&h>2^lIFPBX8s%dx%DZ$XtF!=KinVFg8qz8#hHnsu>^@D8VgJ8I-bk?#!nuBV!x}3Rz zN51j1w6eM;BqTUhj%@i5S`}J0SnGukHjc}^1^U9d-jS=MJ&_8niQ?lLt9825?%3GT zvQ*Ht7}3ZQ8ao?v3j(Hf(De)Y6%`fv!HUX8iUC6>h4C6x^jTOY#efrMy-U5cAktfF-yqT4gzWcoxRryMat(+>`h0eFFkVj2dO{;IJ88%=m{@Y+z4G5OBeV!XM7y zcBA(`i(?>}wYG|fEsO$!GP z9GGu*q?9LVH1{dv%7T?}JYs%-&!Rqssiy7TDH9jm`^4%^Gdd|`8^VHMaR(bd!|W&0 zdGYgemY!^vX_!KVJe$Q>+ne0$c}!Rr)iz!Qc1xF@Mq2M!xb_dV`?b!UJJW)fa!U$S zs2}3l#FMogIWlM9>%85x*2|UiJ1i`f%{|ug#pV zK*KRq$$Af zqXrqAHK}>VCMH2jY!-VB8zn>0kfkr0VD%$owI^8ZWRV^HWtky`>QP3_sm|S*LXq4w zr*qveh1EiDDLAnW)7j95IIDeNZD5SICvS65P!rLMs>2h@5~7E{v7apR!jc1tO4WyV zxk;&}jkST=qF}PQo(sJZWz!5x2*5Y6T|E~&;~Abt0$XVEi<0L z24nx2LouT9CtJkbCo_o-(XqK<9z_29I%$21BT()#XNziHgF|D-E zphs)YvXSsw(A937)LfJJr<-SpH@|xIlxX0NxIFWT%c|lyJAgTScHi2+F>^)W*sNvK zBA#waf0ekSA4gW|<;w?RMBiUiJfO) zo0^t(#A)K9pPt7N!c23ipX!g>o6sVn#A&>)k_fQcU0-2PlL9Ht_nU9N33h$?@}+4m zKH;`GovRX#`LfTWN+WzUpW~ahoTL$q&wpI54xlZ~f2Qb$lWD3V`q1K`BhV&fc~8i< zzL{BPo>Ss?uW$CVU2?p*7}a*xRL5DW?ORNmowghCs<}1?Ne-BEW|Uq7+$kv?uC=wY zVvhN4(pW<7!V2faE|zsBWw%;8#xEx?ZqeiHh;=D$M$OI!pFD72Xi>i>kF+q?l@oFW zJ$u@Umhi-7=> zG-#wmh|Gy2O=@NlH>%EA*-I7%mty?Lcb6_*vK=~fxzMiA)|xH4uD|?i90vxzxY%A3 z5TPy`R0SImrzy}65PTVYX^A1VqM5PPy4j~ejxksC4M%E3Wu@#~UJS+bQlvBzIKsLMzUe9lZ!Sf2a+ z`jCbL!wL3+PYW){ggv+B%L%4pPDUy=opWC-zbh#2OK?oh#P~xT?)V;Ox=BD5TB1s& z8pmLX5x*`o6i5vKK$Xc@k_lc<&*bGf4aB5D^5c#K@x(v+Wej}1P1(79`ym8+)A@sY z^|D*`HVxRAEV^lJe_?^oTKdvJGcy(s@M3RQ8Qv|vzUuN@cdG4p!Tyw7?F#k}NVsRN zI4IK(16uaA1_6)~X=(M_DdMurw(p0Y3V%3}xsjHDr0t`1B%T~1zD-U}u3gI8&4lC` zROsvHmr(c)6wTcuPnFqz{Q&C&L%H8Qr(A9+x^roqqoAx6Y(AMe@f6&1Tl&Zgb#2W5iD#i3#+kC5Tc;%Z7mVt20dq7k8?q3AlVV53X=w)#W% zX=JuCw^{U}C3xkGr4S%^8LK3nl(|1DHFmEU#Z_G&ToJARHjnW5SFfimtS(GXm%AB5lX0R%uFl4+B9l}#@?ypIB`*17N_0Cws3rQDM{Vtd< znJ)L*Xb)~L6A#7x<*v2c7B@E6;F;GOdnk5&-R)02)3uhr_Lcsv+JBVnJZY}iR{KMj z3!iF!i@)_B`cd<9y?YG{?LQ~4`|@L}f8JWfM?BJXWR6#u5zC9iYRt%y>wv7fvZ+0f z>uS3mM!kC1d`7|SR}`@csZ$sOoASNWOcSVteJS$H3aasw@g$uP7r@|tx>Ih(&JmXs zls(}*DsfEU885u!W)^JFAJM?T%4cVY?^5oPyLq`qYcJ4Zw~M*C;^m7MJ?P(_JAa-5 zsj{!KP3gGb0?itkNINf&xYjnMv1*ci!OrBfn%oNDngiI1IzvF1UcdlP?0hCSSP zR{vuKvf)y?q7rs7r&KwSKC2UuGq8Zl$hn^mP6!)7_@t*|sKSsT>bW`nWwjDpE5KpKwfd=@L{D2h`i_04uc0zRMS4rYdcU^vIK0uRLkG+$Xhbc>6Ph3X+xFl&6OeA zi}oLy;ZY-*_TMlyX1ku1>D*qf#|I%|ud(Al-V6`Q9?b4J!RQ&wL|ohc)ga(;zx>KD zDVHI~b!T`FOH!EXSI3iV$-{#;ZQ2X=B206$dS|@3<0;+hp|`M4dV6VBImnDNxg3JL zY%qZR*L6(-m&9!``4)BS)Ttx47DRL<*G;MAfDID>19=rv4cKQ64XV4<8^VE+$-LD` zmyYSa>{bt+nqeeprZ}^;Ui|DE_>Z0X_aDD}(#3A|wj+3@ObT)QQA{UjjAkLWHlAN! z`z^0`k&J#9NwDTzrZU7n$(QrVdfd1z{Ev86&?YM0v8Zee2iX36Bkk|GyqwWRVIme2 zDCaY8&eZ-?5wK;1sh$pU8lCjlZtw`S^1tM91flUBDkb4of(J*v3Z&s3gm}8Bry)eQXp+cFHe%?o=ZbMo-CbYjSF+?*e$PXu<>quJjM2P>~*Bh zU9l|Kyt%pl^51C1X~w6xQ2IV9sBC{3_%iC>}n%DBzey)Wf z&u|8{w&BMkezZK*wQJTKnWsy5{PPcm4zbX_T#+@nhVDQA#R=cL@{2Ddjlmko8pTWe z>yrC7$LW4~H7W0vZfnP#(#g%j%DfgR-jMia73<((h3^l4#gYbE{-Z+indx~hQhKk=iO6q8#u}&UsdMJ#NU{*W`_9pNd4)Jh0oVkxf&z}7*ZSJ;@ z5N^;E8!P`3zee3UeyUscO^-w>Vvli)lqn>nsXBCBaV&C79e-G(!Ab<$>3{t=W%?q; z4qCZ?yr!%m#yS=rA%j{S5Rh%v^^}qav0=l8GJa3)gRgfQ)N`-Ji0fFxq(5i^qZ!-kDhno_nY-~|2?%&Er0EQ{vS*S{(8%~hv(JI zH8L^bz%G%oUM27#gpA0asKw{q%tU+Ed*2Z46@)#Hja1Ag#=QfH6YC|%+vfFlXFey~ z5C+`L@>jk(F#elweiYL(ffOjOtf?i~cGC2Q={=3q5|Pp9IA4*opluPRkEFab39^!w zEgSgix+~a=Pk7|e&BwQN-wJ{Xp@$`@ZPV@Ozus@ZU!TTXcD5%QjomAbw_4a z3wax*k4$zpeuA&~FlwwLzbq4y7wIa*GAn6h$l!axsvc-d*+1C}hJLNPm4W0<4xxnIA8^eSQ6(kfGjb2mfkeo&^6coMmS#-2>N17*hONrch~n~exSX#29I5O8)Z zt6r!&H|Z|zqv_?XwC9}5Ru1X%=g&8Wd;cCX5JFO{6XV$qWzHdCih8DhrkmI=sjR7o zMFIKQ&Ni67h@eO%J<9l+V<%6ZZ1Vg4a8)2CWWZ%Vv|f1DdxY-fy>j9P@mnTXXVNc; z$x~Gs*DX|vuUhcBH30#^V;3hpAJIGCZQ%!8^DHeb)k=CpF{v3w@jEwf-iK|x*=s5y zJ1?j2{{e;-KGI%#@-g22P2!!Zk@TY9ktKRL7EkXgnH-s$N-eb^&Bc9ro54z@7o`qg z(c15#nX{Tq!Xv&694mOI?Yru@w3Q{+9S03^zH#G*?K*7?_b)vhs)z-M6%!X=KVMIU8`)E25!r1(BvScOt{WEb#EX%4$y=uyex(m-qu- zFEi8u-$vYjR_0gIeEFD%@mt_R5^ha6upq3qOaXIg%vC|Psi4GhI>PVtlD zUzL}~yqGIIzWB?jsna*~%kJFjTWvv*oWP^6ytcENKm%c`;Yol3QGLDxexF``a(^9v z6s@r3-G5y%cbN6`=}|JNmLC-XaG1_T$&=w-djGz4;iD4?3F8i6y>Ae%OLAH?6eutF z^YccZrMB3OR2FLIIJ&M!kdX95Jv0#eL7Dz4k(XIXRaheC@T7f!PK(H!a-J@I-9POm z?0}Gx%)K@3m4gT0@m^B8Dm7OSxn90eb4xP|JlS-fAlq?K+9c9H;ZUgJ%8Xv)6MwD! za_`_Om3*EuczksUqC?O%8$5#&W#%PXg)u;7S6j```%OwHO~$1^G2c5+1KFhuWcP`` zZFb~H-}gFl+uie$xI6(M*37;UdVH7TuP4@J+n;)M(^I|rjLfATUl!aTE2{s7-Q`ab zJzw9CwrUla@?DrVOTM!5OGU5PtgNx_Zf?V*wG!Qu=Ig|?3WPVNxj+C1pH;06I(>(X z+3a<(b;q`C!_t3jt3AY~I(@1z*c^E6!~VlvOiW_DpU^NgUfcx^KCM}Gxb!9*+anZE zGa_y;sY+0MZ}wc8udT1OwKb_pV?M`*h{3WoM?Y);I42RS6K5y9Y__in~ zDfTFs#BYvOZ4_hU_x3r%7>r7FUH@Yl4{IbtmmQ5^rtsH9yhA=k$K8k!2l_3fHwgjM z>e6SuS!yT#h_2_?Zd3x47cu;7-|ReWlLP_!{e>ULlzSP~<9N2eIvikZ9O$ll*`tRK ziwT1vV+Smn4dT;u>E*c@13O0capS3Z#lJsv=+L{giPh~?D8D=CQq`#sW*8|JbMlv? z$2Zc}fHcU+{$yHGPpXdkSn&alQ~q;G_}yRCvHW;a)uo#=?MvWW;`Fm3{C?vf@vNlD z07(Enq0DN8>LV6H(%)AWt?OTQg;YE>>oKN2(q>kXk!bKN!ViU=rBFp=E;C(bRVLa# zpKBv}+g?v2`!Y@QYu42{Mk)@XA48AUOSepPW(1T54I0S!)Kru2KlVagsi9-%HC77| zhANaZa2PetHFQ$KE`}?!NuL(nKFMbUGPbrBf`i0bpk0T^ms{S7V+0ITqk#iYrOu&+ za)o%94HLurHHj?)PAB!XJ<*PeG#9JU2X{v=JhqjVYiw*cD)!@lyoU-Qj2}FWqMpPZ zXw;~YNyjD^E?mfc8+7mVT)UhpuiI@^m0N$;)sYrTYtz zs=BlIWx!JUj-QL^?8j`0yYlT%~>IGlHJDZwd;^`VRn1$Goq;`YPv5=&oJuR8jL% zjJ2o0Gf#K(6h~r?p$b9hf#>Fiu2wsA73b&>Y89z^>z%oRA;NxchkgHQSjS=lOKXN> z&$nhjU3T804Tm$eh%h_d-QA~wwoAjs7gd&b0qB9o22{WnmSZ^^)>2{C-ixWp942esf{45eJeK{FH0N3OGXT&vXL?;^SrDQHVlUAq7*r zj#g8+2=X|MjUa)4Qgf+!z)KCuyB*Fm`*AwJDU6jPc8S`r?|+HPYP4E1-4iGJ&>b8q zatBf1tzBDBWlfgrON!_zmeI@~1J;^RsKrPXid!CY^}>{*bVn{Alg{JDYXh#LMbE8$ zYw2!_Mb&?bO?tg)?Jwtx6k~vb-cNJS#p!rgiYAHo^ui`JkMq+3p%(d+rOz057McBC zd)12KbsvF+Sl5;{bU@toLk5Ft#+s2ws>5mc;>C7qXa=UT(vnt(-||Y_|GS^=ZnZGx zVKHy43ow`PIwVqDHRr4hdDQ0C& z?(5F5+1)_FXBcbTk^lN}VD>A;0K)RGPYGyg*RCB&ok9<+sewWCCTBktwGbqw`d8a& zKkdq6M^i<;&ptDHy<<{y97D(M_e5bIG3X=8_+(vnjpWn@W&1Au*qR6~-m-L9>?Y3C zUBtX|l$0peoE}zyk{fYb1(JvD6FdkpoY1ofEuDMxIC``25A7!=9}ML!f%QWcR)MTr zs)Zf^Q!c;7-z(p{aZ4+o|DbC6w7w3q3iBepY1wPWW^Luddp%kAbDV+pJr!4G%aOAa z9z%&=HD~yNz5l>mc2<{n3?06w-{4UnQG_7)9AQfRPe1f1S@W5%(0y4B!6LbA#ZLe@qjA>@y1q8{PE&-cxpkeZQk ze4eNF^880kAFJmwO>C3tBq0E8P$U@Yy#9aw^HDBFC@#wcBXIPG9QlJC-)5j1;vs z0ZLpXtZi%zRqF@57*=z>E}iHxQi^@TBX{L|LH#oul=uOR#CK-KJ{|DjKlBm{)POrT zQ79)uyb;Ng|x~_o3qTt4wa=onmXO!w2s{rwo&@)OghswJ`{@B{=MRa zX(WFvs@i?ToStmvB!rv+infJix99BHv(qnh?9gF4xrMkz(24T;3k-AxU6X8H24~_* zykY0giE#y0m6blQ6Ws2@n z3fy^5svV_DxGK-h>D>h?`8xZ)(Xss%E&8*iyNZ_y+R(`7=C^O(cK^pg4mz(62b|1( z6AE2JrCzhf>gRIZz3MTKyUoCMD>Vs*W5E>20bNu*`}NTM^P8Tmu-P#FNmPV!k^Usw z(!*nq_+zrsfY^I4{#kdS?cKOg>Mjucpl#b?uP`Fx`n*e!^T`;l}D#90UA&6#*M#0 z_~$@4DCEZ?LSgm>Gnjx&m(I48}0cQ-s#Z{r0l5 z_(!R={Hf)$>C&3gS|h_1?nCbcTkS_BKfICE=PkHifzu$n zgZ4wN>;qvxLDqsn1cnOViRgw>KYED=A`*2tg>!G8McS8I?3M)sQBs!0qE|C8>&to^ z3JqRm4c0Z}m@f467{>zbpi~Z1(>S&*m}1$W`eI7Tv<*A7@8W;{GS6P>&3Th{o zYyFm{VIRUo%!R?OY`ZW2woUuvH&6#)_ahT^qjXB6c=ZUmD{iVMkgu zQf6WV_t)L!8C&U7n#_SlSbVwv(=0MI$=@R)BH*YFqw{AC3RzfMImBdxx6I zji6Cy19IDyvc*iSe${P~$~IdaYg9t?OP$dx_gy?k_f(#K{VO`y`O2FcV-Zx&CRA}utqQ%bEBX3YF&B)k_i`7!x zmNB}t@0MGjxk7A`n6zxeiXsvUw}E9yq|-zI_k~8D~!Ddl6m3sSXYe6^}F^VnlL938&x3 zZPr`)?rc2^S&*-O(f6PFDYvs5z=KrPi~*q-`vlwRVi-U6!-uaGXJ^`|(QIx3-J$e_ zBdr^kSlFWb)=Pp$C{<$2NQG-u|AW%@#KC*0)uMr`Rp-)HTCITe!Gs7-TT7$ccf`7^ zX^s#Y4OKG1gGZ5?-;f{<(A+h$Pdz8h&wVHA`f9z>*=^JuG9X803bWe)Y{LN_OO{nX zS|+!X*lJIKl0$3Wz4>zV6m*cHSf5vJ?za~=rI6ScRER_NPst)xLgZno7HKsUCc8df z^qVoCT%()@K9MlbdkSB5moOOUxvR0V`_&iL^OtEo_1emPQdkrSw*cyemYMMzr$#9T zORTA`=6f(KlDQg^>A(XieDL6LO2?g9@U1)}4tPF-PmvU<)M7@?QBq6{vEeKdf`IG` zIjW(bmP-$pMqJ)Y5~?FkO!8F1A zr52RRt;<4YG%;$rVt(%U3*FY5Wn_Pc_9-|?9T@0ot6K)X_DL5KomU9yJ8tQDgq^Yq zDaEfTT4k@-w$ZKB)BrIA21x=1cA!|6Vve5_3ql~VfqgiYJY2l(O?zVfr9-D*enh8@ z<{msn zx44O>ZT{&e$%j&}UOhD2!QGSJPCdD9<;vJ?S>v~0rzVn(w6DL`D7)edL%e%3z9y>j zWagqz6A}~cZ(0GA#^0VkZg0QbE(1?X5UO3T`RM4sNUonNl5h%;ASEEo%WBX``wj{r zq3>AwZW{Dyqt2Zp)77@)GfCCV4)U;Vi>~)CJ23=$x%4%08ZwR7sDGl_bY2#`c%T|sk!7O}CtH5Z&VuP2?Q;^+Sy|GD zrEGSxjr@JRO7Q7A>pcNvPdLsaM}Fwt_Xx~`kP>y{UyW_vEycMZH80v~yT89;>-Gsc zEWeod|G!F0a|@wp9C2c^C1lQl(q}n}qnGZV<81~CNpDptd7tf4JIJMlZ~rq~JmpwJ z2kjlRsF2$3u=^UKEcD3jWzh8KX@G>>@Jyx+HU^>bo zAZ|PGmC*M*Ge5|;hE2P+fyOcK*HZ&t=gn1z1B;4od%=~^sv9Vf;%a( zl`g8}lkdoZMR*#lUx1*F!^P3VR9hNKf~&7#gG_2J17QNrGhx&09Qg6+__z%cs3myNQ-UV^nrU<-sq8kfP>DAWN=l;Xtn8nd z%~wnRnIibW5s6;27`XUxGCu zQ9uVy#Ni+{E5q+!fw@zJl14C|@cR)-%pSQybRyA-fy;z*>$qs&EbDK-{fS&w*|g2w z`|$Vo_FM8OCMM(9m0_h@d!N%1IV?^^9!xT?8F3@MUNR}#z?bRfWLJ{12mru3{lj}1 z0qotABN^pcHlxJK0E|;)t5iy#e$Za0zvcCGbeKJ$)snkurYg~1fMz^B?Ot1=@zJ%$ zp-1~rV5X(SYkxzLDr^Jm=U+D`Ezcnn?78^OY}9aIaSu0XI`|U#Z!;9fc)pGdNtoQC z=Wt(YBWa$(0-OrnhXcxnToP12foSFCU z^Hgj3Yv1Z$a9ucdoKE@0A;6wq+DrGLiHKS5N=KbFF=gixJ4h#o|3v;KXy9{!=|z{s zsE6X*gF9u663#$3Zhiz=1Ee7!fQX32_`_)|R^A_;eyAEOUN{hYNzCej!uxrv4rCRpL9 zL2tv!0=k^(=EG~H!D~k@EDlC;wsA`5cX@-^L>+%aHjW5$XHszyOS74}BTYq$ck&yR>`t%v!mlX5t@v-f zBQaQ7~6rm89z9cy55-$lbVa%Ob{z+`grEV9P&P{dw>-^S8J$3 z0wW3^0UV_W)~?ivjH?ltR`MI#7BUwHu!hJl^{*sNIbJ&9POOo1P=rMWc=0WnlRYH% z@cW@l)lx&^8#9#_1x&0!rC1kHwaG+gj!wDZG7KsK@M8Zf-J2;qg=_}ZfXlop=owlp z2#w>vP2wg@Wtt-Va!J?6P77dBj}QPsA~U8>Z-&O{lA-HL@=0J$)e^?-!s}3n-@mbx zmZE%+7+NkWi~nKd$ey0B;kbqHH zoOjM6=OPX%W276&SDjI6_i?ibLo#FVhZr!DC~)!|FWu$E8n7&x&o)j?i8HsPmk#5* z{v}tvsG`_V1vm1ajLL4nYQX6zwPNS#pc(&sw%csPfPVB5<9ti(M5#^(ILAwuqE0Or z67nhlm||)00)mPlT|{OC;q_vUKt*zqOfvNmw(s6QeeexVKEEJpw~Vo<8D|Fh4qjkXzO(Jqp=fz@vcY|Bbs)8?^<+HdXbyh9*r zxXyXWBXyhW{F#)S^@H%^4G^WcI9>}#E};@lLRwW4!*e;wDPhIvl`>tlB6x#SY>YcJ zSNFi?k#l!aNo1gV8pD$_f)gc;UQ!(8G|0qi)}lr`AQ@2T23=dk!m-zpS|`pDuSB*f zITTit2SLF3m_qwu!&XWb37O1Nh(IIfMt82+21Kk%K z1lHZWSu=ZS;L&CdT3BEE4;tkJ(P>=iX5gxGXU~Fu4k2s#tbTo4YIQG*`P$c66bJ$? zt;>Q#gvM;rNHNi?%J@*Z9%Sl{|Mrg;Y`=RzEy|wnq(zMahdItoS`A*B_a|+=SLB%5 zSWy%eMc%0@o1Y4g5ESMwig;j)nLG(i=V<2blQ;gN3k!?bu%q7IJ$uIe$*Awuvsf{k zd#eryZ*%7!_LEr4yha?P2 z5!wShh+-R)8$q*Sc}c6D1Vhsd6J)#V$!9-RlL%~zd<$)V0u#lr(jQxJCP@ddxOhVC zhLLC`9S710r3Q@_TSh@{e*dlV?058G;q@ko$(W1;JJYQk@4tP3En56f7;R!dWAD7M zaQRXl<0{$C(YL-3l1JCdAZ!4x(R069>fKkaIC3EG#e8(=I zBxt!GFEZFwTKl=E_c{coybvWLS{8wGk=*0GxCyIyMh3`W5fZxJ&hH!#Nl7|8M0Eiu zkiBO|+H@3Hm)&=2-7H<-X8hz}js1}ZhnR{6+c&B^Nn!q+3#~Zw00#K~LKl{br=Y-Q zXKAm^GyxqvOmlv@F~bh0c#x{{OTF)O>fU_}f$5`Z0b%OW=I%p0j>M;mcY@5n-m&0* zUGTsW{1sWT3?PhiOKBwi0(Qfx+Xr=BAOjaJ2$}^)NZgLM^Y^PCaS{oyjb>2VrAzw< zjhiuBht9)rVTxl(i-9ly_`K^>&2SA0D@l>XNe!CT(m7!HozJxQ;MheYJ(m=9F0hHS{dV;ugR~vX3?;o6 z01TTg8LSrvYa#Z@*6V*a1vr`><&-#YKP|YqgFAE>ik3sY`t|5?^f9rQ5vER#|C2hH z#}~pTVuHFHhQBo55O2-`t%wO!GIB#%Iac0>YCxR}h!MU~Mv5^;*mND+-;m zW1~`(Qo+ZM&kxu^4BT9pP=0zv)6RbZ$@Yvi4S1*BIR2%FEER9)3Pt0FA;6;eR-lj` zH*gus$9xtDKOD=aiqT2$(R(XA%ktvMoUWq5_4Il6!zzJ~L&n zM;bFsKG$}7BhP1qR6n{edYS8pCmjx;YHSfc(ii+9s#2rQ&(qX@_Wt|ThK$?55^1X3Vny9SWqI=jlo;DdiKq`FB&U|j4>5Wr^ire zNkfg(QR-ZTVDWYtj|vMN4@CFxemy%o+k5-gt+(3x>H^II2UB{CGErN)Pja4~JUM`G zATtxdz-@jlu=;7RsC1a)J8Ho5vjH=XUzYDop5R1#CD-`iN$ZkF`FVLJxg1Ki>n_0# zasqv}cidZEax*LPa-7xrgTdRjrJGo2KGEOcY!s9rX+23sF1Gy3s!AqGlf!2Q4^bRk z1h8T3LRI}Ihs#7#E(k9Ny{&>sd* zX}{EoIWesjmezz|Av&5m#9Bxigg{>`cfeToQ2q|w*SB)BFcKZ2rYLH39z$NdFLiYcC`h_HLwU839qkVLa1mr3_#er}C zcCp6YzL4bAZxq*) zL%L1`;)trWedn?PdeqeyOI7}`*f0|461l+RHl%%{${5aFM~^b$ouVX;zk~5#T1+x% z*|%f}!LOVq6aIYP-PYdX*!s2n1I|JbL6FjkkyS-|S&8ExF2$Qj4ptRi84W-^X*+&H zBh^7LT4bO=!pJ z9?0wSAsaW%3FTyWcYKNq8v}}JiQZqL5VTx+wQb!!JW?Uw5H@yf+cv{%>oDyFXVoYg z+5QEoNGDU%5h8tg_4Lj`>dZ|B=J?2+LRuP}L&Bx;0n$>0(F#=r6EULAT)_!s9y02H zgxg8F2EVAud$l7ip~wj(X3LZ!M$e?8e}e7~Vw%gWjX0ko>%M))RvpZyTfs?pMd0cB z`exq|I@L7gDZ}=W#!aR73J7xIn~&k3eu}oU{;Wj3VM7=#2O+PVBX<+q<{ zO&j6mVpMYW{CWO9WcB*>_OPs!GVTl|&RCiR09)_Jy`~}|I*k4(%a}30w!8H8nr&;>FRhWMs#X_2Fnc6sB>- zJ4v&ZH7xl5*Y%FvaC#WWu}|^~du_~KKm1a%$*PqqnM_XWnCTIVh+e7P>ajtMNMX@8 z1m~RatI()*(8yScpNQ~H1^1=!#U)K*995oBhUjxnCzbRqreX*)s^!mzPAz9tn7B_f zKSX{9SoR9njt=bRxLiR;4J+yE2M~9qQn%}K3{nfoPt)6L)~?0k2|A;A+lh=h{to6O zLd^qUTt$^7h7!I-ncqV*i7NyC4KvbEqWy=?qT+7BI75*lgO_E+)9PG@pt5b`g7v4l zRdy}l=5z9ah*+0Z!Hb8ull#Jt3wQq`sS#E^Te?m9sb$O69~@58z3TTGaC5Z2cGrFo z$@`%vZ|6gJ5Tf-+UoOPNyrxK{_(rzW;~$4`-I6bhu$`LD z@W>4lXa%Ugq~|Q7iy$UFoZirog_qPtbK8Zi{k)6=X|6MW)!9 zRWfJJoQm5NpHnNfr%KbVw@k0n7nU)c7)_sI+n7FW1}U&_Uq>)``9vI1qG5LhN261o z7Jr(=JZ|TNcSrA+mzSG~FvQ(sGUELn$aO3?b$ImXQSRFZu6zrfpFz_Mg~`S(TcXIr zz~}L2m8l>wT~pK3v#4={f`Xvee=82=c%zA(e`=Okn9!gjUInSuyRZVI3_12k#wpJJ z(9lIBhiH8sJaBl`_z7Vm_fg)lXzXjSY;QS zB~g6}IL-*L>H6=<+Y#)A4L4+3_bnBOQp8c*WzNvGAbsiSdN!@7Or` zN%A4tTGFvl!XF9(j@^W_*ER@Rq?yw~r)|Q8Oe$A{-taBbrk!M9KrWG0CeDMvI|yY4 zVWv3Lu;gS_xfgGG2x+u$6Gk+eOMVY{#aJ_+33u3=m42}rw(|zcChLd3#5Lnq(6+HV zZ6oABb(3bz_M#Q0a|x(~Kg46$Jh}96#94##G{fD&-epR?gr@e8*-k) z+94N>K|lyC^dhE};*m>kEzO@a^N5CDbk0u`Rv_0}Op7#u%dtU5KfNL2s|Is8XLCZ?;Qu0mpR z>ARsl$NnET78qK#X<dC7$|yj1{aOY#)V_L@nTwri~ggMP!tS!CC*uOg{LM86t)k z_4TBQVnHaFH_tG1?|KGB$oCL9a*uwp)I@)3O<%=SN!|2!z6N# z0-6y+>xdBQ()g!jaZB?xiW&`+%PVGmVh}MT~+0$ltxo~bn2DWvi=b&9z{w0%p zZIzmcHWsw*&YYoCmQ>S0N@+$yYo8eBOBKvQ9l3MRe(GqB?9N)*VSfGuQiw4K$o!a- z7~R<3)zuY8|F6;Hi@-#kMeRt(J_FU^l=*YR@z8$W_V@?-IYmfzSl*#xQo(S()Ooy+_+-JkS7phvv9SgoCk-&gT+#!X& z2q%hiMQlSQ3&+Zz+@tvUP5|K8W*yFStLNGK$BCN+5g3(PP*4Et^?zp&B>4#(!ck#- zYGR<`8G%ejadFq9s|FBUMa?4eCT}N#zxcCYv}D`2OOGC7+0>Cfbvr5)$pK?E?gOs1 z+bR?%y5#QYRm`k)eiv13)`_7MNrshkeSF4J)A97Oh-Z)}jqo{Rwb^07MQ2q4uMm2I zTc4Z_L0#a`kRdJpofN5(3m_%yRl`D|m_6ZN=SbPlX$OaW^RsZ01-eQc%(+&DsQW6U z1DYaI(-6IFPqge~W|rBg8e*s5tSD3>3zyPw(9~&M7HGWSJ=tgzEo*+yM~8Kv8#|9G zDQu1bdJ=Jtz>_4J$l)7xmE=GeWykZpt$w|?bL?W5Gwf@bYo|JQq&7oHoV}c2KH$3Q zxlpEMo86mOm)j=Lbb|)xmbJV|i*&o6;FmL6iHDbew(a~4-_}Jl!bgnvcs*fJRJ3L( zi)WPh`dPU+Y$Q|bgceZ7dO}RfL`XU)7y?T+VsB$M0xFCWbI3dzL7bJ;S6p$&@8hvbD^Z1}%i{ zB9k&RW|*;!r6fxvX-^7;WEqVLNs3Uz*jlKFBGq|cH*?OM=QYps%|NyYks!g+l9$#|Q%iCQ^Y|TiZecK!j~Kb0&kg8An0$J6-3x z*pWn7UTnIQm6dcm0J>28i4sYEs?KP*u41&HGMYW;btgsbO^;^gJfa026cywu%veb+{S`4az#{ zBvu=-g~jc>>ywW(xnyWSnp9-@5` z7cLSwF-Ch(UTzSzJmEBmv;mP)iV_x`Vai0IFG96PXDlsffzCM}r_##Bm*mDE=T3^i z@?Rf4(&LB#MG$hTI03flIx>vfrXYF>d50uXQs@xaq>DrA@&zQAf{A;1y0}~b0?Sg_ zMkWP{Trkm7@j&HB7wQ8{D(+H2A8EnKvKQUVR~M)yg-0#`3)T!6Gufb#*EhM0xux&z zCEv@mVvwP`DKs5~DL`6g0JOxeAsBCAhz(c-Da!#8u#ZP3CN@*J_;Uis1&cu^-YkcL zXLnq;e!U$IR$wR6+!ejK*2`I_6xp>}1|dp^q$RJIJ}*Z2I;OYSNYXIjaoE!JqJ{!a zGGI{3J0C`d!P|t~Y#|BSRf2`Inv2quF*rs?)6|M)lL)T{|J)QB0%8*&ibQcIT-1q% zUVj64cPdVvSU<8ZpwPWXpSQ>82; zN{gzDG5e?68Dp;nC7;AjAN6P6V024C?vSE2Gs$!2VreL{G|Dka?9eA5$Pk+iX%rt{ z5{@nrpF^jZ?rMs<;gI6xd!r`7)+~Wcs-Wx@x8o*jf8DwPzQ%uAb2*fohpVs}k11Al zzMKtKc@jg(@>;x#{Y&X!K(^C2gppYATLaE~ig|GbcQakK>Yo;4TDhjV%ik`mrJi-Z zqzK||q4kW?a8}T1i{k*lCyxD^0?{I$HmmH56TX#l(RRC&4*N)$ z&x9cC-znkR8$#kAxRO2Hh^Q=SFe(wq3M$i z$XpVtM)7?#Xc$nz0aPPE_>{f%=u7NYd~PsR*T^V-Qk`$1qi<=@oJ9*0uhffurU=&a z0@a$6RLqSW7131dxO65wnL0DlC1mOL!o9=p6`o{%nk4}WeNA5(e-Sh6&DK8jCfS7X zmm8YB{Ek~%^&VdzQ#SVVFoRF{q7#$^PJ$Mv=WoK5g9!de` z4YXxmTvb|`j6piPlFqDfTx77Pl`V8&gHMJJ=Bwd-rb-Rf(DWmT4c*#bo~4oFDg~8T z$z>P`3;<~oE$>g^;q&6$w>6G+WQY16)wm%&>bj0I>7hcw)U%??Cl88w?Hc5uWt4aV z8(>D%fpsbnyhu@nL!Q4N@4z}FqpNlNiy`Vtv{DW7+CATX-;(2um2v%e$~t<-*-FAW zcW(P|6?qIgl&tjwx;2W-27Z_DH)7s+;HJxNNU&#QfhWs?X1lMNnA#{2;RW-HhS(}sTp77hK&_krqnO8T!q;~Sjt+z#K$N8YU2W8 ztN6?eOo$of-|^*L>~qD2$>7x9ojYgu`(Rri4UO-Ys<~Lz>2++XWH|8AqAP6xX=uIK zmNp26fe~U}y%=JNQL8|9W|_D)!eBzI5t9^5PF~ZZ~p{px#d|W5Y0!i_N6ne~#-8w)e2;rZUC*k_Tw{vg16RM9AxcGK2o z*6yI8L$4)yTsw1SUslFoKytc*wxC=gwXHQZDVf6Hq6v165Iz@cHQ2{@hjX z2Rty0+#Eb8^pcQ7Nkb3NVUy{^eK`G))_GpIG-MlE5svmOhg5H%_cO{Rd{%jGjHhw>O2{uCttKZivj>lQbso< zwL;85NUD^o4Xe=Y1%7|kH!gM>?;@sZXHOG8-D#S;VT&fS9mr-K$une11_hnlC*dCi zHl+GoIl6Ns&f*W+u7EfZRZ}DJqYOap*tY@fx#`3NoYnh+7K*_-9$&&=oeqR^BN~4L zY48RW5(dif`GNkx8-GQ4UrN`UPG~MFJjwe^tIumctEm|{J@TN&vTmk+cI=3s?7mWH ztM#l1;X9OB4QxGkl#W{t01=TI$P*%cy)G7{NQ+P3u4&*Im*GPcC$>Q(UXuKZf_~A7 zCr6hmNvuUzHgOBjIuggr>`8kt8z~oe^0%&a5n$yD=|!X9H*%Pdg*E#kv`?w%<~YR+ zYtb!*vEO4jXauEY&QJ$B8G3q+^P3Hu!SLvET~6dU&(y)G8E#ae@WPoXHjbxVRp&**oUJ1wm^$ zyCloy%oRSw($fwF_g##vfVB1wEbN-|p8In6MDD{DF_|LhRI>!%D8JIMTgaDF+ql?_ z>=e0LHOh=`LBvYm<T*@b<@t^x*XD~(H~3^LFBZ>= zc&Dt?Z?r1OSl!$pb|`Mu(rA%%37b25tow)Pb(hl)cm6F<<_}oU&;JAi{GboK2-$ez ze10drvm!K?N+{d8E6InhvvbK(z2`bAcMA*?PUY0o;~Cz#EAL2?08OlXgLD(vc&Eg%P!P;yx{{@4N3a&+TJ&h=#yEzCz3|S*-LwT16Z@s817&P80wi zhO?WYc1gPypuxFzK>UK4SX~W#Ug@NNB4y&=CPLR4DLP@h*$3%IH&U1)gS87j>W(|y zKZ67N_QV4+p=zbtX-oCM5n(mXi3U3dEGGfWcKVvLE+(mf9U&J-%+)8g%?YTm4r-j? z5XmVi+gNH;VdVt0#mSXBQne64=LwofyFgVf06k@<3#qa+xwuDh0jHA_bb7(I#$My> z$uAHT49+euo3adJ{O|{Ug*et-Zn%Z)kcpVe*8Rb z9d9Y4gjX#Sp!GBBnWKqlPlnh~YD5#1#$%*F$xOJErW%sFR_baBp9mf{OGA<>wndE$ z9_gIpI)DD0mzu*uCT)*bL|aqMx;~siZ5=(g1vR+y?6YQ+__zW&vY@xJI(Xs&!4f;^ zcO5S9SGj?fD0g%l9lo(Wj7LV*}5kY%t-p@r(nvGba$jzb#DfTNj%q|BL z-ri-aI61y#B_%nPy86H4JH1b-kY8rDC&DaJmrmL6`1itA0cn-3*65zg87)WLJM5Oo zA+DmXE7d;yFnGw3E$%vv!A@V=Ueme&XUqq5!i@tjsL6>F6ob#%GSGs`79evNlVIJN zLf=!E&-;~j1XeANF`A^fR_Wg$GfGzv)~LR(W}?V1Vbn-7+TLDH)srhMBjXfNJQ^$A?)@~Od(_qA;FE<5XAG=zpP*Ra+Pc%gT#A)G zRzj$uV#?ky;MAF@$jJHIUsyM}ni?3yj4iW!RCMZR#f^=?^g**$t&F3FVKhb5^2%N& zCdb^|4@N}H`cj=oQsDMYwE$RL0N6ktycNlg!Bl29>bB?q!~sa?=g}2i6oD7^ljg7n zayh*uE94ml*Pl6s8MDldpr)6EKBZB`d;`(m^22{*GV9fD)X|zVVowpjH1&(pt&Anx z&^l5v=PLK~BGasKnr*esV8l`lnwi^+y;IV(d>wxu3S+Ag*dXcZT#Xhj3Lb~Jn{+nz z&zLZo)_OD-qN2#&n72v1JAxY4uq;L}b5JJN++c=_MnA2a&R>f#iQWon8F?V*ae`#=ghCX05_{UXmjNP3!-w=gFn;9UGu^~Ai1wefdO zl;c0yFg7fD)b-StdOHebq7*f?o4vOAIlPH;tkUg0J2~yg*fhuK>*0=#b9Te~7CIy% z922A{aUmxaW&&Xdg9~(=JqDn<&zf(o;dZ@S;xxaPcT!eXUzfo=y1C6O%qfofW(`i# zxRZM%k@-~LNz)tBRKcM|j%}JYAE3h_EjJV~(cU?1fo(f?>RYjQqpNd(-#xB_ZVvP z(F>7*%@Q4vZc3ksP87u*nQjE|4tiDCi(|E|b6tQ=(fd zgiB}g3kNjjYQ9qJZaHwQ*l(hZ=?l9Jd$ita#Q9#6v5wHsw6wIe-oj$cnp|t#@Zn=} zFgK{=9Sc6SvO4_c?iY9v3@>XJ_#_+Nx14LJ*EB2TI0GSysZyy&X;;MVhGICm!764H4HVbi~7f{=sT3qb-tYlZ3*V3i7EPis5^25E^OmhGhAUO<-T7H!2 zRb>A|hYUd}+dpdgICG_jC!O;-ZJx^n1)o$ePw^E?a&1Z6H~;Niubx^Jj1{797TQNf z(&eHYGMreY|JvTqd2`b$F6c$Tf`(!Ya)S|c%);$`p zasulZUp0ls0azETAKaN{*O{bEsav;dA9=18)^5m0eY=d@H#Yx%eq0{2>pCK#x@!ud z4T9y{K}WC1b7atwz0q&)+~r++Y;p$;{e8%hedTc4gDyAc4IDEj{c_~{wY!fbjkz_h zcgkX?7aFAsw!{x|RY}Ij?cO|UB1iazJ~M}^v_O$mau(=CEw@RR`H*cN3ss$>+wjUK zaGk|MZ%34cpI6U@I?MBLbkG7G6zo9q*s>^f)BVKMzCu1I*~5-&PnN);KZM<+#KOyOeiBcv;~LtP+*p`Dfc<$b-gnI~>!(u3p_)rn(dGCXFV!*#M%A-P!#$ce|;TK26 zz;VWiflFgl64s6`(#V&ee{BeqdZ4_Px9;|*-mPzGOZ@)Nd82EzPC#Yh^Sou3R)OdUl~=quF;M5#xGnYpGn|vVYn)E!QNr>@sX!>&a)= zskgh-Orwj=$m8eNSl%^19^U_J%Mq>5T7A&Ye{5$ho&I^}xAy#E?&zRJ1{X&^E}s0o zwN0tdljrdzi<5I53coqove6MNOwmePHPx%PBNcTXG+v)zJ{rvnshYnP87|KxR?%g+%KS3aNdtXayJg)xVP3LP- zB-+L+a`r)DoB(emCnv|k-`^k4q5<8_R&|Aow1GN%yv2Fs%DYA`(It}%u1=QkBlcSZ z#j-=kj+y-M^XGOB4wB$(f(;L2UW`(G$bhFg zIDAN|Rt>{r@2D$S&TiS;^tyiXlqrq*wT(rYzD=(lB=qf;{p8rv&^PCX4p}!dxO&W+ zK@GjGJ)izjQlo$8cGa)HIkm%gdt%$jl2aF1)iYYvS8Ym7jhzsNFQe0&*Om7P{?~QB z-xV_(HEWJv%Yq9O*|>G!=9G5g#5^xAuZu4>Y}imuv3!I6@JXhQ81IdYj&>WrOdgT5 z)BT&p#d}_K?vr7dA$QIdkTWY9z}~DmQym zIbshfS7ZK)pcAgkSFIYu0PXO@hX-Rjn|}XD%U9_j9)Lt^*BUpqb8~acTCV%-moW$0 z-}v6HS^Z|~&x~zbRh-+7j&m)j)Y`Q-P6q^BxVBl7Qb0#X$2zkT_cosf%1aB2{KCQ} zK4fLO%lY8o&55IS?%dg!ccp9A#lL+w=VO%Pu@ia@UZi&UCsxA^&L)e2O@s1a{@E&S zQ@h=q-<(?s`-D|-6WTk=fSmT?u~r*4ZVcLZtElLYUo{w7?|a!#PNCMUzncc3F?i!> z1Ob0o3>3%{GYb=(o1X3jw#LKBg!M8s@0a+%{|L|5S$MYvf z#T-XWYhjU`oNTdg>MzS@t6npXeF)}ro^Eh>WTYMn<^2f>m7&884Gjkm8`eQfOY5Ua z5(_ijqTa2Rq`_mxbcf9 n{O=R-HM9tkYVpO6>jH&-2{(ecjh}-Oue)Cy%dZU}vCEDC=no z$J8j475MA27pqs|56dqNuJ}XZqMY`{({^STFP(ERr6`}fc){B4qP2z54rfybM+-Y! zQNjI!!u&hVU%Yt1QBp|A=0AUfpq+!c(8q?25Ah;vE-2_YQYf6S$nPb#@10~QODGiD zvA@+_B7U@9(q?L&ogA)Ry3|KMgF{L_HseZBd7E)S8MFKCnGa0LAI>LpXHaumjBX1| z7#Q77{M#?%+A*V-2CC|tjEWT6yPbu(d2%2>Z=17OO~h3xsm#d;N3PQ*CMI!s zck-)+dzGHnpTANLzx#`_`p@56gqL3a^S8^}cm1#ZVnTz=S#9mGD_5^>-LfU->C=63 z$BxB0Z~gb()w{la-C=HS{`~oKKI1Y!2WRJ#*~Z~JckSABy5n$QU|_!IY>sVvaU}cA zWq*F6p8wLNOI>dRkMacZl?DV`E_v}pE4{z1$US70`2Eh_-Z1u?tNwhab$8!~1h)h0 zLb;WgyDCG4N&_PI9KFmX?Pjuht}<}fO%d}NeioKc_1g|h|NKA>6B}Dnc>veI!u%}5 zx^?%ctp%4L`uZyQa7tS2bcJ}VkMxw(t+&^>m+}{pVA* zRf18e5Ba`#VZyOKTldC04}P-1Gq{cQs$S_jw&+S}cD^Y^$FeEq z{zy-)kd~I#^Sr#bt*!b|QBnP^1-acdkx!ID1-Z4GhC9l|+{Vtky1DI9i8_SCq#1R{ zwX?4;32!^_<~C!}`<;}-XI4|bKbMo2?|*r9)y(WriI{oKHvEKTRhV#28uQ)wYd3E6 ze=qgbE%7SKcOFdcZ+tQ^Gd_@$77`cQVd3WDlDBfhw#0YAdk4z7yc_V2PD5?d(w;Nw zfBp5Br29llj?L%zHH%xVn#WVeTw+iU0d(MnyoKp^D5{qws>a;DQRXYLdni&Hnd~uHvxp z1XaXkn%7!l<#cmxBbP2++K{ZVcmCJwjqLl*9`?y)q!=)Z%G+k)$*S&F2%Mf{U07JK z{F0Z!dB|l4U%zfsv8TJMi_6=OA9Zr=+R3rWcI-Jh_%V~W#vx6=ARg;B&{+{gkDHqw zeR652EmBWn~+YeqiJla#+jEs_f;oFhzvR-FC=h&Q1JM)}=W+>ljfW6s} za=1ROg0iDNhy3)3`y#>ycJCkl)8CZ(iAJt87%jJzkQlv|;i_#vYRUVJQ#<~04T zuCB+T<~482%a4a2uu(&JdB-k_NICW2>#n-Li?+wGxNzdf$Ji8|OkL~Ksk&lLef4r5 z;*~$tL`nt!b@YaI<)=c|OuPXP?H!%l*K2-U3tRERh+}kd)UIScUcBAo^yJUh4-fyo zs$S?~Uo>3C(PW3LLK~|)&c*h!WW`$MMDyAx;T(&Wr;p_Q*&pNJS#-S%7H+zE^X3!% z0%!SO>5e@$52P-oiI`Qf#zsuGxvO~2PBh|RIsIr6cIt1S6pwJ!MDsuiI;% zSmIOf(M;LR*I!|z=sdj2;Mm7!rXPCiV*T55Z9bd5{#3Z_fOX5+G3Ky+=Z^S&ZO>#s zV4cV=W;AhY{e}&i=>|nq+J+4qKIPdP`+YUMI6lzajE~p(_3Oj8ZxzOS>yAEp^r*rP z1x@qUSl{Vg(sFoOB_D3Q+?R>wara7=?%J+_&%4P|0GkVhDfISl@@emwtY+#1=QD>F=#@F!D9$-Aa#p zb$xB6i3ppagLNL6!o=zpWtYB^@miwTq+H< zK`T`^d&`#u7{z zZB92VNka;1bWz2g)*}D}3`!h(?i3akbqx-t-WN5u#Kw>O`t?** zV95)~)s$Ds6F*y@#2yb&^iky57XItk1>mBi@MKEWk_E7nKC;$wD)xU3HE~*9-_)7095hu^PlLcjc!K#`bR0$ zj!aBwV(rH}D;P;+p)_bbcjzLgLBGgNW3Oh)dpfsLmT4t3Ne3khGf$ir6vE-ZIf^~hL=@+d1Zx| zWy5Zbv@<&2zI~g)>GZdWnv4)j;JzETQD*8eii{R85u=7|CNLbE4Yoi*ZPRe0mSHfm z^4$Eq6VQ^h$JD->ZC5FjxU3%^GoPG#bR-|yY(h{%CLEc?C%*xIi8ff#v3)R(ZtlJ$4*;=n3L9r`#`1aw1>L#&Z=2lNeK8-zq{ zV%-7ExM90wqFMEWk4FDe5R?Q~|n$uMp+F#e!s-Rjl zqTdjZVXTsvO0lnT?tT9^0;>t-u4`y0eG9i@qH3%>iK}Gwq!@yISnm>0uyf~5KVu$^ zQlG8l+wg%R54oyoB&*XL*pPrL-#2~ zxjcUTHcyI~&B_$*EsVbnWdO9Mph%1Pt_$ zrGV}_`}>oly%!{EgywM)#YVD9Ll)O5B;UQeY4CHd%6g6i`yI|O<59OuIo}Hi2tZiw zzjAUvlcBrPAq(ZJa)RLCQ>8oylPiP&~dZ@O*rAk z)fuygnoF}TD6a!h#`aQaqGnaMM8E1hI&DhQF7N1HP2CEF!m;IXH}5k#FbCC`w&IQQ!m0L#q_!{G;U&kMe`J6%`I= zTL8SWj7k}@EgKaL3=D*S3PknfhcTz!M%`}uke~v{yAmaKf16G9Bnz-kc9`}$iot%8 ze4;%k?t?&Joa;k9jd`bs=nK#-a=47N~DckaO=)(v;bLe_k zfg*s&uD41rG8@~Ia_Z5QjKNHml~zcDzzmA?8ymRV^-G3Rgc;dl+8r?MD=vP+)(U5whPDUL{0zy`z3&*v6{P@vDK(PB!?Be`nbm=U* zs-N_jk&pM#YLnA|p6+6I72A_W>6!P7iottI3v7UB88y05r#Oe)tfDeMW|}uo4R<&V zf0vs_9wk_O8*Gy6l-*HhH=oeBS{RjYWDZR+IO%MZ=|MWN(0 z0chB?=4<@(&p)4@nfj9aity0w%pV;e*T8wcIQU7dBfIChVElEfnCXS@-(KGYKjAaE zu+uI7uVNO8OCULjCRJgoXuQdr1559s=@z+Vch^R98GpWfnG!6Zr-`1v?lvPYzuDjZ z%ID7~mJapRKmLF>^N%_O{8kqxY^SgopYO=T#;mR03zv?-?jMthm8zX_ z1Z%5#dkeSv!^2C~v+mnb$LRQmduDh`zkld^w@mAg&q@nq9@l&XjC-OIE%QLaG5%!4 z!ACe&Pms^cW`s)S)Rrt+QZ^*v*u6g_$Z?d*v#hh%bP44yvk8C=5Mg6Nv{y3n4(YHT z$a)vsM;1E|K9HI2WHg@rvw%hpKZU5JZ-q8cgtqW3`KQr;n}nL7_k1?;_I~dL4;;jD zqxsKvC8=m8fxVM(hWo!f&&0lSgW!^olEN4HcJ6!?Hnl6Ka2L=^6EaJ-eTTfwmpoMf zr)HosCU*8@BtR=b$p<2)KFGdCo6ifcS^*5hKCn;rg)RJS5dKa3@PEamm0CBx&EhXK?5@#ld(otmDXFEX? zVqG;5sr0L&hZTiYsy4H-CjR>M%f)@kgXm}BC*rl;Yq3U3;24^JeS5ui^X5l@kxEw0 zX^m+2n3$O2go>w*;J7mvwQkuvGYq`Iy>Vl}!Q3LJ0Zn>kfU;#&CbAb{p#YY-D~zTt z0tl(6osq!0oJdfK4k;<|E*uP~DJ-G}?^b=ab6SEzvCsi5&_G(!&%a0myPyHA^`*5{ zqrlk)s6S-8X+N>f-9dQC$EvYyPV?wV$<2UTPXUz-qi~W zvv$VM5i0gS?P@9mnSjDI&^ur3egBt6inb~}%i;r%@3+g{U#=7v7q97FyIjpz;^|gq zW@h820rTmpDFq(}Dvn!uLF(13SJAE~q9j_OYb_hV$;fIE%#hw_=sqZBJdM>IwhfPP zJa{0N@C&>wzMuG&T{FQ)pFEberF_eFz&8;*|BW&UR;}C=8&p=tsF{VrAV;%c#k*VBWH2 zi#Z#cK=D)>9#Uy!-K)cjt{wj3eqAjiW)FTpfR~r>1kDe% zlwEo%DpI?=v9VFxYi`Ou!W0|xQGub@q=J4hx4^#RMvh&3RNPEyDSMB#wZ-!9TjrH6 zyFU9X6Of+c`Fiu}2c~08egTLRv)U*DzW$*@CU5T^Ylc>!=RWo8k^N90h|<`eh|J8) zK%Nd1oBs9^?}(tq`(U`wzqq^vRAwMG$*#Tl-2<^F8Ux`i?hlY}*f=m*gGVe=O6^O*gYqWBT~0fq~g-c{&$yc zqB(cH+X@8q?t3i#m_I#2_Y1h_=TO+%2H?G+f(;NObLP_&=0}bNOE$a>u5i! zHaMf(;Gt3hhu(ZFFvA0}%X$@}`*@6cH2}o=FKtN>IKVSo#r1aAp6$LKmLN8CpF2Dz zlpmPT#&knN?1m=NvN{+hoQ__!`6N@3bc)`^5|v9n;K+{0RgqF!!0@WjOQ0LXg9c7U zf8gNg_#wl%d<<_m02E4(S$eLv`}OSCs~h*9eL=~#ZPi7#3qeEp<;xd@PU5mv8_weu z=`jxGGE%~|d(#VJmabsv#Rqz@--6D-wEH14F#Gfchn|{Lv@0}v*`4iA&>!@H=4O}i z$Ri{WSkQN%s|baHqu})G>)$}SY_Ef(%^eu6A~IjTeEHyz>ocr-%*yrbgzF~!B$C)x z6y>!ng6C0^bhFL}*6E$?egBAgBYzbDUK-B5!7h2fQy{EC8Kobv`IHDakDL>Bf+wgZ zO8N;3qy}=Ym>U;Ljs~FPiKj)~+mhB;G$scJN^PNBjvE;sRz(*WEbHx+ZSg_AFptcy`hW zf!wwPUkwSWzyNuY&{SaDAR{%CvV_x=1h$2=tBnKeC`s2TJLo^q9W_Bb*fw-P&WEWE z;pG2ihZ&eV&_kMdDW}Pw`l)B0i^$7713JQS(_o&Kk0P}Rt5y10DjgtYrvFL0QK3P$ zr3MK!6dUk@p;;IE)CBbN_t!W;+uGJ6`9k+ys8BkPH0j*H{1@}6L|Idt@7VtO`ZA+9 zottm>ZUxd)AYzU5hfui5Aud`U%OPs!hi#1mG${|;VFH#yexU%|f)&Ul!W|M#09>CH zFg^3<$sZp{%tBSFyV*f4AC1aHLJ5wIjg6A=OvZzq2U%eMa{vh7-0K@`(o2j*ty}hy zzH+E|HZ8F7ZA5La4(j;~$oui>o@m}Znjw zal6QeMJNrgYl*U-VK7=7Eo+yx3kZY&96aebbPg-@JHvPOf0bHtnPofh$n_^ro)GpQ z2NL>Jcsi~~yZrjoqE}mLe;7r~rV4eoV`o-A^8;OGl31bY_fV6Q9Y5Gzi z{YIu24j$f#)?R^x=488fI^bL{vVt2pH4@M`)fT8dph?YAW`BOnJWgH_Nu1;;6q5l! zzIS*3A|gsWw)i~Iw(!WO`$TDi8r6hNMwapJ!@(Bj85YJ`N6gL5k<4TD`o?-_GBG4P za4M5g*2tljli6-{=$m(xqcgx3iGdv3)?|>w1L#vEy%!4ccD(4T3EC$b7>JlgeClJ7 zqo7AsgLst3Duqf|$Dg~7#&gPeoVV`i?M=i_>y61%C@-4M=<7Qng+n*eE^r>KM?c~; zGiCv<^e9Rn9ep`cS_0V>1cW6dltRV;@BKMNsRj0b!MH`ptcT9aqFx zd~)n6=-kO?o)e(dRuq-v;g)g}K||)vuyJE(P|)d=qsbJ?#ADK0pshv1J-cq&Rc8(a1p6VE zr_?0i<4^fcPtKe%A@{h{)SW7>;~jI>odD36zf>+3?m|~;Tf4A z+ao(xwzs!8H7>mzxlyfu%}Hhjc+cESNSbjTGiXhYpbyae0pFO}R@&ujl6& ze@=AN-wTwET9PIa!G9Uis$JNme?J4!dR<)3W9x~`2v%Z@FvURq!F#nd6HZ1pJa;sg zIC$6ew`5+w)a^gC^CUl=%P?Y)U)n2{9RB?m%8NT>p??4R!TSH`7tfx)zLq7V!bA-y z%tm)(Pz4qGCbGb%EKZ@l3k#IEDcQ9k+^tgD3oh9uH&=7|Z;+5cn06q!Fg1MQ7sVv>oU#&LYqNf${{TEdjL= z5fS%=Vu>t(}k#fj&^z=xO~WS2WT`)6;rsiQw7_m<5FhsO}^JunFR7td@bR9KrFB4bBhj z*%>&|m}X2wb;;Suk07=lJtEmt5F!x3#Q>@d5i{@cs&Ixk^5r8Xf}C}u$6@sn@kBYP zrx;dm+}KQ5T(r=v14oV=xj6AdCsNv76E*k)nDhOP-6sgOQ8Plw$xH2?S}Z~aei=Zx zj*wO&pc=)3?6UwYw`?nXuJJjj=@={z=xksWh$4>x%Ks>#{YgTX@tipi785`-lh(?> zBA7zL^mqWLh0F^EY7=TJ*mogXJ>a+DJ5CP6i&l2{WMKgzDJO@Gx1s05I@}qTbVku? zE%wwypGiC(q#B{(lI>*RI|fS+^8m3Ype(&@Zq_2A3;Lu-;Cl8rc2{ZI z1u->-gW|BKGsOx{@bBNRPFBuqJ|AT$3nZ)Oua~QmwbG*q@qfhLPvQsez_c|MsEwl60^gz0fEcV4fgIRv$Xo)s^e(Azfs-jawp5 zx3zeo_A{(q>zn-p`%r-gqhA~``SMTwPB|a#B(clmq(I_lM7%a`*gzZ>KvF5-yS78f zLE33TX|j>|^4(PUf6CjC;l<`-i!O+OZTnrHVO?+n>yO9?sxYZXp3cTo;Z;u}9)SLW zy{5k1bXn#j6a%K#3f_#ep^aQJ>R42=CU)&Ih*284sP{Mo38-6EV4C-+#vDsAmHs^N zMRUqw=~vUQsQ#d;NRgw*q#1)W3PryV5g7>?(uQ~#utW`@#J>v+pfw>*3H$aaVC?aq zt$H|t>QH*fktdzS!rV0UnrF;{XA(((;W)wzqeUMu$hFm%d9qm2+a62;1k?#ZY9Lhz z{3gH+8nrU0+y^qA`Dip)tR$epDKjqdL+%@SxIy9Ea!Q~HPM8+@F{8q^7`e5cGkpn? zF25dvG>8WjwF2(%|CpHoxz={MBud41ekr$&fh~8I6t2cm*xE6#2RQ76#sTjl>DcWD zt$~mqq(7C<_Hd1mbW+3-3#0}M85#ibsUk)Ma*{MtA0RKrK&7+*Jr8VjG{w}WtxyMe zCx~iVL6;-CBK!XHXEXe#7iV(Yy*`B76(^yqws`;WZ(?$4bLm(=ApTzd8LT`5Jr@D` zNNpyE47zk3kQ9Ml%mTV(E#8F)gs-<;OW8Nu8yf)212|u!>XJ_&X8qa46mxA`>#>-| z0=$O~ok89dU8;)6YC=c{3mccQnij!x(f>I&oe0)gJi?EDf?U0A+gpX;GxnZZ{hzX* zfIyGKfAq%&$f%)>BqAn~brLkSq%%qsi#5@CPxH}nRKjMmf`RES6^(`(0wvSt@#XzH z&~~#+yJZc}qII#>4i7Cyj`C|;ieS36dCpxEOQL~~$C{3=pX2CHQrVGXSYMX(l6DSs z=-Zbs|3-upiv-*}LG5>0sz~>Vv&{ZFdVYTX!?BIaC@%MjTM9gW2o=(!#LJ3M^o?Rb z%-YS$_eJDxZrDzzLO~@0>Fv#PqLmOUz^TRH_$v7*%8GzqHpyAK#@^n(4p}rEeTWhr zq-q0z&9N??m1j#u6X1tUR(aW+SQFR9Tg`Z6|qh#3VB2BHx zZQO_&a>wSNJiuieBz~ZCHMlagkb;S%53yL2-t~q#WBrhab5k>FPBQ#8d(`4?0aF=m zXZM6{j7SN|s>!W1oOQq01HT*LhXp;wm^CbSkk+5%75- z8ez(D)Hcna$nwjr68>%5w-Yx~?C~xf7Gf=6{mkvm{1qAMcfwRpqC0fHJ$K?53aS9W zgC+mB}W|udjhoXM36qjiJ0Qu z)4Roe18fwk=yuWA_~ahq>vw!vXg9Whb(6!-FA{|RL_?#FE;|@&kJM}cMMe!!?z?BA z(V%k#L{4@4pJ(d|OQz3VV+v-zUQvHn8_Oob zDKA|sCJc$U-E%TBF7fOKv^ib9y{tnrXgmq=jUA!F1fi@r^5(pKEK+7N^gVR4`=#gkf#4Js?rc36T1f$A2)M+VyB zQ8=1WHoprGK6h}h8!-`?8FYqG% zKf7j(TG4T>75rWwX{ z>!_WO1b&kcU-HfsP5@+*9uJ68t;A~{y;=6LP;sj!elUys+k}VS+8S@BW&h1uaM&hiN~UmFqWdSOPB)a|iuQ4a@=i z&8os!MfZn~DiN6iwL!V=MLAM8aV5ICyXzHtq0Dx)K%{z)8jj5K$fYtL{4@Bt7?hXF z@8d)!eH*yz6YNCz4wixEZLoLxP8yHRpvfYhK=QNr1jd8aGbvLwFUctai!+0!(`oA0 zInq7WIDqr8Tu$CT@~eH&cPPc6*0fUws-o>tipj%goqf4fLPDqQyKd%ok{U@K1Rbee z__L>nS5{WG8jLeaB%xk|KAqT6D($X(A`SEv8{^f&>F#j1u3)V#+3h5yqd-{VV4`x; ziCqa*hg!f{I{;CdAQqTUY=>vC0G)$_0(N$GK-t9vl`o^NY4V$HIaTe z4TfZ_JKU}x&&!;C^ZIqRXis#pO2f3`@L~KEz`=4_A}hXtg-JA8Jn) z*Z)`|O$jstn_2oR4~C)E8`(?hZ}hGSk6ra?z0h?k03B?UA8P(>XI#SKN9W;x(1OQL9r;)|Fv4}Dig-ZI?wM7FkbQC!gq8P zWueQUi&0l>CPupsrPuhWao`;)*Pu_g8k0^R2Vp_SM7=0ywQF+$#6wx=$1}m-SqHG2W!bog ze13Akpzsl21@TUjb{<`6idu7n=3~XJq|mB0{HUc3I!&XKN`#9HeqdrFL@6OIIC6?$ zCDKH+@jE={?OELQSJT`aGC*4K!i*K!GHgQ-whYuj38~l6YzaGw9*i-zIV$^;JzgGm>BA^jVs5XI zUi8t#&VY{g|CrXCq7!6P^b78kbHkptgfMMuhV@C#XWM7?-X&98@<3j~OA`Fm`R~8~ z)|7P~6KaFoTvLe4CGgtKn^y3^mkrh391O4s;&8ypUB;0K2??OR9^%8l zgB1(_L=BnOU#O7ox4iX#%40UP{1CC2Mdf+IQ^G9$ZI4EB9J*ZM*9NiX8MDBHVA!LV zlLAiDE-<|Ii&Y=U8R$~sU_@dNbG=}Dv%?<7{)bnt!TG;<<<47wK#lh2l-7l1CbXoa zMDgBkVhvA%+(S4&w!P7GmYB*zbqHF~Frfk~~Sz(MC9 zVZzJnU%x(zl6=6S>H)H-3JF2T7JkiDe>*y+f6n6(puyg5#`Zi7B!%rdJ99qa4t zJz8lgICi98BNjN6oyWlGW2?s9_g;;FxCeLKtwmv7X!95;FykkFHU+B%YBBw*eCmeCIQl=!Cv`w8)$3Tp!PR4 zC#oJrWD?65;Zm`BeWcb&mqdqx!v>DtWoT&FA%^_PG-$tUR`g=;Dbfwn$G+XeU+0?vmM`1*9rt8icS(Z_Zz8 z&37WU56DPLfc+m(8N%aBTFOh&t3d<#@XxYUOxw1lKz7sdaORFf(O>|@0WSbiP|&^V zrKDr8+q`CNR;*mfK6$!gdhu33wyZZ8heQ}UEn(JRZmx%xK&B~V=f{Fzj!z-o>5=OU z%(Eyy29Ra$h$URaK@|f%f+T)~unpKBB7nHuERRNGj!ZklqDMW}W z2&5c6yBQpxW{`=id@bd-=$O@Gj@@QW*Gf{8Bf6K=P+=^gHsEd7&A*t`Mikh=l)5{J zb|QArW3J@Y1*j&eabrqBm83P$9K=~hEW`MxXPUF@z{jW;8OjS`A$7}saqk1M1{>3X zm(g#$&Z+pIePONa4%+JSkr0ni-wE~%oQwg9-QSWCONAf!I8?+y>iFR2=I<+C@S}$= zJCOrUb!NDnOQ0$I<~Q{eZQ+{bU(^~H^EyQ?eGZMeLeE%#)d`6JeMnG4*8=exIvU-9 zoU|7fejpN(c{q|D$K~pNIk*=DKc2Q zGJum>4L}g{+00C4BGa^pKdMJ}pZ)h^fO&6CM2PiQ_=H;RY^jppS}W+9}HvbTTlmWzz-e(?cW!+6kMEk!%S#Zip7yufV)#vN0BwY6Ph zcg5}jKmc91x>7!e*|kJQM*15(Z-UL5+3Htq72Xv&5P45sLE#qSaI0~6k4-uD(T}qb zE!6Gtc};j7V?!rEBZVzrZ&42sg5RxaIq)9xGciT^FbgE3DI!_}nFfiNc8dOE1_VJy z3J{ghoc1fF_o^qJJ#l4=-pNiDIfwMuQqDj2UCDyXXiJ7m%5M$6^bymZ9YtL)1PSGq z(yZoq;fznwO-mr7jv_P3|8S$$PaO*H@6bW?_>H%4SlJEX6`nI*DRTw)Y!t;}^5 z0a6SdOc6G9tcv6Oyu7@-TrQzLxwz*Lr(lg!H}4|I9^nyz(ryGAaflKx60}Oi-xVQZ zYI?f#Z8)p`k)DT4PPX@>UCNz5a56K;qb}2Y*crkgqAwqqD zvp#?Pci%zjj{`HB0_wixJkmYu3xub8f`4Ks?WfbhnQII{EV*XE^f#ZPOVHKkD)=($ zqi^*u(Hg5L{XT+mJHp^$5zEGRyL~;BGoX5LxOJm~>c+gPmrp?v2{cWf9lNQuCfHm6 zn5W)*ao#*@8diz2A~$OruQul&tp&|*qdD6rAEUM9*!54$(AC}lJ9p}BflE!JK3@M+ zL`Y;dR<1Ijl7626WJGT=D7&(O?!RU*F2tN(UUul>7%V`UVKxmBnN+w70LN63%d^qW z0j!l-jt4|3?wEOht%Z7Eu^FHVcG1y&x%gP+lI~~5qH!u|Glq6=%}r~g^a&0}u^UI{ zXa%YY19O)_)mT}NqLn6O(aev`TK)-t&R?|Mxq8+yLyXPq%@tQOFg(i>_FV{iV8KRr z7dQy)G~BgMI8!j;UhmNSwHtQF4Y>?w{LL9nj<1bc zhV-pl*Bx=weteHxlylgkEQUW=hn}{PXgKP?7<6UD(_oO5mY_0W=pYb!zwMWUzpY7A zg#e7Gp^r(4`vJGLoSr^otZ2L8A&;q3kXwh_41p6~wFsrT`{liHS}y~4J@l58Pw`XK zNl6dPw$W6Ba;f{DYbZXO=&|!?KFep>>CZGNMyyGsiw0%Oiv&#sD?&!u3-~O&5P4*f zcKi7TVvYdE1X}Hu@R}AZz5h)ubTv7>gBCVuw=fbC1Y+(HDQ>S{zy8i{U8BEED?B=3 zd&P4Wc+AeBcnLB7P9Q1^J#22P3l(B`uS(+qk+NbjX|l`v#F)o!x?iCOkZ`~-(}GU- zxdTLFG3@8qfBqqsZ#NP(F`|(e!G1i!1RLr6;2XaCmGSMhW3mQEiiWr7+L;x<^iev( z$oht-_{}RbpfXJiC=-#1NV?!wHHn%sZs;}rxYXpYI`^gATdEZnY!T}pVj+ZG+Np_daLK|Gh_2nTMgSPdPNt@COX~P3SE=6Gh&$e zweKcQ8hi8{Lx#|Sq)#U3Fqm7GXCbaay(jCvaBOlxIT>If5tWWz#N^h(RL4f&RXZ|n zKdG+$uwiu3{K(LfKJTHcQ*Fx*>k>B}EaB?WUNcE(3?HI-C1OQc&ucUQV->v7+CN7B z-F&5*`Rj31mCmh(Gu)0dp$)$Zo6qSPT;(3{Uf{Vm`_W_jok8|(m_;S_8;k`@qJCbH zuG*3>q+I265Qa0Lvios~k9zCeS)pvSowrhyxyB*ooPw_>p^EXi*!YqsymK#)#hq<4 z<(Q9%tQh@XoQ~)}EcYeYtf6p>eX>eVg2v9Q@}Xmk;mPzjtZ)Xv`Z(5lsXYl8xJ($+ z6EWD-CxB5Tk4F!%HZdEjne=&!8vwTWJ5A)}dC}hiP$NSM^T6qP%ycg~eenL!r}W)dstM7S|wjc#t_f`#$b`CQjq-e+ub z6?R5j0WxSDLZ6am8+gR)KjmtL>qb$ycNZRqbt5=5guReZbc(eL-cx|MV zx$xRt*A{C`Ua9@~_7i0YgPjLyY8ZR0AQ1|wsC=eX;WFMWM< zE(aQ6NaMB zwTX6q{AQlS=Vo`iS6a)6v55DC;+Tga^nGYyXPsOwc`U zdF^}cifqz1&>dw@2at-nlTy0}o(iPDq&vxYr+x!d)`&KQN+Y8Kzo)_kxzk>v&TAo4 zK+qE-J^~CF*CDq2Zfe0d@HDSXJIM9C9W3t`r+$4qczlK$-&$c)o;hhWtUSluUKIBH z$5h%&`nK>k+jN3-c*8@?DhD6U7 z9NQR&xD==}m2c01-L4}2%Ubl=dh#b(#Km)|(vgBteuVGKjU~LHo%2t4Q+Ku2dv5r6 z;pYdnb>@?qA*k;1Ka!vJygbD)y+HJ?QMnr@9VmMD#o!+Y>fAbS+!;m zp7{1-T|1R*rK%QzoTiE8r-OeHs7K!GrFr|Zy3zPjmXs5_kMkCB-PQe`FL(e$iFvt( zIJ<&|#Sw`k82&V=+VlW?kMY5W+0=oivcN-~hWkuweZ$%dgkpx2vN66hAoUdq$R+pfXeODe0 z3UkKcLQShA)-z@S%ZwV2?I(NxIcM4Z?xZq=-<`PQBX!BLm8>P<2_~yHeIU@9Kiu(D zX*bRc#+-aJRE*F@)%Cudv^Fxp4G_P_wCzJwpF5ZuYukHBUm(pt01t1HmpyTdQu|Qs zGHO2EXQjE$aL$)?edM@-uW*P{uH*WE{d!DqdGe=XHAZ(9l%d=QR~jfrL+x*&O?o_lY_LSy9o)P0@DYyNPnQ zkj$|3eKHIpw~@oj{=$WQwpGB^U)vX*%A^(Op7d!dyfhk2es7Ne02p>d7n4*7En=6%?sD1_+zYCtzo$? z8U&T6$CYtU1Ig^j%ryGU#Guuo&Ww;ZQ5@h-_Fp+&x6EY145yUn@NtQUylC6EzJF$_ zWITUPGb#4o7HgMN&N;2x$aya` zG<2By6n4C_P#20Yu@h(F<_@XmnB1t3AOadnyuE3vh6WH}&u4hy-G_PDCdS9bqAuPS z@-VAol!}&iKTsnAPoV$D8v&pkp>mhC@Zhvz5yWkOMr#p2yx;-^YQ?84EyyRt8{yjw zZXf}nZ-`y+ztj#0#v!^!>fk}`FJp>o|69}g+TYhdj1UqMVm<3?23UCQMya2Y$l157 zkGqXrvy;!VtjOG4>!crMGAsTSy8%H9i%uBnnJ&scQs{m zsKlZM#UYsLIX7HhcD~@A$7iK&IeX@f^n)?1)=W63XRfV0MIE3M}R1p^R* z$h`INrWar47hG?6=ixF1xLYvg)JnLR=7}uTwMU2p&4FqzXTT)Fn=f3v(VwjQD>~6#R5hV z<-HLC6ySuxe=#eKqu;bdnvj1OgLh?@a4@+tDAp59Q-DTeEtBa6pHgY|4j8$>j+22^ zaE8Ps&~e)yrwDp%{4wPlqbZQ0t>F5a=?qfogk6RJZ^)a(=|%b@Ag$lPE7Qy$P6y-V zrs(CMw#GSOm|2{=G`(FTjl} z!%igb#?7=>lVA1r)1VF<*e39Y#A1&EIsgXuG$3mirjB9T=trLXfc`!KV<6PzP)oI~ zf@idee-iSQMQ00~-Lb>s%4;yAMW&jvTu052?3Kab)T? z7Z-?pOqyD9y%G>y1Ed!6)RYRC(wGQ-KVG}9@MY3(=P9LOa3(Sh> z7P@4VP9SWFO~a3JcI+Ehh3bD}f@Kiop!KjjDhTOnh-n>)j6D5Y%fW*O&$m21C$I9N zg*2nsr+UPvRi}tZkEmM+#!iT<*%MUlZH8+#;o`MM6HR$g?yI_&yg0YqK?!J~9~$jw}|ds}~oScsk(@;6Zqz z5XxTLjCYpHULDCc=x51#U-v{L;I+tCX>;bWsICfPB;l)Yzynr z9kJwm!&vk^MG5>2c`wjOCqYvRFJ&NlC$7F=w+r}&v93Na35|FvBB|motZJ+~Yti1z zy%F$i!*)!n42t0ISb=T%ubM$6sC%Sc-CTRCSfqVMMM>J3@MO(57ms2%U!U0 zdrEmGi1!g$A`#(N=2i{1rm!vqWOXHgHPL0zLZktil}pus{W!Z;Z!dI_!U1KTASm?@ z`A)}E^K3j|3nO=nB_m%F$qJ{5acJL{Ui!#l;3g}N1sNgO;IT4KpqS;mPp09%EVf;_ z&bUO1lu6&Y`%T0*0(H~6>}?bjSm|bIO(TFl5ccEs&=)Qu1Xy?dg^DqbwdezixxInH zldv7W$M^UL1{K$mYh;LK@S(LHmd3wuih8s8x$0T+7%DZmpt_hpaIz!cgJp9U`fM-N021 zG+5i-;U);o-=xB%`W8AiL><}%=4>q1TWG;3wOVK-HS#WeV-*)bxA+Ne1)dXOca1Wi zJ>Ci*AXb4~v84{QMO@ZodIz}`4p8coFJTWBy$SOI>UcNe7K=b9ro@J%SX{C9X0^PM zs`Mk+e8*~}h7w(dzt?WPi!s6iGQfkLSO;!4RfKOaxtI$>Apn$Qs(TEQHz|a*9~zbu zi}5Gin}*UJhw+&TNSNew5Qi_$@EeX7IXCbzSeMjbfUGg*=5a+n?WYeH=0;VB$cx)} za5bc_u+$_@NjxgN5@^$tYWKlI;F5!jAdVs6X#pvn2Jr2|r9*7eID-LK?;|Ko$Hs0eA+pE}1%a;E@nQ(~yDwduWNj{nYSIUe zjE{LvR1fyM;`s?ZG-gCp95%QLi%~323-OZ^XE9OX*0G7~MghicTUrP%F%)dl8!HD` zIygCL;7KvO%13loLN1~@!-7-O!?184U#204H=#RG2UzVez)A5VwgfoZ5>Q*q*{hV^ zEgnA-H96YMPG%O#VgkWom#!01nCKS7I*##G?6%teE?>BI(h9~rqK%3&FNew@{x4#T0mu52k=b_^|Dvo8*T-gsRmBBV43p{O&JE%Hu=OM# zNK+;%z+D88AYZaMnO|m%VB72x80P-+ARf|1#rK|x&>*G$*?)C%>~frx=S)`Mt^?U_ zi;tJPTa^3Wz>T9jXoxV50saUz^)3CtD*dpVVAA+(p&uD8t?~k6_D*}Wfg%(G&`vIS zQ)}4t>CHL~WnX-#7rqbwTXSUw3S~y3xkX9JVE>7wODPI;825-Y)rV4)C_OXoz*UKPO0rV`SLZTPLjJ2e(!);`A zGBKQ!dS(lGzKfk?u#Scytd0ns$|{f8+7;VfhD)7mAoXg)ulZEfpI&b8X$i%}6>1;} zm`s;c$hMN`*HI+QVs*JAi?Vic$C(xSabBiern13%kF$^kBmlQ#FW5u3k+WA_|ISe-y16=@BiYC1V-2twi7G^ z4+l5xHPIEhh~P2Rx3=^cTe>)Dq6dlXuP-6+LW*vS1&anBOz@Sv$sUM!&7uI@dz zbzX8^+=?$8ODT8rtv&4&D8INjOQ$OV-fMsb;b>Y(xg5H7y76w)1zhNPd9dYs+ugrj z{8_*Mhz5M^PH*$RDw1V;?M9|Biso%61Lyb>D*N`Q!cv<|(DaF7na(*_&fQP>h zGq}HhJvCmAY1`kwevjk-fBcIU0Ou@(Ybe4c3Yf|`4F_8n?)xLmCGu9ShBFcX8LdO@ zSkJy+0X|&7=)ejSI{IvA2#oy3}#kWLqF1#RJZnT45~_!(g=aun{N#m^o9i28k{ zE~X!m++yVeI8y-|_)wCN4x2$vlA$t`yh^+%y#aM0BeGr7}l>32J#^H zvH?!84Uj1>Tu9gpN|4w=QSi47JpFVH2u&9lF$g#o*p1xJjS-^*v?VXVL-C=44%=p; z2a07e2CIOHsu`DD+`3Rg8sT0^ycKm787QZm6-9m_S736}NQWW!tJWG<3c%2Mk7@zH zkB>y72Xx?)WO6GC9tViivskgb1Fqu(A!G{Ps2s1N!0{ZW(tqGO1h`|1s7biymSAgttK}5Rrhh+pH&{D56+|z=vNeNvYh!+QclQLB zBDyg=lw?h)=_YRBl?ApCY6JtzFd?I$Ek~oOiuwZW_ zMrFhb7A#m03n(@aD?&_SV%MRl2$Cp8#I9ghj1BApVnLDE5gQgPsC>V3@Oj_&+k1ce z*!%nAog>E)#bM^Yulu@IIoG+)WhE<3Ky70p3Hf7MmNF7F>FC%YJ$CW#Yj0w&EgCY9 z)#Ve1y>L`Tws! zWMpe1@G=u7er@=ybm=(HMDr*vaKWNQAx8CWAASUqxq%)JvDD}#{Z&c~)L|c8-qs0B z*cBmgB#}1ZYR4j|V%ppbj!y9YatJ>SvzQ9Yoiq(27_hpQea-4@#29;;e?8|L5zX&M z7P4qsmLhN5H2s#p9Loc;5_ak^{poO33)CqMgGa1t32xZ+pT^=8S(NXS>!<*9XY1Cj zpY94o^1^6GYHrs*?slu$ueTzIYGVQq=?^}4^E!Hat+Rv1&?>eQ!Dmuw>Z@y#qdzlP zRjU)g&5-EW#CJzf;O6(12?(oG*pb^JR*q1Ml(~G%A+4I*jCr>7SDJW~*o8$!MScBk zD`}p!Ze^VF;oz@R>Xnq++F|$vKdb8sr7_G@rq`g!MDDc>E5n{;5kPp60GgvYu?f(W z``6#c5k>H_Tj|d}8?G zeQK}M?QJ+B=3k0WI0$KrP{P@7IY zNzbOKDBY3B+6^7E1E{GpBK^xlc4h~X4QXgaMBX`8fUcZVuLD57Qn!%L1g$Jpg>Pxm zV(Npwa3ecm5b4ESF39n}7(@^;qp4=inkqkRU%CU!z3_$_Zbr@kdO#bZ@f-~8?k4S8 zH@Z7?J}@@)wnE4Z$P0DeUM24we<^TK|UySqBqKvDSI|klK|9xDHDkm9;|eo3w=fu{n^t{) z%h|D{3KRR87gX??Ri*Q~aqtB`}>B-tJQG93YmVbU>J+RdzevaR;D@MUN{QaA5Q-j0LZti~llo zA3-K#aYVT|i+(tlk=Ioks5fwXv{5q}uGyWHm$XDM zpzYk77r$%&r=J^Q8`H)&@{OF&w5dp^|QNjV*VNMXLH}0#qWHm?<@GXo5-J#clYjSi=1d~s|&yUUi_Y*s-1#dFH;{| zG-}M4d((GKojkcoSf@^%TsQVCe#7(`=Raxu8zT1APSN+0KcNs#?a0=cYg3z^KX#h8 z#eH8Ld;2ZMP)qD-2&!C*?+imeX=LlaEGGE)lpl}$78Tli&JV?(w?Cpv$%wz#mcCm) ze0}Yi_8q1uT;Y{mjoaQzajg0&3MLcxXLT7ijC%8bx$RF4u5Rk)MjpzPM*Z>Tb^oFd z?~A89Ah7>GEFeiDnKvc;f2Kh#a@*Aw&vN0DtppUf{P_M|i?8OgeaWEs;k*Hh9AZ>! z5|*h_9t+T%{tc6vxCz{4&DDN{7QBKYJu2mV`Yqj|=r%Q(a|rpJZL>N3Xg;0yD5NFf zcwGpfog^8nhAD<;NY`KZvAPE$(ftrSLfdQ|(@fr^7KjR7Ulw1=&<>v(tezsW>qTK} z+vev51z`x99UHf;l))xpXnl;CdL`Q)Y@fx{Mre3@Kuzr=t4G^77a7XN)+ z);1Sc4z1n!C^8=GNwN*KS96qDuk z-c*r(6O2)h{Qxga{6h$8=PE+?;Wc z_QkRCXzYc8Xr+yihcaMB2j?3si&$b z13%(T+MW8fVJ{t{Li(@1;^IWifw!lTRS;_vK$nldrDSgDjiCVnIb@H&sby-t)8X?k+h?Qo9t+o6jm3kN#;Y%nejfRH=j?l6tugI|^;50c7-2A4@oWyl^8t zGp7aBTn1AEZ?y}wddaqjj~@A4Y!ltWcQpki$yyxU6WKly<+sZ4>NT1XpPq-BdX#-TU`k1AbK`m4t6`WGE6`#kQxJOD`Y8mGV3}FW$oHXxYol3QPoRvn+uKDo}NiTSG8z?omp_)+>{StBox>vhVu#6t^iRfL5QSb0Wjv-R=b}&1;hYY?NBkwR zA-GzJT1F+T`TtDoyBN-deH6p0a_HX?uWC`$q{fnpakBa@dT)u?Y%}h%RM$%^N;b+(Gs2xRrqr$je`wF4OzHV-peODCzJFfe8 z`rq-@w%}82B)~3Z;Zmx9Adl=NJ}H%E{7@)dGRb>EA15*~FZ=FlKntsMTb@0Zz?I zBvW3t2sIM2-MMv3=`-*W6PCm~5rDy=o?kPQs~LXI<@?vKq_NXsnnmb%ipR_f9cZ~X z3zNFn!GFpzs-Rq8r0W0DoK(eUM3?h`|iJNK;TIqN-WE)dMdx2Ood?@9(_32FLr;m>q^3(xDdsh!5D)E#}UlRaCmW z%3UFkX-o3324JG43{OGjK6?EYFWmph2h;yVb6xNTgRUA^&NExJBAydpD; zQ z+qS2DH6axrmj|73wsq=@qgAsEnbjutQ!17Wem4o zvHwq8t}}Br{K+cgTBAFcK`da?`K9><)1bWDv;R+>s8b>trvp;i@Yu;$&z`vm7T7qO zII;2>INF3reE~zN;vN(kbbwbUwuwxtDul+&+qmyxsVz*7#hg)f;S?{5e&=fGhVYV z;|O%5y#u6R*MAH5qMQr>SR!cR@Ic_`MK}Yec@M;k+9n7g=W$iR0TE+nWr?tQ{23;Q zCaK}?5b~Nla{cBjT$V(E2noCKEc!u#4JCAem7RwR7s<29yOzKnuzkHZzI4JE#rBHY z3>Nx;10kib4k-2jT*|p9-V*u8)Mwpb+VdZI?qXjjTc(00JLh0}%@u0jdj_C`F{sCF z;V#`aHY?YDvHgJS&*jb45=c~$%SWTe(tVMSYR^jE*Y10Z0Ptm#a~A%Y@3UbN#| z7W?STe@X^X6VV2e>Yyg1aE|-1Gkx3}@&<>7{Qk_RIX_>pI)A!dvq=Eb(xF*66&R&g z=w3wzwml=x6JIBCkxPO-ljEV3?al|`3;;Ok?G@_wyILC9R8 zd35s_xo6zK1*FT(JBM+d9M4rb{`0TY>3}er3qcerf=}<&v)!w<*-k2ByO?{_DKVcY zW3X^N&HnuSgSs<8y<#vmI^U!j8ZZg^B#YTOTlkTi6bodEXo$1)$6{W|Or`?!nfe@f zx<>b7(!4a6#Lc{Y>t=_FhIXjZpkjoy;o>TJ3oNLk`4?c&Z($8 zi#P!rbJ5i8^F^Q!?$u$rabd*IymNYfbiCou)~%ldV>cMuvSYwm1V1QtP2AQ9LWnt< z@?PxhQd)&cY)WYBL+55mB92e%{#&&Yj%od7KDk%HZkkVQ1-nXy@r`*-CCYl&nqNIh5_CR|-W98C~gfnqRgKJwwM zCr|8i0}pp9{slu(aO^yT+W%B41U?p#S$;s0Rz!p$w0tSNXi{(mCZ3VT0T(zM?rIxOJ=O_>GOZ zx~VD~DdR`ljrKJ_Rhua>qx!s=t8a8`pniSpz4Ja3+xbw!PA zy=pH1i+^mkgF*?X$TInhrP;zE(&WJjS*S>1Dsym9|y$*--JNqr;?|8m) zIH1!>n+Y)tE`7qQm3)V&wGI>smZ|}eWmZLNX7tes6i8J@t;5psDK_sdff%;udU8K?9LUd*d0gGA7|f}ZS3SdS zqB4^U22y+^iR2z{&M$7QC2A23GdT6BlIg_dy2?~zfv4+^t}-aE-o^4ki2)Zj9k_Vv z-Plxb@e7<<^O4hmuyNo>3WaNQc2KC8c8rqKi0@697!(lYY$s2c*mM=QX$OO6K_bsC zC^079Fr2tnTI{sYBxm+x$+p&q1#6k=+hO*4ejA8DoY&|Z$NlZC zsFS&~ZNpdsgp3A|YwP6ZJ>W(!FQzDG$C-o0s;Gpy5Dlqc4<5j7GsIi>X#cndZRZ$I z7_#jK55Nv3Z=ODD7PFbWpm@bfvXoVA>--5GF?d2k-PSSIToMvQdskeSf>>Mgd z)1$|!_8J_$on1Qx*{Gy!0HK zkh>*=h&RNAR&+wHq7RvW^_*u@3&8S6C!B-0&R)RV8<;AvDS>b&sBZ}Npd(@j#8MfA z&GF>BwAt6m)z03AeOpOHQ_(@-GdUXXeiJFGWUg~&r|P3g5fISWX`f!59U-G z>_aGPYWfrob(6*uf+??O38Y4}DFLJ_s6tq5$sj3zVX6oV6A^isJBQ!w@4^^7Q=i(6 zh(BV8vNVSP-TE*mf8^f0H)_+cu}P;h^{gxFS&YV4=~)XAb7$=g`_ecBg9otuh8AY7i4&#{ z4e&29sx5~+c|rrXt?Vq`60|rvesU5vF4%~+=`RBV^n1MOb2-UiAwt!cfw60dDW+)f zfZ`g4VftS&@!ut5)Atw=BXOn!Dh+R)ff_6_^~P4%2N90#+&dS4T*Aom#^`9=Ee#4A zo1BVZk&ws{(epl)G8LDv6COBF8szwO=zNl4a~CP@UIc=uU?&TZxq@3Ud))r8W7m)% zP(h`e9N2n_3J81pkn$j-FbB}jUBM2Bf{%L-nO=NNh^z+Dp{4;y_`BO4z#QoaB?c7w z2NYZxBM8KP6SKi1zQ42iOvv}gN}AK$zD`EU;@(?R9-8fc66a_RgyaDPqah=DIE=y2W# zS~9Qg;;HsKiEj$_7)FvVsrxDG~x*+c-EucjpA_vtQNaDQL+vh zqk;{?`2-bs6}X>-7S!+5P$nk{i6rgMqo|eWedXLbCUzZv#x9X;#<9KE3HEF{w@!Cn>$V+TepbsW> zpD<>Mzkia);;3QB2WsP)(x}^8<#nG8befJiw=qpT@G@*$`{Gl(Y)FgT64PlIQxi7u z{YA)IVwebi5&48|rh*x3iJLgKw}_{^_)0Ev0wSbWYd!ASy>naeI^sdZXRZHK6YwzA3lEaJr6ZT+`V8 z1PLVNoe@OTU?#%t7yvtGGp#cl>EV0;ph&FMFKNTh3Nh=Sy@>CyepOuan6b`@bvM-9l-b?2{EqNW zWy^Tf{QgJt^TH!1-@DSOZ-)@UpFlB1vd3d@H^#Ua+=!b6meo_ zyu-^!Pyc{F<%5o|%jS6K)wHT}1w*ad0GnzJk;&V!&T~B|kiOjYHf!yK8?U}CSJ_Xmw%i4FxkP?mSH|^o72IlC(iETglJ~}jAf^)A9 z6>S1rtkmZw6Ui8Tl1dk-CO9$s&}1g__J!QNtGaVAH(YcA!Gx?rT}4 z;k`!gJ!t-CXNwlO_&WPRyzaThZ zb}WjSVe82i76w5{++Je^9np`k6u)a(VjqK_ft{h~*DSg+eIv#zkJ&ZasE?lDT-zA2 zaVc*RD-0hVs|%@FtAe2hZNwe=0A3oe-}q)X)=teZI)UiB$VZ&(P`L5yn(gYE)YlK@ zeD`z;tMg?p3BI~qGz&^H(%Q}j`*$Nn znLO!7fP#xMc!W9W^tq@Bi*2C++8Xz?V;$F)ykz<(=YOWCwSi)v+MSh|Gd{O2Y(urU z;K|^2L`t3TJ;f^w@0K062m>12mb5B$d0EkP2abLtg<}#7qiJO`Q#_7b`G(IQZo9w4 z{o$k{m)LaK1_(W$QxspcM{_xGVeyv{ea<3NG@)M;MuBe zQ*ONJ=M#xR4DGro2-T7Z&Vc!+Q6ALVPC4{YcdXQw1i=D(3RoThKW#^Cwp-3O12-6^ zlWmO=VPg9DcCW7ahBp~GPbC4^GkGAcAtS0RShz49$D%%W3m$|`;Tv?*hMe#C05`%! zl{HA=C;L}mJD!-whS!u9xhpKU)XG$WS`{mHoENFpOq`rL_tBgV-lc4eGgQ$aH6==* zqCm}jyyxDF8$}-mkfl%cZ=etT8yo$SiELxZTG8rSHlm8znC>ttJXW1#5Jre?U4-%l zr*mP}n;P^p%$_u6FV!|tVF$pvpnZ7^g8!LU^10dV(YOI&05fmSx0RxZY(cD7J+}IT z^th#JS%J=^xf&r};i^HZtR^ApvrEYNf*iK?EinnxL29UTsC(h=?%yA4krjS(XNAh8 zL|5Gihy48e@*CY7QhHI;3BDDlsb0ulahSupr}qU|vZ%z7(HFgc64(!oMzPr}O2u^H zGn4ekSTAW@ojr&jHAMd$^F@$ZF{4&pqiuLz7k5n@CTJwq>j4?LWyO=m57f?=1S-2I zq6WyLwd-zzB?-43c#-Bj^Fe%^IMy|oEfVVm+W4btVTz+9zb-7Dx~|pYK6HawI9H6Y zoYVCNt81t^_s$nV<)jn5rCDeAGm=P;BHuS5BURX(GLQP z3Zv8@hH2;y0J_{OeD9q1d&P29f0 zcd`PRIkW=mn&{q57yXZQZ2#tVaJlATXcaM71H^8A*`CTdW;qr1I#6jV@<#H{*qVO0 zpXkEh4r!DGeNIxB)_&{UxwBG5?O_6dwMZP%rN*`S{`ULt^#eb=JG+DhG1zW>S3QWZ zk*H?+*>W9Y-giM$s_)eC$gDDO%6=uX)Hz~lPar9V{K!J1h>xP(k00&Fn`B7 zJ~sJqgEyZI$1q5VocLYTHV%HUSGYME=G}Vi3Ko3@@mT2kiNxS9K+f~xj`~q1fW=5+!M8TKbZnUtCj3k_3u+*R0S#PZ2*T1)~W^`WzT-zLtdj%qxeI+FVjW~ z<}e7!#2wSd^Q)&&3SD+Ks-r#H^cEW#^oxuQhokDe5wo(kQ18{G8JR;aFnXMNU7gH6 z7F#ipUE~LjA!%{&hqFuMTT5@hRxOCu8Z~H9iHu|EMSaa}^ud&dD~f0F#&XyGPCT?_ zd!(h06UOELmph@os~;1VB@#h?&_2zL6xI9upFaaKEc+ps?`XP(;2{AkN1-uzX2C;Y zvSYe(WP*Ni^ZsHIu&A`W+ru7_35=|vsQlDxf*VTKRv5TmdX!iQ;?w#JUKuD|V>W}! z!yB+zOWS~LICk05x5QQ+N7J&M*qrT4Ir8CUD-=ake8K~IOARVL<5J_YUj%VAt5(Lu z8tyU3-mINsYs>ygnb|#kC$0C>yp@}J4h@_6$yNgQtNW&HAwqiaur5Cxc#_IaWR33_ zHW8VIo74a%$rupt)DOKdd=q9N{(?iy7o^gedhWo_E~~lIYlF8!H`H^g-$+l2(Yv zSSc9UQJaNKKC4&-`a-`xefnseA9ow8QenM%-P9fp&g%E#ejn{`az!5LfW2GthhI2L zufVx>&ljmmNgqJmj77BHraJVXUL^K{K3<((WEjdaRiz_OoI7`}dWdm+&P=%IKKZl^ zplo!(Y*63y2#DU+t;6aWkZKyNoL0U{23`pj0fk3arQ+(4}NqZ|H1O1SiV|1&#I$6r%3I!>p9dTJ5zCkj&&!_mq`d%t4sE&6sf2divD5a6)&inbpP{O5W5PZM ztk2Wga3Cb9HEK*7|2V9N(?B*llTRAJ{gQHpD8WRh>zSvRHM&Z^yb@RN;J3;{do$7L zdQ%kH{`S8Hl5flciIBR6Ia3HEPic={sg4pWCo}T^T@&{o&=Sna-`{C z?$11b)o}MFO`4da<-f1a;glyafpn}uPkLLp%^gx~B+l)JeabyM8LB{qb0olxu8$-v zKfSP|HHUSiHO&(9MyPb|_1J1yNLva@?oAbD_(x#k`(~Y}Y+&BOs1@y&dXrU1117q# z$X`V0q)jCFoE07L4IC3F>5Qzrx6}X8ppOl}Bqw1LviHZ6d&RbO24}BTKsM%B$uqa) zaIius9TIuD&eT1{K}6~~58YUlRXyopGv?w%yZP24yD)7(a3Smh>oKzJk{hjC+T>6C zn~>m&&AD~RGFWI`$BrINX2$zwv7O;a;PorujF9Xe6(H>hrC-cfRlPhXYExu_m@z+1IbPKQ?y^ z`$|x^h7p(_Z?RgLU2?d0dbA`#SJP}^*naT#fB=89Is&8|$*%Pbk9`yz0^lq&s!B4Y z+nYJjTCJ{>Ta6|jd3WC^!g41wpy1dQ-9?V65jSekL?d@LnsE@GBhA}d^aSxAzDZEL3L3?G;df--8?ko?Y@X+4Wu zDMClmEviYE8}=G>?AWo~#VxbX|P+81@4K+H#IA( zZI1x;44O19qDC+##B%~$J(IBA#zZwjF@f^UtT(VPq$}4STktZ?+1`!`d8*j}D!Ip9 zBjg&8_CEK3-TOcHG2tm|GMVYaFxySCbR?V3W;}Zg2c&1CMpX;P*68S-1vFR?YvlAE z!Hhg5ku-;FE;S#2+0f1>?>Otw?(ERO_ftjPIf=T7IU4NiOiy;qmYl_AvJI_A==e13X|v>hq=r1>@j$2A$t1to}nz+k1#f$#H%sknoL zK-lnGiP$#vYN~dty5y^N>JG$O8m|X7Ytp!J<36i#x(`sSFh@i5I0Z}R@Eb7Tla0&r z5C|2rnm-}VZVtp}av=&3%0aOrdfXy3_>B8fBmDx~_yKv05A66lwvHAo<#JTLS{JN( zwfpPiz+X;Gch@MQG$*NZJgmy;vp$sqmfK~?xA9aM1S-L4=|g4)D!*d=?z^8W*yR~j zs8}(E9pVMYT1{PR*RB;Hq2$;s79xbi`+sd|Mt<^X;FBvmPWZnA?x^SBkWnxVV&?et z;9EVSI=B~MVT>lA=jh{0YehY1>OcVCw>B`HpiVqt?;8gX@Zo=v^HA#Uq!AcY9Akrm z3|SAu)L{sanY-T=GxjTIWFv}mQp^L2F}}XotTm;(#2)U%@_)Vmgs{Q037by(*{;oA zzj>1jx3c%g&=AnJU7yv!h+aVTxZg{ihQ+~_NL>R6J7n%5h96p0G^}Vicy!yZkpuSY zU`O_z;o7Tx=>0;D(Kx2B+7&zk9eCu^iA(7^BHk`J-?hb@4{ye3qPblX#DmS`^s#W2 z$x$v{S4J>=m;hQV^NYi!Ye`J_04Hb5VPB>OQSUj9H&v_MQ5^LY@ca+OV8=qgVXJ>1O9zS&OmpFm-#WDQkCW3y_6ne~vG*?uoiBOJb zSeoqO8ia^dde;X<#B-j#RgI$L#JDb!XG><5yiS-Bf%np#+e%xqxt<3~d`YOb0a$kC zKfhIe!Hqm195vHEx#Jce;O0Uq=IUcrxpExq1x?#sW7WOFl~>Sia69N%E@$hC?gI?7 z_4yYm9w|Z-nF=cxS%a%hHX~gabvH5W)(W>&%s0u)xU90e(^amqjga^NJ(pY_(C5mM z*4%AV$qF?z?A^V)E|yAhuw=?a1EVPNbvG8@Fe~*%sbmmqQ*m6)hb8YNSdOg0B^!Er z#P@Klc^qRGVfi~h+Pbm3yJ0^YTZe_0BpkilH|yw=o|V~d z{5cnN#T+e*-1;N+XW1LK4F+uc5r-!|ZQmDtP0=*b^-1=DM-@T7tka!OmD^Nq9r2HU zRb0HGDw!+~ap6oasUk}m21>!`yg>j zMpF18pTo>f8xuTHD4EOVK=onb%zA3&8uUg>O+)8`yHE-U$I*ijmBIP=9E*h>1T3Qf4%fCi$P@Uk!yU`FYCY=A9@;K0*>G*6So{d7wyT{Nu71 z;6PYc??_`Qp&~B zty?u=DepG^*y1eM5T_qQe1W23Pmzy^9*svD`_Y8O%Zu1Zq&#CTg|bZ47$W~;>m&mn z)o;BS-5n^MA#`)XPXkVDFsn%BrF7G6iF&^|ROKd(U{ zj++ADa_mj*b!=+uU-qDdql_M}rj?1jJEFZxY*)8Un?Zo?7to;4 zM$Gy#Bkg_Xct(}1Q_gmj%0eFAmIEHU{fc+%pHfe zo#fz%Byfdl1t;q0ws%-rKg=~It}ne?wsG=Pyf&U-fx2m&ujH25CKr>e+yRDF6oT5{ zxog*~gMpN1q?st}?(7n|c3y5~!jVM-s3x;P>`?C(m(aW~UGqM`-KR})DSlt_)dmB3 zA0Z9V#hEMYJH3LspPJ$t^zlACzqR0({MfNl7Yl;GA5;FWYhWwrHE?B2ONl}`9^Xd+ zKts?d8ZwGvD9~S~Ziw`0@M^A>gtrH9j}%I*R2RzW)5pMSPhUher4yX{^A^~gBi^{I z*j8hA0a1$f!tZES5=(h+(Qdvl#n8P3k8^tWMbvbp-vN{_QD$qky z2T4dAhjqC3=&Ny*<;~H2b5>i~=!buNd@Du;AQ(gK>>CxgW@a}ttx%)ml)+E>)Oljb z@&xZ}l&k)641wPSz4}ox^l%mggLs@EJiKuFOnz zkZwl+F>G^uCQLSD9NFh{$tw&L2RqQIyEbhq*HC|z943Wz#&hvk#equzhd8F6l9f-Y|a%YVb zgp@flzGMznRZUkFQMgyT{9hFcSEwA>h(f_o%K4@=kjferF$dP^UI3}x(=#x`=@}iU zyn#}Mji{nlm&kOUPVyS%+H@|`mncaIX&6UN%NEhy^&zEUSMo-ZrB-!q*kpIpne&Tu zwHIz(MfgaMED9X=V^$1JBlnY_2yz2iKj^6sFBdlGlSxF(JQOg>ojqJlJ!b#h*l0Yu z<^ng-G?BP|oLGrqt<(EJm8GXvkpDTLVGYEzBm1d5fv?Q$WhGF zlWTiwo1m5P$S6~oTtLn&d%(K>8$vy-H8BA%|BI$R7`fA`dh^~3z!k9U= zIa$fIx0B<;hq?rBC~@?eYD6q{7YnF+lGd}BxIo zbz92zH_DjU2u-7)uH_+cn9lF`!QPjC$F^hoDi;K)j3#97JwCu&HT7%Wq76hj>qL4eYX!O(c27u-JFgW zQInu)xJ;TfY3}u05+BtL?xY5vxY9=#_8TRb1Q6Ha>YhrTyhXAL{_lx@Qf|sP-vj)E zQ7I52=9MdB2-DOqEr&SM2wW#91} zd1kc&UVL*5GD*;hvX*@2L^4ZiGzru4{e|}@|I?stsn^(8ag<(illn1%1NlV*aVy$67czk{ZXR z=HKkBI|Wd<*lY9@NQtWHbG%(~up*FwjwZ0>C5bO?VbdBhf}6| z^l^c>EK%pkx)xSy_yT59+qO%tcLyLL$d|g#+$ZE!2^=QXZY3WN_@X|U;6z0t;)3s?m|NU&zIaGI|jq%_Q zYLFE#oE_0sQw~UG5@)}evS+v3gFD^vTc*=d9XnoJ+@b7|WnSS5gs9U*d9c6jov;enu=n zOBfg|*>7YGnM76AgXa_|79IpyaG)unbhugGH^>_INmd<`3m)6 zsQfr%zs9B$J;<1Wx>O)R&<-WzQ1}g~Jl|pQ$aAw4$t-jIB8ZB2_w<_?0OlD)cj*qX zBdYiZHV$yhFBfT+R}{a55~Op+W6(!&L$py;PtDHG_Bwc+4e8o0kZ0~UiccK4)GPe! zM=SdO-;`q8ciIlia0tQFu7;1wKcO#A;!7X_2^^m~EAy9En02EWhT@lq7NssboGDx6 zb`g(Tv2tZwlXj+xlcX2-Wo9X`s^dykQIU3x@3BETGJ7}o**`tMf+o$UJS}7gFD*Um zalQSB`Ab?*M@)bXoVEM3sb{d2UjQIl;)MDUUj4rJ_%G+?qup%bB!MAC&x&Ak zY+zB7Zr%`65s)NTzYHTI1nvIoyC-)Ntd2Vke%NZs?lG8`(yi}&mCSOty0yKhRn@9q zZ4V+ACec`acApd~DF9<1puq}?`mk17X{9rK?*3-qBDZi2&qhEXEh2?eC+wExdf4Do)f*CD0Cx&Ev4~!CR@;NdDK#@n5xLPo$rTbRJDC9=LjU|% zrHQ!hkBz0#cwldanaGe_nhGkMpK|U8MWGGWQK1pd(0mdn}Vzp}F_c^O7{B54BJ}a7fJbQ2WRdwLp4;5}% zQj*7quhgc2(zjca1|9M`K7XfVB7{IyMM!?`>>qJ@(mCC}Fh{ESTmTQYn{SDygceD2 z`Zpv4WQ~0Cl8+ug9(%dPhy4i&F&}2(nd{tq@+2zf3288JGRz;@g4BX$WjiU&f~F1@ zxQWlm^08V*mkGMH^giA6?S-SVdO3L~c;wY3wN5|prLK6_*hPS(D?Bq#`&q8#&%bY5 zbG&y|H1vvSg_O%7V-{!WNK#G#B!b-a)4AS-t6EMRI`?zEvdE}GU9VSk}^sRW@ zqy#}nXzrIm5CE4OvwjKfhl<4yB2GpZ<{efgDb-)i2;xJrXInR@Ww4&nuj9Mpjcz@D zw|2Gr@lxidRPQalT+rO5h;elZUEr&{3txL&Cd+(Swf?~T8R_B8v-!*TbMZ^|-wO#- z$LP|i=mGX;f4X_8zlN;@2S;zDKrs^vp^b^a;Q(;biuGsUi@tZ}+q*u4ra(fR;I z^cdpVc+k(YOTN!73OpM6xZ|tnItTx#RI%cyUES^GpIg0Vqs!m>SLyURX8x1W(s1j> zABAz$RGVHL7RMZpiVTi|lQ@vdI8~N{KUV%lys?&CT6r_)GXwY`0|ZdSSF(!pfghgN z%JN$b^WugjA08M+y_4xE*Z0LIEnTuC%*Y$BPgvzrKB{H=fib_%s4?SQe2?lK)DTGN z=<#GN^6iY0Ik*$6hV^{HV`=_Qa9BDbJQln35>E7Jzx`zacUx04>9%G6vjys4p^r_f zGG(q3<9t)Q%VnQkiV5qdgw|j2s8vJPA+>AQwu$k1u(AEodp&yfw;M6EYqqcVxU%@% z6ARPh46CV{R+;zRk;dg`uef%C$KI>`%Mir`Ba9sofF7rUgzfrXpVGAI-K z$(SVh+JV2j-mt*(Pj_KLpj}WNXt1qqL3(#SEJ3cro&*KOs!C`eL16Cc}zHg6`&nbL-ssVrt0tlEi&%-l(wE2-{61ANG7_j#Fs$9$78xdd9nv1Df>)(Y> z6^<45XN-m?*~ahwGGjbmO*Vhh941&MO%+ZsVb?}-AB8S9CN(}0v6oLQQ?_hhN5>#z zJT6M<=GqojCu2Sgxpy*}8#qr-r>|xVmnt6X*Vk3q6CiQ`9p0*Ak_wE&Et{iN1H|Q& z3y3Uz<8-hzc`h$e&6}2@s~;LsrkHDYC|^@*R92IVq>ExLHNZTe9%&J)Nlr8%C6oMB zb&5DeDvs?ez}2K`^tJ0(1;TyQMzQsF)y5`zB37JvKaWaJ?JK_AtMk)chYkgrOG%1X zg-KB(3GrgFU0DmJ=Bp>3Xy^e9tR4k3m&lg{O}CuBAX)Wp&{fh)*P8t&w ze|1++ic@>9jJh`6rd!B)P<{tc6~C9`sCI0xKBZmVhCXTH>PS(5u%o6|#P0`maWB@Y z5Vq_$zbD!5^G0~yUpa5YrO$ zd%kg5WdIbz)A$#W%1YPaxI)DoUt$vFt(g==)WCg*ya>nE1}J833p_xk8aV;k&zgh{ zHT|8CF|~17D2VOP1kld)9c==X(hExw-UVGBIN^(@q~_9$mQq1lk-bM`#+D30_Kdm& zw_OwXVFvWL%)bWe!xrk`Z{PH4MI}aQbUQClXI1c>Y)i%?aU8H9Zg(8HZfepdgq}#N zj3(KRb>AzEYm?t`L(R7S4bBAI%-WtnW47bn(IjT@6;#UUWp;qDrR;_&tFspbkhIuy zvCuZU{zN>N5(1)QZBjw#=FOWfKD8(VVliy*Q}PNrt?C0$%E>HI834>?JpwlL-&D_} zQ+^#a9)qVpYX*l#+9;9%q2^_QCXse3}?UR8KY=gwYDG&zX9n> zvel>p$(ev5LmnSGx-u*t7O`PzeY#pU4cyU12$PEZsvD8rsIjDc;^JY?RUIG1Sl>r8 zxNlZJX3gDaw^M7I)GzKEMI%@@Gi0yfE6A!11Ajw5MPeTOPCT%R=B-nscuE|dAs)QE zFu7=7(5}e;tW&5R`sbg27NDi*IJN^5)t4D5TU}9A+A$LX*q36MQXSN^1#%#xi4X6G z7z;b4g{>_Q%dyM$jOsxYSxD#Abct^Z_AbP^kAU*5|7@^Y**9D)Qu zbEam!0VhcvN^hcUJG^a2T3=M8xW6d1n9Y*ZrN51?fKTxQ{FrqC7Ir<+ea%87UIC7X8+f)+M+u*4Ew2Agjb3SGvf728+9UPa|K9tklRI8=lL7H z9+O%!hrmP>W-kg|d!ciOza^L=8)|FIC8R{CH-qeK$6q|{9Vs3D%4gjyKTUp{- z;PrRQ@nIIc&6GyW9BE-CEEx>|JO*Qow{kY)gJMMKA*{j=jh@y9d(gEp=8)~@BmkP2 zAe0pO-<0?bhAP9}B_MM{KlK(2K-<>eXj?x8^&Cg3TJw9TcCHl>mP(|b8i5S0g4hVI?8;k56l&37l88YCu8fTxx5SEtgFsbv1lBuoDq z|7e}QgJWv83^ZUgjYeYv-LU0tIn|9W9*egT==8OdXb!wQYXXT%Ws#*;krD)%De)^~ z=UC_i$1TYB_9eS_w^FS{RWb3fx!=}p#XNbK%pHl9NUNN1t?0siXW8D?x5)OqNe4yQ zVS`V%CGB6I@IdpUD9-d1J%QPk#;gI1t`blpQ~?|1YLJgQ+Ti7&>u{MzRhb8%(IubV zYyFA1vkcB8&P>Nw$os0IZdc%SeQzQ~1d^>9AzGjUP|82C*v5GJl6&^lQBIsq9E!aJ zd(1>yU}bCvI05Ep(AUe&$j4OaEtQOybuyDm-MMY#M*~lhaKiCRu-~NWxoIzBDczg0 zXvs}jwAlz%!gqzJ7@^?b+IbH|6r&xf1%%t`)$5zo5Y_&Bz5NH?J|5>NUnlaEu+>L@ zS@9K1>%hx3N2@b+&p9$BqY2l$)0srY&}v?ce~AzDmh`1CA@L+UQYI)8jHp@csh;8x zCkDb{`gR$&Z2cTk!djsp6)J?>^-Ave?&&YU)WoBYB4m&YJmX6a2ZmueA3fpgq^ark zU|f~YEJwtXT5*5mZZ0vqO?~5i_w$V zTkJ{LzXbn6M(p=Lox7u$z0g}*a(dZ|a9~NtESxh8*_{?2CmR`-P1b#_+t_5}f70a~ zGnL-~b9FO6yL*P=KhEuIvJtI6aeGk4-oe4)jL%m`oVNCEzAwFXmy6{Nr9N#kZO(;; zM?@S-mE?fPD72k+B7;qA@5(tQxD!460ppk1r?+oMb0;aEgXh2f-}B`h?^Ytf!-@A+ zKMLgOxwTwv=vk5av>0|2SviLtg*i5Aw6Pk`b=fMFQ@~;zcD=_K5{ubOo==$=>B^&( z>HeqQoG6vrCi#)rCmsd?$IZ4xS<1 z+eg(#pHN+XQo5l^_4k#@{7ZxX%owT3q*f|2N@?{f+P~UqgxS=JS{K*vtz9b{Y~sOV z&CxvN*5c#^O%;cTS}rIbz*M)y16UQh_r3Ehv2y+N%7$B)w(f!89~{h=xm_Y_u`%g* z`bND@66{%gmb=8-8$SHM*nUA%#ojcdw)4{A)gGdNxd-(;BbrVvAz8M!=K?>}=JY`I zvG}U38)1c}I0)4t=vSW;#+RNuONln8YhM{u30?~lt8y&>tZg?A>PyvBrgGdscl^wuH@li>>;?-sm6;Oh?WcOLDr;l z;L}Xyd}A0+0H`>J>y}(TU@du zjaq%b45Frj1z4f)h61;q&`aFkU&?b-JbQBJchp!N8&A|NX_3^VmOWfKt8D+i+kG%^ zG`-Ke%Ym^l?Ha>czCr*(bMWgcR;lkJ!<1Y?J?*E{8x#QdwraDX z3Z)i+Jt7uoF%z*I|5!?Xd_d4BRqiQgzlS>zYE*d^%(TqeBGM~0zWD)@XHCPIC_C#G zQum*f_52nu$Jm^k4-Mrsj7Z8WTCMpD0+}-3o1_)j-C7L+sDC)KcIRpTyXs_zWmbH-^j;#8bs_zI*hdiG&i&7T7fy>+#4KoV#_Lhrxs;%2G>fqUVrq2rdrV%t z1*9?#c0yiU)Esd)B)6wBwxx~uY((y_NBQ)Wx|l@hz^>*B)vK@0DePGE&Xx2=-dODH zoFSYp8xttyWT!5C$?3Xt+8<&E+P2vREuXcedXoUpOPkWth=<7`szhrrVcjh)kV?%} zI@YiO>OcGn0!N5Z0g#Nt_AS7v?WIEC>7C!KA+97Ur?6PD$H`2t5|T3nDL)UhG~uVH@025!C0 z<0lp#TX^HnF5no}XYgEK!ROIGt)9m_tbOHY@ubqR!LUwW-+xm$c@p>@z=F}F`ZOFCc!#8c!9NAuT=?6Pm0pv%9u55>)YA(B zK^(zco~9@Opfr2fW?bgRJ}5D0Dg#tHe1!+wHxkNTu*acdi{uyZVb2Wr{W}YKc^AlM zsKewu*sxmT@KD%1G#oSzwq^G8PLNoA))olQ!MNF2_zRXN=~+!UhF{=GI>)9qC(FTT z4o1;x1%){P=9fPOSSDY(U>zTY`(S=H4B4|C`iNr2`&2$i#5Sl&l}s2vmW!;@QoqH7 z>}nAb2q?IKr>`uTmf1nuJbqJ?mqzdO|Mtx1B5%!G%;9-jcSvN7oTxR^ZcuUyMa{@jEc@wHJW0US?5}s; z^A$HhqiXBXj78(Ant9RWtF1KBF7RTs9OP|fvui@?c%cFhv@lnlN~*mNnu z^xuMY*PvW6nwabT{HOO=vDLT7hXe}t0r1o;c}z?OqcfEm3>^O5E z7WN#^M<;$;56GwewtJdN+i;vxuF2g~(r|%7b%Ceb59SCtdjgS(DT&#lbB*!DaQ>$< z4h05s<(h7VA;W|vj=!f)3!)-#rt}EpmD(1%Epdg_6xOg`F(h9cklHHs53@)U3hN}n zO?&ad*EhdJ<<^znVpHRJyLL_6Fz!1wOj?)-L^Dp*&z!dfNKF$w)9(iP2lwIq1z4Nm z;R#Y0(YUB!Ym^Ums!8h2DB}UBx@wIEEdXH~zM>sPm#vR}yhafC>9Ir8Dba0r4cDvB%Cw;M84~0p8Lk+?WK|l((6O7 zkdht#CSIjF|4)`wMlpceoF=yR?542g_e2CvvL;XY&55TnxCx~8aY=WErNP{jqcFo5 zedF13Ny5M#u|8)G60Tg0?HbpQ%ceEHuIVK0&_eq*f8bsVJX7tG$#l(L-21VZ8zV~`co6Q`pBt&dtBrdlBs@J$o=9pU zak$tyYJkO1tF%EBEDNINow0lJNIas16npv33xvozenAvO{q`>|V`HChgCmU03b7#e zs_o$|>+J}S!i0K@UfNpc?QUpx^G6RKk?SYjQf_}WySOJe$;RX1vPlO}E4zba%?uuypRYm_B%n^u+9;Gr3Pp?YHir>vCowW1mix(kAk)4a_mCM3P4&Tp~5bHn_A~Ir}E7QKw^2qa} z9gmpOux+kBwTd>b0I%4`!@8HcbEqx!FZ@Zcu|3w#Yvz(38(vr5!YHFbd;Q|+r`&>u zgBQf?a{Ub5eZF`OPTH4S^;^pRZ)!`V2Ig3ipb}dZv*#SH+!*uD8fzc4^Ay;m@)tq0 zwPrv48CM$1pF4EgvK*u+Yx1DjtS();bnBMo_s{PKdcJF(<{PQDNvcJI6=wGW(HQvDuC*2$}^HS2Rt^W$UI<@BPag8=znjiHc52`d1I~uxQak-h7 zH?HmIcv3kFay0&b$~OKK0zXz0vb z8xc2jkYV;(fS;WFe;xYyI8KW%#Hrg{kD9rUljE7i&Q0|n0vXHCT|#$BxjV`&2@YZ3 zI-A$berC$*;%kT3#?)4A{=Q{4ae~i@+{h0+%cs4FCV59s=0Ju129p2>;t_pawW=E)_HG;{*9><&JC0-at)>?*r&GOQ6~Mk8s4a^ zz-Bt^6wf>DEt+=&&9G3HWVIi}yJe8dg(Js}#7sPcfQ z*?g&L$UHek{_eA{@qC3igt`rLFjKP&2bDz(6cDoPcF4S`xXI)iJ;WU&| z?09;##Jp0UgzUGow>nN3j$rwI-GHMWd}xk5Y*G5 z;?bHKm?=3Z^*oSRN)W;-k$JEYVj)tGZvSGcra01QY2nx+8*FY{P=L-QQx^tq7%7?v z6*03>2o9-Tj{#vcU8v!gYC^B19u(~zkYKU&Dzn3i4Q$b=7n%jngoVooUtwn8`|t3O zsh^1h=rz^7EfI%w8l|*G!~;US(4m)4Km{T;_0g*Qswz4fNTKjU;TNqVc$6SDowX-w zyQ_*t1d2ERMfoY95A_!fYZaEM0<+2*Ue(4CL?(UZBK35?J8tB=;*qI~1X)(8#{o!+ z%%=$x_|mXLhYkTigg%}H65zB1lY)kkiaH#M+>fF;gi?s+bpD@e<$JTe$7k<brh0AnVF<-i~}$F>tI>EKr*CESVbQCp;ji!9QgB z1e3vPALdCmyzoX)CdMyQg$!(L0;W&N8w`hAPdD;;DQ;m`KfTS@i$SjuD8kcKwqz5i z>>>p+AQ$It7Fao?0tU=?AbE@26-U50Xku&XYuYt0j^CikL>xQm+>l)O4Iji8cpCA1 z_-0DL;{%5=NKv_0_}gmpeoz;XbyfLO+Bo=*wZ0|T${5*>5Mp~x`$tB17UMj-(WdE zy+^HM6Za^2jjvBByk111W4J}T=iWd&p+gC=k!9{gpyrCq2?0M%{Z=op zQ1XvHF>#fmt&Q{em>0Cba(iaZ7g2tW*!ww6=*ns-sGRN(u0qbDIFV*XlM;`g0z_~C zX(1_T+oloU-1J|i97_vn($Jc^q!Hn?rSG`Kmz?;2$~*VCn)7z=H;ge3!#xgz8IiGK za?UxGjPpuDDJq0gl0ru!bn9{v(yRw=N#pxsX{e`m9Rc^@3-Y-6 zej`VMdR{c{;RSzj3<+&kT6!~nSOm~2iPqw0o<=%xvFHynVVKOR*+Idu5;A*DTUVyv zYGI@He4J=uqy{BXX#23H2&hTtfDsXJ;{wV*dl%v6If3_Uf{|-<^KbUcj}!ot*k$7M z3tq2tdB{+YI(R?F=R8h%UHf`&^IM;wqmKrZvB3?97KoWN&V)$|wY-8_J;0?CfOMX4 zqQp{UflKx{lePD`Qo%hp=M*k;b7}hFxm{X})0bJ94HX9))pg?_Q54UM>vP&W1yN9l1rY6`Dlx|-ddqz_HQgJ>Ehq&jAXe=Z;2c=J?=p9i zvHUmm$B6Td(v0v>W;uk=$?Ia#@2VCT0nNpmMKs0=sD%8}0&{KJL{DUwv;TyVbC zEOV0JflA?VcbfMrr_VlacJbXKr(#} z7MZ*OA}WJ}rTJ=@ojd|wyX~Xq`?rT|pf8;2Rva!#AofFqoud0pP-%4FS#l*vPK2}t zOxQ*50m`6C+yeCV*GnHe>KOAngJj)nRG`Zr8dcsg&ur5qWAGm!I5_pzcl5-<&CP~m z5@L%IXks~rSAu^cSN!a+vMY^pz zdFMs|@3eb30Pq(u)FdFg75P`4v+8@=;nb4gRc^fv|2}*s?r?mR#|VghO>6hjy;o+` zPQU5#peE5Nbm(#m^p1%xb+;kx)U<@v9Wta!{Cs6{Mw9=h7_LhAkmgeP8Ufru^v+Gs zPY`W&$Ep7mxVT4c2A|d9BqX&HMSD&atrxet*sh}_6*f`bS$i!^sHFet(-j7whZt@` z$OqHQ!GUv_8@~+e3)oz@-@F8(1Syh4S6aOAp!%95wx~JF%f17!hj4<}#~vZI@GQxi zgurFm3r5yrv9r$%uRHO#)c`u)(+C+Kpj(8S9C~+2jIlWIe;`#FzeFh}7`dI-x zHJvauhq4E+NJt(L0`ugi8Yj>6q!yG}gc1*}nnW+`O||a~UDxnEDw*(g#$L`LyScF% z-znK7GtoGRbENQ%@(e(P6iOI5b3&E0pP?WfnHJTbPcZd6PFq!YNJz-=>do7>?NX4S zF3S>CLsps!Z-j;q!-U%hMN>;+wX*3Px(&u5QpDjGT68t4+;iAcZq%stnUuq;+n#-W zsSV&IG5MCLHeCD&J-&!vIJ`J~)J=m;I5|X-*i%rO(LIR}C|C3>%5QjDAn}4s$&n*} z23)yg!Wp=FaejvDD**=)q8TxC_nxvhyIpm&h;KRS{mO~z?zZna$YobZx8%nsR(X3$ z&nW6d86JV)m-5|%Hlol7(zd3@b*0ln?w?7fTZ@aE_%HFj`LlCL6AIP7u1v2ch2g3& zIgrp7{*%!WVAk1yWR_Gd`(9uc}otVNsp*a5Q$ z(BVKHM=2!HKe)T8^Q}*(eWj88VWchiiW)kU3dK0(f#y@}6%RXyQMw4s+HEHh zMyr&}Mdm#Lg7>wxeK@?bRjXFBNa`5n`I}mmL}>RvH#$M%`M=a`5Z{XT9oMf%!PCoM z*7NoYzu@gNDV2YJ2zwZ;*w$@WpNtD8Y>$iQYkq}4#AN$UA1&Y(l_YG}(v*t~BxyC$q(C=9skU8LcYURMSryu_;Yhv2#YUI}nrN9j6poXb+ zBTDu64L*A^%0}E&)mL`$ug3HzZTz`_)pg0E_4%jz)g;iBFYOnpxlO+EACR8qtTCC4 zkZeLcALNh+k`b%q%s{rFyzIZG3O#^FC=~x)Wb>jN%CDC6lh0EA%HLl@mJCJrZO&iT z`>-cmvb=UL`M>H8=QsQ-gV|Mc;Pix;D5!=FH#b9d#Vi^DrZ`QuEb3P*Cg zb~39-UPHB~o%`hf(2p&cEQ))zhbW#V^ zYsO+^Cc`wzeF6Fpl-IJ3M1WQ04Ui(jXB+{<1$$`Q%iYw)$tN@?CzC*^!pVywPSdow zR-q(MNtmLL=Vu4KBL+#N_F~McjzT+@=Tmz@m(38>4i7~$jB2gPIz)g))hXU+cmi}e zV!7>$x{8A0BQptLZw|C1HuD0af8cH>pxw96@4~n=9z>i%RP2FUBtg{|=Qen5`exKh z*^Ki$+rr!deeP0#ntw!_r9n-cXaJ}<6Ynth(k|a*pdJM)nU+j0`O!=^Q4c9*vm;1o zmvMe{#ZP0Rt#9QnQnlsJ>=rK;?|CqTBlH9aR71(Zbz7YAa_QTrCCOAG0Sfi?7u`qC z#7W)hMMqn$wyj#7{L7zZ{yR3TQw_bo8nzfb!_f7=^IS60seMRu@^q*a?%vsc;$8(&*PQ2C$ znc07A#sA}Y+PuFS@lkoiL8DQ?fLqE?+@=%Od@YR(o>gU5qIE{&jz$HgFy%9M5Rba1 z9J6XM`;^anZMCSO$v*#Szx~1)AH@+srnDz*>jYE`>G>Q6-;CW?zRtuXfY~F`hD((_ zgG?3k8npr3-PrO!p7I{6XYbzM42|p(abV1z{7OcrTLq9|&5Il#1BFj|tvD__7_(M!mXOyQIS)iU4WM;ey( z%lAJ@{mx5Wm(dd;j3m&H{^eLy0$&RQ1O+J#$n-EqNLfG(j;cZlcm`{=?7m3Ia^7_J zyvh6F0{t3Rgncfp40Bfq_^x{rr|OTm;0a%EdTZs%AbQDMb3|xQtJtRVlfl3kZ0Uj( zs-i}WHa;@d;_WRVf6$<+#%%>(N_W!VZZ_ROV-?2OC2B-#gW|6v%KwK^s-jZO#xPqxx&b-@A%DkFq$f(&%M>vp0`Oa=kprtoszy2I*tUE-o z15f4>0dqivb}!z?5XhlpzxU61n=8tlM*W|aeh4p z#f6r2TV-VnJc~5PjD09`YsCMx{hB#C?sp71+6=DY(A<{tjzUEosz9QOnyj|3QrJs0 zm9{21mgru%o7w}7!Xo{bT)D~xv5vHDD6?33r+APa^DqB9Tf9chNz=SU)=N*$KqZIn zl8Ez;+90 zta{DO=6maJ|K)s~<++Vx5c36t+oN^n_Z=``!1OaUW7|$C7{(c51OtCUA-ZRRy#=NH z)6&vtq&m@n-QdSlw$!sXPDP8-@MSGLAKFzQ;xEM4BX1STn|7Ki#V#7EVq?>cb_?1z z>)F_7B@CA z0um~e9Ev%xAm(LuA9d%Q=E0zlYS;B?$Pq1t&4ce zxO~qZbxFz>W2gprijw^vSo=~>N>y^j+f-*VijwE}9dUx-Al4|1V5z=k^`yce-Edl~ zt)UW&`e^{~MGBfqg@B|l-20*L93evD?fzm3K5mhNPwu-1zJ0WD1zmzsiPf)P2P?!e zxqQr<%zpAYBIciHX)_$<<&<9v@ce^lC@vA|RCNX9vfI(GUk>`Hcaw%0n;X0!9BOqnuG#kua9RQiW) z@6)9Ui@L3jT{jA6!kIT!Mbtfveyrlxc!Q9>=c)%39=sHmBt`*u6^lo+f{O zYcZGvCoI7XLF|eI{l8=I(dBrHbCb*Qe&2h%U(ur2j>pkgB^Hq>8G7t)Sz%zZTNX$S z^TMX4h!8k*&*2D-E?`>hA*a0^xPSidO7Ln&tQAcV6dePlx+QXa5&xFJkkJOc!vm~^uNzU^W;*vH9 zuuPv}Q-_3^u=bq0_q~22)E|d|-M6@B_V98ujh!#M+>kjJbXE3;qKu7I8tv^dcHKR% zd8F_jw!Nc7bn&Lgyo$l64XQpy3X}_!?>ER`$f3mYLG7-obz?M+*P=$Hv;|BAxCj0e zv=?Q$vdSDYFp~Xy+U8&EYB~1t5C*akbbn5{wCG(YD8Ii4^o^- z?vAc_tL+GYomj+HP>gw{J}PSZqN1m-^rV{970(PIv&F|4JlV;5p95DK_%jK3a7m0! zl2qp;=(O^kjW3$25>-2>hO`2;hBN%gZ2gkK>Za$tm(q;2kMwQ#qdFKZmli|){QL-i zMz=l141)Aj%>86kH&G~Tp<^Lkwvd)nX>RB>t;b z#Ie|9>iO0@-XvqdP}c#)YvKztn-HrOqHX&ol7%=;CC$CkBX_&2C^N;le9r4E1 z!TOdT#t;z*jN(m3wA<&8enCgI#uJKQ8hR%;jSEo8c(IJoVN*n{i-a=1NP)e#y1e7o zNwy~Wy$trFZ$UsE*5;lUZbPELVP;WOO1rE)S>)DGS7K%;VmDmPY^dkl;_8_#{wvR; zKPLLrR8mA^A~=8t4lgq9reSp$l#k5m1Ek3A@K>%kj>mW}l?_XW;v zt=I4;f^_)HJ8X{V8MYbC*`ifG(zW1unc!n9JMf)n8T+pAU;UkQDStU+G)_Lx7=Ain$i!o%J7Dl015@wB>q(eEeuUhwHA zBxyX7c%704>l>i>o6q}oZR{?;9NMPEIDT({;Jt{ot!N0MSsCLYx%apfv^P{Wy}|$Q0cLz`{f~m&$gW^Ioo^PKcyS_ z4L{JfUAy&9b;%TmXYfw)@^8`Fzi!M&$H;p@TjQH|Cr@G-2GxNEdsZE5`Z0~&Memwv zef+w1)rU?CwT9)*zVQ9VpuB|@5p8>tvGCIB(R3|h(m*cn^K=zhE9m@CtuOg**x%(Z zjQa}xMcp;KkO(2ywB((`HZ*;M*Idw74V9MrQX>78-@tCD6fBXzw9cPEibJ$htwb?U;ZOt7x34u3*Ml% zyObY|8#2eSCI8G#j9TCPOhEp^iauuoWI<^4Qm>?@pZO;re9TmGrLpzz)U(n*7L`)2 zQISP)@9(F0M#uMVLiDuSEbjQXmU!2l=Wtg&ucbgI;Mjp8hrp8^XO%dSvr3p8Z!GW0 zC!fSHKrO^_YRf=olFkA?+5wYE%}-C`5o)r2B#bhY6`C=Us!mT&s1jarty}xIn@JTc zUJOzjqo&#YXdby`<<)Oih^L9jde1jDtd+(eG$QABWPSXY{TF>Pu4RoV`RFR1h`1Jo z$SsaQ7e65NJF{*#y+QDmSsJH)hEmN7oWP`(5SEF&tXj1gxAo`1z(mcy)e&0i|D+MT zpp(YH#hlpcK?|dGKk~D29Y%g~(jQg#HckE9DsQRW4gbM8E2!zm{L_P){nEmOv4?1` zf)!#v2wXM2x+|&p&F2!5cwK82(yYv0B$ZffE0n@52ri)RkL26qEH8cIZ~6{WGMW@0 zkYhXD1VpLd#&2kCcxNuXP0BZQA7zG{zLpAyS162dU%fSN!@=hxs3c`Jm$XBZO*P&s zqP1W^bMedMr4{{)#`901C6?Vk6$O9;ihI7{gENrF)x47$bMHlb_@Zp6>yH`x%vPxH z(zQD<*S~Wpgp1oVvpj+oQhAb@xV!aJ|3wXZ3!c2>Nz$zB`TEiK$}Ew7_*$yS$wJgUO6fDtK`scBP0@s9~?_Dk~uH1Z&#+2GO&rTDWlnWp&Z?54L_ z-Tg$XpPSQWW5sdIkZ-KAI7zd}N>wheP$sg9_4<8`v$A*Fy{1IX3xs)<89kBr&eJPM z-IL({@najb3u#8uD=+&+OmozTa2g}d+w$sRe)f~UNRWSk(EsZl`A>G+$3JEDKilU2 z`Hz}<|IgbcmOVsPC*x_Q6Pvt9dbcHun7aL2pOV9S#3X`(>+qPsMO~df2uI!gCE;qE zo2QrD3xfyJ)gvNk63N6@@)T(x0Y#EF0PAx;323(}Zr%Nv`H~_y!oTp-hnqHR&|$OV zb8ripk@VK3U11W=Q&8wx2gmwKN6zyCs7uimi2J<=Jw#o^gEI1f7xWKk@(VVN|LE`r zlw>9nK0cg?@&R*Xd6UQ;f{7LrH%9nc!jbiOF$T!wMCV3QHyO(*bFN|EBx#mGU+kNs zc=~)`L_^2Q3v?9_oWuZ_680z`QdCkbqr)%+l7_L)K=xAq8rns~oTh8e$CqK-ebyqT zF8%c-G}NPmYJTRTlMHPjkA@ds#wrH**|B({ zA%7eD{%J?i_vsW%Oc5c+%UU-5)WNwLY-N9Q#1#{W3)>Y0=KkNm8T>%7N4(gSSp-k) zOwM`OI`S+fJbVW zqDI+Jp3GG%)xP&Y3koHBUk2w=EMY`Kqm|N(3Kh%M3`M>m^K`?UQpglHp}OyG7uZ}1 zG-;3YWa6t{p&ft!UUT)qIr<9uABEro8F6=P2wkkWcMLZ*zT2uz z8}p@0m!`ya96V;seJ>epxJi0jwGOGzRDbjCAE#q=JDt+!!f+{=J60;A>7wYPXFAz- zib@VEcqXM8?UJHN?vyWjUmTpIl90v1VRilCL!-hKdhGb{jnl{R5g)A-s6_A}ot#29 z%F+HjKLIRI(U+uTe(VN_LD-ujbIes4B)*0`Cow|w`* zw{Nw+oAkF9-#qEvEa-=+v$lNR?}xwb&1#|4C}}-)`=C!0J7=oWUj@}wt?L+fCQq^N z)7)Uau;K)W$+;VT(>`t8e7I179#<0$6kJZ zjUJVgj6>5Ud6TH?zudd>g@v=emX=n=TYOVg;mlqe;GFtkvQIw6*One@%XH@hx0q!a zUq)lG(z*fM81=f}(YrlYKl((*F-R*V_YL;zYu|@o2A|c?n5a-r{C+lwlz6fgz9ePx z@2${adjyw*bi|aypG8_dIG;S3AQBg||7n}m$@!-1)}1BeIYI$BO(g@4NPAAl6n*#J zaSmjR%=V?W6AzK$>+5RTYHMVtY-N?*g*7n_Uyr-)uaA(GGjc5C~o1K!-7 zhWT^V$z&dFwNpiHy0hws&VYkSD)$oK#QAS0&b2OATv(R5-)q6THNX{75I|e5U z%NKP$KvUmRO?CpS4$g5&B*WUB;jkma!9C@}OQP_%j1yFvVZnu`>7K=YkSR<3bvP1}D?YG3nJks^mi7dY&!a^Lq?H;# z#oeSt$R_e05wZlbn^>zJLP1ELW^9}+fXxJ#pAg(1k$A1(-%fH$w-o2~nleq7MZE>|5rY zV~Jv!hr0F{i94adQ(!n|KosW&FJyEJ;Rfw`0KD|YYqCy zPt@70{4a0#Kl|8^Y?oj1pQKkvROb@DD*A6e_W$Fme*dROOMkyJt(t%Jr$^Hx_wVxG zy(M?*Y4U{!M_<1GrNvvHvFfYTxajipe|x8f>=OqSgrzgdbwq(l zf&AK+c_XIKvvG$|a1>ue9WYo#m09wybb}_@{gIkl8h>-FxkxR({`x39W)#{9i9ggW zg>!LsfjdJ&j)+W%I%Cq7yFpAmgvL=%ona(5;R-jhXN|psh<2O@ zooVEHQb}UG40}8Yh@z`Rqm)v16ETVCDN3j#bQV0sXH}-9;1jWwG*7ajF+tKpG9p$Z zy$_KdEPKDGWeNDs*k?)~Cdq|S3G-%mCxQG63(UWU-$0S>wB6;j_j&iTXr(F6FOt*a)SffEVgK*9#MRdLC3!{ z07{Y)i%*eu^X3fU+o4rO_e?X-RQx++KBoKtr^J$)5VlEKalDpMhcEr`7q61^ACN_|lpx zgG6M+^X2F-9MeO7CB>MgqM`Hq z*%Jv`ZtvWaD~_}A%GfSr=9$tlO-0xL3hl-+@i>4>RVr^**D^M>bV#7#W;(9E7g=Ub zgBYv9ud2c!!k=RnG{d5p)gYa2ijrS9^)TLE7r(adO={(>3GJ0C@e7`v)QWu(-lf&W zB5;aPW`Ps#LJZ(J-P2Oe2E=_lFryU)z z(W0$pZerNg?=Vy(2`fD@m>(~>@~xIt8IN9Fitp-YaeYZ1?%~)T zP86LwGL7sUQ|tbJXa{+-6+Nz)zWi{-y<2Q)dfLRBMz3D)ja_39p{VyA_P z#1*c6d#?)66};EedDYv|PFGH(=FvBp67;^fVa%n1Tf-VM+$XFbbtdRxMu3rb{k~LN z%K*cY+^_xg3`Z$G3Ar+8!P%uQ)Qb8UZ>!SE`I}ierf*w0TT4WXy=Rs2X2)vR=|PT@ zZe?6>m~>}=Zt>dc)V%U1UfukxhE|2=JJhWyy0@dNUt`1@Z>#`FJNs1ZfAcLt)OdzI zfKF~zM)~S7foD?7zT2oD@{L1~UqwOi!wkKxe4Gnm?^ZOF?Qnf~x>u5h<4KZr>wMbk zoOZWw+jggd2^CAM4sw^>tXbq)*@5T2n8KfGS23PVyPvJT6>mDLeCfK6uS;-N?s--W zDmA}6+|&6QMTE?Gif&R+c)kzQ4EI71UV5Pj&dZX9B=_VgHAxH0diB+97}|I2*ae`q z+ZAHbvT3b*X*B zgYT_!*B_O-YL|vd|4i!BxOXAi#T)ZB-<Srr9eQ5fe>=gz1aSE&wc&~=rCuzaM=QKP`Jhi57@R;}$`yn!7VKUKrwM<6a^ z6(#B;x5Il#thTt6pQ?Y2kE9+Z}?o*hT&|ir` zll@T}k22rs{WGZ{B-TdydX7>*$VW(O>)xmP)zJXU7=#nTkK8w+YsFYWAbtE+BR&i|a zUFJs&e_FI-cnfc@^t2)(m&~g+y+Qm;{_)d=Bbicu0FA3cDf2^5QC-bmA}0jl+gJry z-WS|sd3kSQj90}U-9>8~m$#h%!|!h2WiPQDVpJDD$v8XUk508kPo6MA#8#=I*H^x~ zX_Yj5DzktzhcCVL%j{b8DKo?dQKkCo-pZXC11w`gq(e#V7A!M5kEWw56Tzi2i_`WP z3KP9DDoy`0Jjoq=Jo<&_Z3zmxD`lo=b%ded0ZVtdbBAuIa%rr5x^jga4^zC-x5FKb zz#>rjaoU132+LsxCM*_uj9~by(ERQ4Xo!pi*Hn6Pe-nzD+Q$ha8<_MR! z_IVK%DX9fza(KUvd}h)J8NjP|YXVnVwr9S3IMK5dfFqaFN!nS&fXgBjSSokPr3`d5 z)WjmtBiT8O=+IIcSGNoWgpyB7ZuNM$DLz0#g_C`l3JpX&I1X83G%1uj>O{g5W%(s* z>)Pl0bgw@3=-V(|)NtHh@!FAaiczG1u0oIvKKD+=sp_7xm2i|d=#YCj0mkNL3(UZr zw>ZAmi$h#H9Wn{DTPjWfNE!LaO1ZHlYtZSMn$^OWi7}oyB8aO642Ot~SY45*ud|Ph zhBKCK;;#nG{e@I&NK zp$Ej|LENOoK^in*s88#aZN&FaS{dO9tK)l0T0w1=? zqQ672Bk(a1vxGi=aR(pH2zr3c-xt+mUo(20Z4LfMIE_g6oCtBpw*17tTk(c#tNz z$%RS4^TYd_wvQ8AqUq?nvg)h^PDGqEC}S=Om+Q9uB&vD=Uw-vfv1L8sW-pc{gZi7c z^7qr_gX{3YqZhjV{Iu@V)tgDxBr%jkUt1|6b3~bP%l!Q{a6?)O-XvC8VhiDLmd_H! z+E#`C@yEpds2c^(fl2Ayv*&T|2WzItV}zD5%bAbr@BS&LLrmsmavhQ(5k5=F#53?D za}#4N6g$!yCQK3}je1ray*h^8X2In^y!#iM%)@7ZqDh2DxQNC;=*U?>G*o3c#9tRX z9JWxxRR^{@t9O*Rl#4`J%W!?f-oK2A+6RS{6t-7~IbV;<^)2f6Q0mP*l zm4{S%aLOcZr2C<4!CyWj!NFjF+}^ z#5T@QVKC+Z1_6$X7cT`u(c0$$8a1Qr7W{0}!hOQiPQ@FiYDW$W_K!rP{QHNX-@!KL z?G}H~3>qlS&K;;TI>)1Qo9j)yvJ7R9cf{dwaU*eeI=5__!Y)3KipMUjp-VMTS_Es- z@+=72Y0sGC1V!WER~Srn->pZNa1`6k!j-?GQ{`QD@Amz>Y;$*@(oL&kZ7;Y=?=!QK z_6%MjO$EF1sX9;QEuX9s7bHFUn{L?6#g@*Bp_DeMTWxM~?ZL0xx*o#WI;Oy}aqtRSaJl85YM4)L7Z2 zV*FD@@y2UT>0dnlyw$kX8wkcbu%q0piWjzWS@A){aHR=m+By5!u8%dh}?x z9YP69_QfuR$k;`-aMI|#%Qty%4vfoukAB$`ibt76vjv^22ORbjD4$~vyIUc9l50Ga zF!)TWDcjb98c?ZBnnV-Upd0z0J}M09^2F=+g1=e){dBJ|5c}hQ``h0Zy1XhpGwMeE zv<8FSPy6@5u;B9j^#HsmuSzY?g7zPwhf^hUCu9Iqj~6NgT@N+ojXYdAc*|3cpMAR}!H|vOtl#%)VEoP59QDN; zlIIT@^;4wosGs^PG#+=BPGRY`RW`c#VzaahaoLh`oQ<>ZCmQ|DT1EQm>;fHnzg(u* zi@-WOyyY~pFzE4I+jT_X)#;N{19rX}=Y9reG{gmaz)s6#~I8Xn%tftVe4%24A$ z(3)PZU0A!aep|DCx8cZQoi9B>LW$5ZB{KlU`z`f;9$pVn^Zk@^tU*^D^HpnG;7?2l z-81GCJiV}!Ci0hmKk&q|L(iToj$P7LV&buV=Ud19>)IwCB7%#4xAPR0P-)~yN@MF* z)Vy2dx+Nhdy(^`{>ZaGWVDZpl>(M932u_~)4HCxjDoOhd-(KsjQpIX5CAkqq1o6ms zblZ{L^myT`BCJ~Vw;Q?q-b~P&9^2YKdbpX(^GyF@d*_gEE_LqU|N3jRBy+Hxh8;mT5IWMudW+HGL%;ndv+N{w zB5S~seV3F0E`=#0Ce#P=cVO*?dpw`XUA*bz3$@d2OG^!Pu=B?FHgXHs7Xr-zm2z7ft2IvKlG`?I9bh8Je(qZ zxpPBFwbxH>-&0SU40ia zEmBfP_~;KGN{=6l{#4~xCCsZ-mbaSkrRs?WCzTE^+#i;vlr|q{O+2%_(iG3;J$6{O z`j|u_0_QS%z!fDNzmnh!Oh?yZDR)Zf%;7WxZK~We(8j?q;BIQ_6wV7vwv<`S4<7Do z*#xq_NJO#NUsI7+&)|619!4d9zIq%nU#tz3 zDse&<)HCmu;(&YZOdQU279Wpni^tTPd?Fb(KAr#NXnGes_E7cJt{)HTxiLJveg3=kkNWs6 z81J+Gc2O>k6JI(P6s&o+U+B*pIZ0)9lT}c{yJHjA*OrfRu5++Yhc1=Lz9NGT4|iN4 za{)>Me+=6Z`esLP@Iu31#?o1L<@zos9h^?Zu^)K&nvV4!k(m=7wCJAlU8N<`=+f$ke?gDqaQv^U(B5#e}X4OFj-5eLiZ zd{6W#D_r_EmKnFd+D>By2}M!|c4%99hH~{_Tfeb7qo@ZGHms&G1o zmXZKElRyqswR~_&b`ISO>3#KO3b@*{cOmbon?X$_jF6oHBY~E?rGQZ;)PZf;|sQgeDm!v zj)HC+1+B%@$*{WM5INKBl6af&aGQQ$EY61AlR$5JG~WD!J$9_|PCEo!{K(1d_8Fu> z(#n(Tw+2s)BWqutPCZor`?2FFVSHd36xxQ-hxk>2;xETZB8{wSxKoxwEp4jA_3m)L zQTP-IyMTOhWnL9_36Ods9^!xx)$8=spMr0$-|PjH9>j)heq#UbM)3fpno}zK z&s~qnk5cP_HJQUjd`y(5|_L0qf7zn?tV~F|uv6#${*h%B%>A zmNdqQMJVR}wwz7qh=PC(dJ@B@OIHC&p|*H@hshS@eYG37miNPTqrQ<|E zd~qHlofQb0i;(HfBkZoWMUrKul6_BRd%dXs_wq#;kpWeRJ%FgY0Kl!Jx)-8^>Xi9C zGP_Ceuy@o8(^R-69;R;U$N3obMEu?0TyjvwhD-M#AA;gCK{{;h0t7_i1au;j^HKIH zqEoFQ-=w&~d{ZFxHx03aspJTMJE%B5VF z$zCi$X;_qQ1+EfQ!SX0G1nIw%GPItLZB6|k?Uh2Os4Gh6C!cF1HDk9G>Nf4R37@@g z1~C-DhncLhu_Z4W&NW6o@hHEa)6X4_#-!4TO;=10oictfMRM`6qz6NJsMgfq!`W+a{8QG^#pR0>v$VGdn{j_1jlE<@}k26kh zvpqZHngH(T{Nh*qZR$2wQ53|Xt-ofleI&bz|eVkfF+Mq>#C6;#_lO|YQ<#K>a z_02Gz6jY9hX7$1?4Bm_ysp^270 zk2iFYN?8tEK?pcOJmC%iZ=wL~<-wwVi6-s8jtj%00Q51UO2hZ=4mqXFYn0&@q;(eK z$NwOL82025(ST41GrmZ5u4O9?r-chXU%`C~<-|_Q3s9zZ)C3QeSApeR={}IxKOxeE zT~9g;L1;d5-*lkm$TL6K6cA~Toph^t{W$DpJ6AJ?&*d#2Nlf6IPjbp${axt9$TLt& zZW^t|Y53cqxyk4mEN`;%n{P#~6#QAN+2v!ab5;Q@2$GGRXV}ZuAkbI-1q$7Nio#Z5 zPeP*#7kpdfdH}BiO0h9zup(Yv^Y*?GS)xF2tPOLPiYx|@fu;Ow$&0&eUy;N115KlE zicYkd;G8)O+!A@*)sWeqB5l;120RmXwSo041F5-2nbyLt>EUE_nhbFPr<*zU+5!r~ zdK@8V2H)K-ExR1Jdh?%M&Mb7?bh@G-KD}xcTSnA2lnjwFY5=c7S&5t#o^W)-gZ`w% zlRDKxj11|06}J`gE_{&A4lj+kvR=BAzf}rb{<|yZ z!6yWlW`uPl>B3>7rJ@)u^)pHB4yq{rr(WKTvf`#Az}&9D9-@zhpX6^tC)2Jke)FZiHl*-|hm0C|GF(>2_qLYePLH?h#T>nM~8q`qU9rRnkRXe(&Vv zezX<7I_&9#NOE=by2*YJJ`Ix)-n-7lU~s#=B9tULxu6kFB9syA*FQ8AABRj1LGC)n zMU3S7@Z?NOFW}4TK%C62&WxFNI;#_YKTh415rR@;F%b0v@$(MLP)=;!oQ9u%`ZODE zotmV!b{~Oe^{IOBnQTlN_IPTCQsIp@TtBDG7jfXp8*Z_g?hdtGiM=fLvN%_wofTwp zc0+kyd@B8Imz?T}Bm1~4tA{vl2*vaImTU8g#Afab&) zku%oY&kOi0?mBBAV@Y>MTMz;nuG;Nr=@CC{(sijdJ**-@X^O$|R{G4#lwZqeAi5tu zV&~_}Es`I1peC5Ca$+LG zd-i`i*mpW5tqHhz%uq@xuX~yF;m15ZNC(gw0&_b1bvo{ zCXaI~5C7tB@FboM&6_ndnLT^<(XOQFLxc%m%-D>y0akH;Oq?=hABUBV-5(7tJ*}0B zDQKRTqH}T5{+46KnXf{hlmck#ylC5f^pHt!Ma?q|T6iRPWGMJU($z`h#*I7rleG_@ zKXutNih*I|Un9VqWXR}9Nvcm%T>AW~#~}#A8m@nbHvEz&6{UT8+^{549O8`WI8EQ zIu|(|Vr9EMkJM38$;i~=Ye3cMq>{&U*Yj8-U);>tJZbGil&A}eii+$YahxJd_b-#b zz-pS#4mo!4E+yO|=!xPJ<>>+X-fLc*E06m05i@WXUXf8X@A-HcvS^?ZL&-p+X!}a= zL(d!aqHkmU+(VPU=$!`i+~>-xR7&*wUG362`(oliY_?{PZKQIyJk4iHF+kcIAj;mA z<~|+#Rq3oTvt3FPli^H|{l#;`HE8SoM@`sqFR zzGjg-!tG6|!`HmE@4xX-^hu3XWP7^Q z0xRb}>}r>Jz_8TgVE+T~tPw#~cGcC@qi`Z?SIREQH15N(5q`f>kRac+jFK}ehX_g; z@nGm)jZ^Ns!i`80K2pj^JxPlw&|+UgL_TL3Ml#c%qu%PlP%TXQ@(5VsSyromuz{n^6Ed5 z-8V%($mhziHqHNVwkM`8+*=ciKD~PV{vlHE+YGP?v$6~CtBXLC!m6}Kj?DeKi}V_2 zy8*1mRd##v+#6lwsNV93rtye?5LVSpQR!YCKm%V%j!YFEP7I9d;5w?7J=!{8~;N!#Mzc%e?~lvKXNv)PdM7K>qk z+^l2C4=qoF97Ucns`_*qEYQ)!PwU>C@{+W|-Za%{&Oir#Kse+^o zR?r4i=u{_eiNt%46hH7GRXEzP{tVSxV*BdMtFg)~{#Em3Px6nPXX3Sto6{Z6-CjyD znt^SN3$N!yo~A;!CjMS~blr?6*Cvy+)B~ZZy#Q$DFfuZ`?tY4#dq37DDk*a#i;lrk z`9R|qzO-@3>k=iw(36!idSEp$$Kj(zvD_BtU-zHNv?UW$Pn3>Ior}ciPc#^v@lHv+ z{6SpK6d-=1yO)mAryv&t9>fP$wpG;^DXOz$4$c?67VgBE8)a#PTl=y4(2`O<@UGzC zU!-qk>FrBPtZHkrm#Ui%{=e6rH^fWeyCCl^mrMj0J69Pu*CE&5zi zmx0y_rBp>Xt^_l!=Qy>*G&kRL#AGta^oEc(Iyxm`emFe0tMvdMRhofB&+ADJ-`G=< z`c$gqypr?Oan|{OFFXvcDOZLo&rh6%bSSd6ELwMvO=9}vW&6`ENY1FtBGc-Al~IRq zMDb!KM$sk6GNu;?R*xs8OpB{R{L)XyDJM+?@AP1)$NXsO7r#Ag9~n@k`+iv{$gB67 z^=Q~#c1>R&XfVRkK+wkf7yK?LPMb8SokEZOludxn%E<&eLo527j#KxD5m(F7^7f_9 z6~qrhPO02H);)X69XXJ89q}BQtL;R#BYxz(aX4V{cPRcz(38%KXN&Usn~7c=EHa0k z99n>JT2*5>RU9hg$!~S8JM8pbXNznV6myW@$RLBaKU>_)a}16={bAkihF8Nr6yJ25 zvF*&M0^?U|daA!y`yK|PGwc!@%jRpk14CpjPa-inYMpRY;Y1}HRh4hsf5F++dzB6d zIYk+6FlhAXdnIFQAtYj=>&rN^99{I!jK2~~jc8geHNTUm?k;XoKA+_Z7y z3ml7WcPBnPG^M@t^6~Kmj-&pKz-PpaOu>>~oZ$;E`p=&8+&+mr-22%SW8)+D)+~!z zt*Sq&ty4Z$#uTG6mBGqxyY*MoekRq1p= zuk3%741~Uz>oqKQo8t#*QfL0aE`Ci8XX;wR02e>vp$`W>Dd+&{_!Fc+U_KeGCZ&dqhZ1rH`;GA%^RLAO zywhE?coCUhKMqnG7rkkp**nD8?}{lie_JsMgiKoYj`;+3XpiW34i%yYoS^X900D{j zYq$*xrNAJ&VoYAjq&KW|w3S4)Y@x>G{sij3oJqc3SEq^yO3b>v~2-{LZ-H-`NiL6 z@>`=$@VwF;qCapgoONWaY=@72GD0&%)K+Fq8*DXaAt8JU+nx!Jg{Np&`4c7HwEXtK zR-C@l!CIKSY61cvnFu7P;(XlneLuXrEf6N#HL`zfeZQWy1AQ~0it~zmO%9kyC)~!& z+ZlF@rYmr=nqzlmhwIB7{mBq>hn-bD{OVQU(`SQ6j~;DqH-O5@=jrw-qC1gt9oJm( zkr7+=(yn2J4bB%5k}z|W$DI9aenfTa)Tb(2-LhpdDPKp5_P|s71-4^GrSF%Gx?y6p zBffDR^uZB!&FYNK*4)C_)o;(a#OK)uq`iJN@2y=`b@k0SJFjq&w9xw}pc{tCO94NS zy@@evc=$87lrf_KQvz)K0ZZD}Hov2-)34w4C0284%Qs7{$)p!Ub6>&iq-S2KZ10dX zc=yV8&u8IsqJJZQMkduYmG>RS@F6^GBd1lETQRCY!pNrjzCmZ;Vgo#9X4bAIaTKM9DqOtaImb!@=cA!1 zHU1ULm+K`1_en=8+a_DH(E)NmrBaQF9S-wsW|k#-KGPd$@wF{9y*CgoDfxHpJmquT zcl!?km^B{u93<1lxuh3VFMAY*AD$l~x8HNwhh?dnXX~591|7cR*I31cfw>k#GtOI| z>|M3qIJ0(dNXXLpx1R_2ww)TA`aLaO$0p|SY|Dl^IGolWWcYh_QD!&tqw=EEoO>b; zV_6ohJjlVzR5Tr>H3|^%sUtNP6Nyo1`az#<^q9 z#)#&D+(e}~SMy{m$-@PM2Mv73TrtRXcU}930S5Z%4KYcCCuv=as$y);1Sk@Z(_P0; zu6;< z-lm;q-T7`Pu5&g?$7CoU!rJK;0!aweuFyWVcyF$8WMEq$EwilCOa}ci`_qj(cXpSA zEqkK#IJI+-mQG1%03}eO>Qby_V}fmYGRFCv=FAj~RNAs_Qj1Jzw2rX}?`snBXl2;C zii}b0!v%ZmciI<@T@#O^mov|2Q0?NL%~hqVX3{=dYPCvym&Sg0-h0og_L^g!4*h$H z=|Sq|kf>*0rQF!@@!1`8m*nAc{~EMohY8jx0lH-J0`$`C$y||@r?0O8l7$oa^JLC_ z-*xL^`q$HhY9lt0Du%J8cIqGAT;tJK%{BbLVZ$y_bW;jaG^qMG61OD-=Bz>iq89cj zx&h6>i1w_2E!ami8O9JARHCkmP>8_%Ek)NzZKo3pI!AI+IzaXHff9p8$*Uu|av)Gi z4Nl2mw0_-|4-`@fPlCGZ4YjC4BUbe4)e1!@zrPRkDJXGpTBm{5cciFZ2X#}7E2l1& zbR($Vij5lI2c@z0x7$nZMUFXm&$ImPG>3$$Q6LDw5Gs{@!VK|u1=4V5V|Lq@;qa1j zI`Wy`Fkecn;nM5U8GG}$#RztXu(L)&1Pue?(*+71I>X@2Pg2B@lo;nUuq*6Hx0YO4 z{bX}r6VyD2zP2J43XI}I9X;s=sz8Bi7toE71f7cty&sMcxn&-yp!`n{6lF^seH|vN z=7GwM;NJ3) zNF;styt1erjXpN|ay^|$i7!TxLJXLD;^Nni@JvI{j7E_CS%w1F9X{fR6}UM>aOt^w zXqe+YO3XTHYPyKqNj7n?cN&%V=xvJvba9+csxqp1^dl>5gaci?xufyq+Gqh^6dwT; zZTViRd*If zk>8cRa36J=bzyVRIdHXGfnHHmbrpdl0B~@-Jto!*8)_dm?&V3xFS`6$#qTY9h7gZK z!S_Oeep3vJ#n{tQpS?VcCor4^chYYD!PSUSM&H z6+jM_Z(~sbneGsG^|%*gf3-cFjo$0IRqjG?)UjK)lDG5D#DTPR?9k!KkVN9Gz-Koq z!t&4>tuK^ye{Xr>@FGDt7X?s(i8xyC*j*suVQ3*t`f3De>N_BldVXTtz8#;jQfY-9 z>vUibc_GfS=E+?PS@~pD>(gx2L%`TbogYXAQ|LZ*#-`F0ipB=w`$kUv?2tk zFrAHReka4E*{!a22uv2`Fuibww=am3?nZS66UN6`N~QUNVeOR0(tu3eFFd1+4;13s zGK?msIV?f(x``lsiO^MO6k%HS3_3~l#w?dq)@_(p|5b?LI{4;T2nPGV{`Rb`@%4iV3J&$Z`=wKseh{M(^J(&=txXE=QLY@sqq>?8EMco>&IXzJujBy z%fPKD&^XCa8NvHZR9D%;@ysB_8py0aZ8ulL> z){|Rk+gjA1qPq6@0R)iadc8t5eL7AhU4sNklq4YZ(?P`?IW?d;$5 qm46q>`P8q~x@xxqzV`1@>$i5l@!=hA#YOTh {output}; " + "echo -n '{wildcards.backend},{wildcards.query},' >> {output}; " + "cat {input} >> {output}" + + +rule merge_backend_data: + input: + lambda wildcards: expand("output/{{workload}}/{{backend}}/{query}-prepared.csv", query=list_workload_queries(wildcards)) + output: + "output/{workload,[^/]+}/{backend,[^/]+}/execution_times.csv" + shell: + "bash scripts/merge_csv.sh {input} > {output}" + + +rule merge_backends_data: + input: + sage_psql=ancient("output/{workload}/sage_psql/execution_times.csv"), + sage_psql_catalog=ancient("output/{workload}/sage_psql_catalog/execution_times.csv"), + sage_sqlite=ancient("output/{workload}/sage_sqlite/execution_times.csv"), + sage_sqlite_catalog=ancient("output/{workload}/sage_sqlite_catalog/execution_times.csv"), + sage_hdt=ancient("output/{workload}/sage_hdt/execution_times.csv"), + sage_hbase=ancient("output/{workload}/sage_hbase/execution_times.csv"), + output: + "output/{workload,[^/]+}/execution_times.csv" + shell: + "bash scripts/merge_csv.sh {input.sage_psql} {input.sage_psql_catalog} \ + {input.sage_sqlite} {input.sage_sqlite_catalog} \ + {input.sage_hdt} {input.sage_hbase} > {output}" + + +rule plot_execution_times: + input: + ancient("output/{workload}/execution_times.csv") + output: + "figures/{workload,[^/]+}/execution_times.png" + shell: + "python scripts/plots.py execution-times {input} {output}" + + +rule plot_suspend_resume_times: + input: + ancient("output/indexes/execution_times.csv") + output: + "figures/suspend_resume_times.png" + shell: + "python scripts/plots.py suspend-resume-times {input} {output}" + + +rule spo_execution_times: + input: + ancient("output/spo/execution_times.csv") + output: + "figures/spo_execution_times.png" + shell: + "python scripts/plots.py spo-execution-times {input} {output}" diff --git a/scripts/merge_csv.sh b/scripts/merge_csv.sh new file mode 100644 index 0000000..e19f2c0 --- /dev/null +++ b/scripts/merge_csv.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +awk 'FNR==1 && NR!=1{next;}{print}' $@ | sed '/^\s*$/d' diff --git a/scripts/plots.py b/scripts/plots.py new file mode 100644 index 0000000..b88b827 --- /dev/null +++ b/scripts/plots.py @@ -0,0 +1,118 @@ +import seaborn as sns +import sys +import pandas +import click +import matplotlib.pyplot as plt + +from pandas import read_csv +from matplotlib.patches import Patch + + +def show_values_on_bars(ax, unit): + for p in ax.patches: + ax.annotate(f"%d{unit}" % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()), + ha='center', va='center', fontsize=11, color='gray', xytext=(0, 20), + textcoords='offset points') + + +@click.group() +def cli(): + pass + + +@cli.command() +@click.argument('data', type=click.Path(exists=True, file_okay=True, dir_okay=False)) +@click.argument('output', type=click.Path()) +def execution_times(data, output): + dataframe = read_csv(data, sep=',') + + backends = dataframe["backend"].unique() + colors = sns.color_palette("tab10", n_colors=len(backends)) + + chart = sns.boxplot(x="backend", y="execution_time", data=dataframe, palette=colors) + chart.set_xlabel("Backends") + chart.set_ylabel("Execution time (sec)") + chart.set_yscale("log") + chart.set_xticklabels( + [ "" for b in chart.get_xticklabels() ], + rotation=90, + horizontalalignment="center", + fontweight="light", + fontsize="large" + ) + + cmap = dict(zip(backends, colors)) + patches = [Patch(color=v, label=k) for k, v in cmap.items()] + + plt.legend(handles=patches, loc='upper center', bbox_to_anchor=(0.5, 1.16), fancybox=True, ncol=3) + chart.get_figure().savefig(output) + + +@cli.command() +@click.argument('data', type=click.Path(exists=True, file_okay=True, dir_okay=False)) +@click.argument('output', type=click.Path()) +def suspend_resume_times(data, output): + dataframe = read_csv(data, sep=',') + + figure, axes = plt.subplots(1, 2) + + loading_times = sns.barplot(x="query", y="loading_time", hue="backend", data=dataframe, ax=axes[0]) + loading_times.get_legend().remove() + loading_times.set_ylabel("Time to resume the query (ms)") + loading_times.set_xlabel("") + + resume_times = sns.barplot(x="query", y="resume_time", hue="backend", data=dataframe, ax=axes[1]) + resume_times.get_legend().remove() + resume_times.set_ylabel("Time to suspend the query (ms)") + resume_times.set_xlabel("") + + figure.text(0.5, 0.01, 'Indexes used to evaluate the query', ha='center') + + handles, labels = axes[1].get_legend_handles_labels() + figure.legend(handles, labels, loc='upper center', bbox_to_anchor=(0.5, 1), fancybox=True, ncol=3) + + plt.tight_layout() + plt.subplots_adjust(top=0.87) + + plt.show() + figure.savefig(output) + + +@cli.command() +@click.argument('data', type=click.Path(exists=True, file_okay=True, dir_okay=False)) +@click.argument('output', type=click.Path()) +def spo_execution_times(data, output): + dataframe = read_csv(data, sep=',') + + dataframe = dataframe.loc[dataframe["query"] == "SPO"] + + backends = dataframe["backend"].unique() + colors = sns.color_palette("tab10", n_colors=len(backends)) + + chart = sns.barplot(x="backend", y="execution_time", data=dataframe, palette=colors) + chart.set_ylabel("Query execution time (sec)") + chart.set_xlabel("") + + cmap = dict(zip(backends, colors)) + patches = [Patch(color=v, label=k) for k, v in cmap.items()] + + plt.legend(handles=patches, loc='upper center', bbox_to_anchor=(0.5, 1.16), fancybox=True, ncol=3) + chart.set_xticklabels( + [ "" for b in chart.get_xticklabels() ], + rotation=90, + horizontalalignment="center", + fontweight="light", + fontsize="large" + ) + show_values_on_bars(chart, "s") + + plt.ylim(0, 1500) + plt.tight_layout() + plt.subplots_adjust(top=0.87) + + plt.show() + chart.get_figure().savefig(output) + + +if __name__ == "__main__": + cli() diff --git a/scripts/query_sage.py b/scripts/query_sage.py new file mode 100644 index 0000000..50ab304 --- /dev/null +++ b/scripts/query_sage.py @@ -0,0 +1,87 @@ +#!/usr/bin/python3 + +import logging +import coloredlogs +import click +import requests + +from time import time +from json import dumps +from statistics import mean +from utils import list_files, basename + +coloredlogs.install(level='INFO', fmt='%(asctime)s - %(levelname)s %(message)s') +logger = logging.getLogger(__name__) + + +@click.command() +@click.argument('query', type=click.Path(exists=True, dir_okay=False, file_okay=True)) +@click.argument('endpoint', type=str) +@click.argument('default-graph', type=str) +@click.option("--output", type=str, default=None, + help="The file in which the query result will be stored.") +@click.option("--measures", type=str, default=None, + help="The file in which query execution statistics will be stored.") +def execute(query, endpoint, default_graph, output, measures): + headers = { + "accept": "text/html", + "content-type": "application/json", + 'Cache-Control': 'no-cache', + "next": None + } + payload = { + "query": open(query).read(), + "defaultGraph": default_graph, + } + + has_next = True + nb_calls = 0 + results = list() + nb_results = 0 + execution_time = 0 + loading_times = list() + resume_times = list() + + triples_by_obj = dict() + max = 0 + obj = "" + + while has_next: + start_time = time() + response = requests.post(endpoint, headers=headers, data=dumps(payload)) + execution_time += time() - start_time + nb_calls += 1 + + json_response = response.json() + has_next = json_response['next'] + payload["next"] = json_response["next"] + # results.extend(json_response["bindings"]) + nb_results += len(json_response["bindings"]) + loading_times.append(json_response["stats"]["import"]) + resume_times.append(json_response["stats"]["export"]) + + # for bindings in json_response["bindings"]: + # if bindings["?o"] not in triples_by_obj: + # triples_by_obj[bindings["?o"]] = 0 + # else: + # triples_by_obj[bindings["?o"]] += 1 + # if triples_by_obj[bindings["?o"]] > max: + # max = triples_by_obj[bindings["?o"]] + # obj = bindings["?o"] + + if output is not None: + with open(output, 'w') as output_file: + output_file.write(dumps(results)) + logger.info(f'\n{results}') + # logger.info(f'{obj} : {max}') + + if measures is not None: + with open(measures, 'w') as measures_file: + avg_loading_time = mean(loading_times) + avg_resume_time = mean(resume_times) + measures_file.write(f'{execution_time},{nb_calls},{nb_results},{avg_loading_time},{avg_resume_time}') + logger.info(f'Query complete in {execution_time}s with {nb_calls} HTTP calls. {nb_results} solution mappings !') + + +if __name__ == "__main__": + execute() diff --git a/scripts/query_virtuoso.py b/scripts/query_virtuoso.py new file mode 100644 index 0000000..994ef54 --- /dev/null +++ b/scripts/query_virtuoso.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 + +import logging +import coloredlogs +import click + +from json import dumps +from time import time +from SPARQLWrapper import SPARQLWrapper, JSON +from utils import list_files, basename + +coloredlogs.install(level='INFO', fmt='%(asctime)s - %(levelname)s %(message)s') +logger = logging.getLogger(__name__) + + +@click.command() +@click.argument('query', type=click.Path(exists=True, dir_okay=False, file_okay=True)) +@click.argument('endpoint', type=str) +@click.argument('default-graph', type=str) +@click.option("--output", type=str, default=None, + help="The file in which the source selection will be stored.") +@click.option("--measures", type=str, default=None, + help="The file in which query execution statistics will be stored.") +def execute(query, endpoint, default_graph, output, measures): + sparql = SPARQLWrapper(endpoint) + sparql.setQuery(open(query, 'r').read()) + sparql.setReturnFormat(JSON) + + sparql.addParameter("default-graph-uri", default_graph) + + start_time = time() + results = sparql.query() + end_time = time() - start_time + + formatted_results = results.convert() + + if output is not None: + with open(output, 'w') as output_file: + output_file.write(dumps(formatted_results)) + # logger.info(f'\n{formatted_results}') + + if measures is not None: + with open(measures, 'w') as measures_file: + measures_file.write(f'{end_time},1,{len(formatted_results["results"]["bindings"])}') + logger.info(f'Query complete in {end_time}s with 1 HTTP call. {len(formatted_results["results"]["bindings"])} solution mappings !') + + +if __name__ == "__main__": + execute() diff --git a/scripts/utils.py b/scripts/utils.py new file mode 100644 index 0000000..4d293e8 --- /dev/null +++ b/scripts/utils.py @@ -0,0 +1,8 @@ +from os import listdir +from os.path import basename + +def list_files(directory, extension): + return (f for f in listdir(directory) if f.endswith('.' + extension)) + +def query_name(file): + return basename(file).split('.')[0] diff --git a/workloads/indexes/OSP.rq b/workloads/indexes/OSP.rq new file mode 100644 index 0000000..82185f7 --- /dev/null +++ b/workloads/indexes/OSP.rq @@ -0,0 +1 @@ +select * where { ?s ?p } diff --git a/workloads/indexes/POS.rq b/workloads/indexes/POS.rq new file mode 100644 index 0000000..575ce8a --- /dev/null +++ b/workloads/indexes/POS.rq @@ -0,0 +1 @@ +select * where { ?s a ?o } diff --git a/workloads/indexes/SPO.rq b/workloads/indexes/SPO.rq new file mode 100644 index 0000000..36cf545 --- /dev/null +++ b/workloads/indexes/SPO.rq @@ -0,0 +1 @@ +select * where { ?s ?p ?o } diff --git a/workloads/spo/SPO.rq b/workloads/spo/SPO.rq new file mode 100644 index 0000000..36cf545 --- /dev/null +++ b/workloads/spo/SPO.rq @@ -0,0 +1 @@ +select * where { ?s ?p ?o }