From 385e2adf499bdb8fcfc0efa1422ab8ce3d67a11f Mon Sep 17 00:00:00 2001 From: Ichinga Samuel Date: Fri, 27 Sep 2024 06:14:29 +0100 Subject: [PATCH] testdata --- .gitignore | 2 + check.json | 1 - data.json | 0 src/aiomql.rar | Bin 70469 -> 0 bytes .../contrib/backtester/backtest_engine.py | 146 +++++++++++++----- src/aiomql/contrib/backtester/check1.py | 13 +- src/aiomql/contrib/backtester/d.pkl | 0 src/aiomql/contrib/backtester/get_data.py | 32 ++-- 8 files changed, 124 insertions(+), 70 deletions(-) delete mode 100644 check.json delete mode 100644 data.json delete mode 100644 src/aiomql.rar delete mode 100644 src/aiomql/contrib/backtester/d.pkl diff --git a/.gitignore b/.gitignore index 6410b1a..7d2b6c4 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ notebooks/ *.egg-info/ .installed.cfg *.egg +*.pkl # PyInstaller @@ -76,3 +77,4 @@ config.json aiomql.json config/ test_data/ + diff --git a/check.json b/check.json deleted file mode 100644 index 71fe5fa..0000000 --- a/check.json +++ /dev/null @@ -1 +0,0 @@ -{"a": 5}{"af": 5} \ No newline at end of file diff --git a/data.json b/data.json deleted file mode 100644 index e69de29..0000000 diff --git a/src/aiomql.rar b/src/aiomql.rar deleted file mode 100644 index 4d1274febcb49dac9ebcae43663347888c96a8c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70469 zcma&NQ;=xUvaVUSZQHhO+qP}nwr$&Xt+KJowq3pU+0h-hpU#~T^KCw4#K=Ftk$>h? zGIS!u0tc8&a0UQ?1^DliBk4krzy^Q?3IJdY4*&r4VMkutB}lD_%Zvy>@b42tOM6>K z8y!PqV|!OS7di(|fIACr4cMK8nOXSRO!d4#FP!M1q^+*dqR3$i7YG*HVu39S?B;k8 z2(k^^f+fiysW_?2TVG%u*pVpDkd#Edh?Ch90dXX9I4_<#W=LM7Gish>)xH0I^#l_Zxe5$~f}`kH*Y zZ;j&^-)jr$orJFW%%gfK=#Zrw#!{sRR>sJvvE&9p60Yb`59c>d;j9KJ(YmAqc)OGPlA_1AM}cIdDuj;#Sn3#mrq zOwdAw2mkOb7!`dirK6Vz77?%2E1lJx@fIJ+CJCM7JSFZpP2(d$J_)Hu%8r=^7$qm$ zpYtlbhCl(LGje@&CDSl&RB(lJ(H&m!_YDGXKqG{d6KZHYtYi_=vU>as)Bu6S05G#9 zVQXLhN!#Av+i5Ci(i7InPc|e#1e+JSPF4ARW4f} zzmu&M9E5FPH+Ic>C@@&IU0xF9gkOy&;&bwb0O4*uMbu?6ZZQ*T4iZ-j=DsN&&{IJ0 zpmgYpZ=ZEsgX9EFVS(SU%qsv^%~}D;4sYV~WuK0Bh<~FV0;(d#j8#%6cq0#mnv7+Z zVNnZ6HGc@Xg3bA%RxpV#pVJraJ465>+(GzgbpsXSA*AsceN61r0YWL1MVwmPj7pN>i| zZ5N4=hh`nsX0SQ-RJT-x5vN_0&4w(R_Y!~&1sF2JthE5O%aOO!$)kA!NwE`U>WTHt zGIYqY>^Sdh3v}xAYXc1qr|-6FCwZ@_yD0zoQ6=l7vCj83?Bt8?1YYfJx4-a@+mzATD2zc ze0pv{IqU*HYU@YixKXS2v0Yp4Iur}%vbka5keaF7+O?SVeKP8XLw)cYg|1SY@H{@j zM9*v9SEFI7dJ2mDr*STm>ZYTnXYy`1v1E%0EWRN|n{$~gVoKNU$3jCZw+lL1!rqpGE!FT%v+~~DI{EHucCPua z0v9^~8x`)LLoaSEjZ14t66`J{#lz|bdZx9>{oioHP(#FKp=|45KK}ORY22&AXW^Ps!-5c8?7O3uR_#k+J>ePQ=I>&P7#sM^DcMC1uwIIXzunSEnwTk5NAa=QDVZs^xKD z0bM8Qk9pY!UW(-TlORnZwoHnw)0D@l8?5uZJY$;t&CaGpvv)}nzPjZ($!DSu=Zk9* zuZaAtC_iMcbDnyO5FT;;o0k?i@%&J|Iw^Tl{u1*t&|AV}wF1W3B`23_LBype$>pYX zxvmr1D^@GoHBuk&1qZ^Yb|RNV(9FSt!EyUkExo3mt0zO2H%LRQHim-MqDn7N7u2sA z*o=&Di{`J%$M#$vdl7$disZV%jGXRF=;h>)Ex-_eW_ZFrrF@4@zO-oMYVz&I60FVY z+BwOW3N!dj?oxKio~pj(rptCx4!j#czOKs#^ul?uJYi|Yl1(Kwh_*%W;_e5T9p@_+ zi}iLh%?&>kAV>RqdPD(Zzc2pe)1T{7Q{+m7%DFu7)?vx=b5O^ZlDK810p=(G03-Ea>?RArRkx}GM6O<|D~*Nf ztyXyJP+7ffEiciaHo;~#?-vWmZ*)p;22)E@xF*z(vMSa4bm_uofBk zIZhWg(zcaaGN-N*%=iF6sniXE^EYvo5#FRwfQU%1!?UYE=lE1>4ZHy({c5TFMgh4Q z<|`+$?n<`otj;YU!T}pB*m zv(yK4eaX)5jdtpVlj)Fchz_!B>=0_v%%jwY471q@pg)P_^aA8oelERc-5~<8k?+ z>=Q#uL#yXMR9%=uqGa{3S{U<7c4EIK`MbdDI2P}zOilZ4>;Sf8 zxZZ20GWKP}17q$mEc~vy@x&H7C*9Iv^L+MR+-$+2Q^q;WWicv$JubJd!N)PLDEhIw z_DXG1U35EQ^d;7XPAX5U40om@jYn;a2zYInDhZYiMXSVikPpfWe(rtV=MDX91(+3Emi*FgyLHy?%%nY zW(-*rha1@kK_jo7>oVOoWh-i18W6W8`Awo*4|H0o0ll{vTu74`gKTqoS!mFuUVl~4 z+vXN%^#OJXnk_gbv$d^}2Mr*99C}xycSyIrf`ThRH!$$x$lNl{$-Ie?V6@Y=Ia;2% zFamBc1;hi-_KK9e&+rO{lX&@bkG1F0x-1mPa+$}oHmDZcjXjI|gT&PiJ+PjNx3Jnl zhjMC+bX8$rx{+& zx*TjRVBPj6)iVx@y88^y?FsN0C~7K8gHTU#L%eY$i!S>BZK4z@8lrV8Yr%6f#dWDfV! z76$SV8o5_KJ*kHW?W;31-xCI{UZYn#NhIMhaxL9+Ews}Xa*9L@DHY7M&~9EM*RodU z^W|st`_(>J3>XlJib)$Y9bL=AP@!sV3hVBTHB;vAO4G0g#Qz* z#)ft#Hm3hWRe@)77{K|NSy-OTjovSCA6zi7u$|Ki+b4Y)oF^A-+x^}hd&O?Bz`+O% zS(ZaJvZYFLvhF6|zu_X=i6yHZkQ6D&chbxH$_QeS9L{47Cr18gbNk@8KtpNmU5=Pb($Nl-0HF6@DjKZ0fOf$EG=QwAPGxjq0%@&@V zWylF^K)0t~J<6af1#WXE3mi?X3#WQL`oAfM@9{S;o@Jj+@g8>DqkIvYg7E4}TY8np zzk)1Abli@tsq7~0a zOgfkRSWrV-;J+r<7{f5~Em4I?^ z!Op?MMZu@zU-(=^JJBoGw%OG*#iT$T1iSz#aT0iEi0qF@J_Qjfw`6`+-3k-OHo0rW zp1JKEjVjEe>W4RAu$*a-=P_eFT_Y&<`}u*IrMv@>#0%9T~)O zq@GPjBhh!d4#Hv=ubt>BZffp;p$CX2DTSZs)97bU zP53aMd#l?p8e6apD8cEm!O4{0%|OT73UX!j>=CMyPJ#Dmvv`~DQ&O%El+;6o7u6_I zxutW)>X6~*9)jvQaHDa(kren$a;t0*6Xu#7H^ry8fzLx$bKsAxd5D4s9q;YS1nA7u zc+f_{+6CA~A@Cc7!q4JAec7#W6gl3A{t`0rofYM1N1l14x)W7iQf{eR5<*Mc6xjQM zD|?ZBPaCIz)i+fra;yk6O*g_kkPJ&Lbd)oiu82n}4V|B?Cd&vyS?g7Y9KM&%r5U2bq+%a<58XocWCLTG71i?WPWs?VYrKKujDD0H%=#dgj$qdT+CT2 z)2JrM4lsF{I`VWsPq^4t8mh<`Bo9XdWx4DB$gngpF|Dnt1^OC zdvLJUrH;ICVh_d9kD0EACyd}6Y+X4}J}+9kts_1dZTCc*0f>x9q|zVzy2;TB9?R%! zqoRwkYbef-hxrx+K6A{hzkF$p!Z0uuac;$s89=mir~dOC)5Xj{bTa4T*b*p>%l!oz zwW2U01W8g+TEO}9!KC|&A&zcUKFDvi?OYYgD~j}0Mw$Lff#|I!nl2=IGrxrQe!asj zV>nA7*nA((A$= zV1#UYCAc)<3Y<*50CT90pwg{5%a`ljc1369x(g3}A)L#zg+6hKtBCuW%afr$J#JE2l=`@}7MfbrE#f023?NmYis)M7Ot~g$81qN~dst>vUVx>K0U8iL)c1V&T1K zQzNIwXac7=%2)`Mc*;Yi1QFVc4wv7esN>pY(1yGdGih)RQM>&_>F)r`BgiVn`H7{g zGvju#+&Bd{!JLAF0!%un2u!yVVQEL%=&1xLaY@ez=0$in>8#;huQpmgrigz$et>(P z3bX>`bd*V1`vKx)-a!%kpidvlK4hGwS z3XB_bS8GAm8n$zGH@?Kcp^8!%fuOjqZQ4=od|63q=BUCM?T?`uye1S2f+rYYm8rF< zM=RAjl>!-(z%wvYu1FZ_pecMIrCLS^xmkpXpihC&hnt)EWTc~TxJ*=zBqyU_wUH}jE9xi&#(s)|z`Pjd$SDec*7&1umYws;fgMde9ndJ}i4Av(-i zY4?TAv&$+l)}1A940x11x`a&vf7YiAv@1-{H9c=jY`(Zi+E&eS`nwZtPg-B`^F6`W zo#aD55C~0b?5Wm3Ea;)@ZvlPCPjH>O>rW|uSGh9`b0VPd#=F5z?6DixMXClNNSBgS z!M3jXIPtZanCS!QwVX+t20AB?QmGBtxr9A)AG3BzdOdU$X4RG401BB(hqK9DbUA_T3WVjn4%KXrD9|EzHA(#q_DZ`s}32fX2p zBi*lS?TMH7J)kw+XTVWysBqO_T zMZ2SoUe)6|nM{DY`!tKddKax3%!P=ccG}RWq?5#F;*uzYF6~coyU{rNML}Q+?+Z=e z4yG`*RzQREW9PYwW}i2m=4C9Wsy(HAYNA+>#4Wx2hAa$}1X&PAn=gA_@WqsaiSnM8 zP^M=^;dM^tyy%y5K_1>_)Sei#1MSCH>rehw6a=f1w#uk$bdre-MF>3j+TvQRjozQE zai%hB8*JTiM){e2hiN-CDwrX<@Ty8B-|9OQfgg&nU5L^>3iz5)!RkN9e?BW-`!8bO zmIM$qJ2JLJ1VJSk`A^YKk)pv|z6Z-qaYQ*5 z$#y@?K;0o)geirRn-4l3R33GH8(5-PCB%W#Ma2SNtq3ygV$zJGoGJiCBlb_6Yp>{x$5{)LvgXZy;RVJEQt9(!t!p_7% zie^Pv$aWMbTdji<3?R9at!=rWV`I!v5;wdUYj$fW-Tkup#|lBzJiZQv}>o9R`#B=RV%#_vnXeknv^1kNWMnU3ZS)-?4Sx zd8c6YQgagB-LCw22}=0YJK#>3rsgtRtqobUa|22F)miF0ay#V_g4UQZ%Vf=uwpM`0 zh*IQsb!Vg~)EwBVGujbq;V0}Rz#L@r8r-`FChdK1g5ODzji|U(9b(NEf5Xn;Am#FC)V+hn!|?>4aaRPVh|M#Z7XeKt@8};Vdlx8 zlIZr0BZOKw7}Y{rCw2g28PP?aee;$myzwAIBO-Xq%fKq}!0I#{m$_38boRlL&;@kb zY0s=kBqT(`8Anc_&6^ur&Gc;7xO{=-G@L$I{hYm`!OH!6JN02ZT=+2*E_@+g_)bQ` zx=Nf1Kjh`4R-gtRV9Jd=D<3YPU|-Nt@o z?`%=vIPl3n>O=)G!c5AOL5L^eaJ4zCcBu^pT;2WG{_9%A0hWOP z0Jfq2buB3ylgL-Xl>ZDtqW@plVsGc-WND;hWN2*dV(RQ->ZD_AVQOssKYa{sRUix? z%*^~Z3ZnNs{cxRQV^d>ep97@Ff++UTEjH&MFbv0bjJ4%dcA5r@{pURDhKa4Lo@~ih zf})3>93YOR;fNfLl>HS_z7`yVIaN<+qN$GGMUmUZF^%Xv@nw85Vj`f19LQ-U{Ao%W7as zwfA0pF~h!EcD|7y{60%i#23{0v}n$qqmVXVP?(oUeDH%b?Gb6w8qA2LW~Qz2*R?ON z6jD`Gaw0}SX0#(t5n!^>ZqpTMLG0QhN@uZ2XB`n8QUV!l6X3HU8AF0pO<10Y7+FzM z)1k_V_nhDKrRK!*vzjGk&a&;-e;n=fhO|Wcx@7k7?QOm z-L)lui+tH7gcg%56S7h%bOly&#!ft$nE3PIh?^zvKRtYTc$^OvnPWaKWfb2c=t9bx z;YFvFbKXlkDkZ`019n>;jri#3b-OsZSi2ZJoII>OJYmgCl&6=;l;GxCq@j`nibi3% z7Ic0|P`I+@z5ZfRlel@fM3u$H+ZQu&^tw}0i2F^MC1~Qr@8_;OKR+fH1v#KFL?gX z2r`2Bqsf9c>Qa3ef-@)4P94h9Dc_rOhW|p92Wb1JVm^p}p~laoi8RaoXG}`PDTQzyZUQor{}(_e@u5*|J+xlQazN2SBWx=>!tKb z^72`zlDIyyO2a-UG7u&OdD~`jH!D1|T?sj_q2C}1D@DK!WHyFcRi7)J`;4Djqeb7L zn5Ru2KgvDLzC407U%BLcP?J;`K3-mGgQ5?UDg;RkCgl;u{VBrPjwxks{yu4Z)JUCD zBy#kY3VwKwT*qF_v-zadqmxwLFcOuQ`EzW+=Gp@ zFVd0X8!yf)bxcrs*`V!Gfe?coSXK5`wnZ ziahQQPIwB;YRML&-OyAI3zDXBfsVH#KEs6VT8 z3lLmP5pF#mMIFZ{wibR5@_}A9UW{9664i0JS%?VOOs&C^oE$b;S)7GEgBROTK-#l1 z?Hxwq9=TTs?+@Qdoy&Hu%Go6hAxKxLo@p%3mDu5n18dbOzd8uFPv2nh)NVDhvsO2fU`U( z3ZyNHx?KtaL5XvV5JfU16q$Zq%_~P?oK{O6&9#Wnh->n{uLMBk4Msj$j1h=t41LcZ z;(WR@3E?02Z2<;UNSf;@!Am!>r~7ATUT{(FUgZ4|7D+shbQ;a|5Au0Jf&nRv*C^Sa zHh@*)Ow()X#SUn(GT={g1SzqU<=fEuLu{kqVxPDtkVi3c%COSBoB}CfeubrfY_S3T zK;U{(yf^K29Vl5|AeB5%K_BdZqG7Qt))^%YiXj2VC#wiS`U(Ob!M-1q(FFGh8olKlq!Xx2Kj zf}(7|wr3rFJCpITFuSq9JzYeD3r%#YQ47u0YVqZCWe>eP{M;R{kal3Fqv0?9s+L=t z8Fi=&H`fm-(dz*wO9?%(TzcZC)`QC$##0k<+Z@xE842h_#dH$+qzlC6u?-(z1l1KLFiA$L1IEev>UW2VEad; z>CB!bQv3+^Dz(2QJ|<`}U?7B<-z;f6lHTAZgq8$hM@yh&rOTA)3;1q=Jigz%#9V2M zEW)cRfCbR#zAkR)QI_39N^2a*@St*0JT8r@BV0l_gGT9(M4s4tfoEEe4EQFMO_ z1EQMPvS_(-?wy{^->NY^l-(!?DBtUw%*$ohU{33BO0^5&o%O2OFs@YE1H5Zhr?69Wj5_-F_Pi5G~zPBLoJO_RCg_|HuX8>n+BPNk=4Knwr z6q*ch9T#1bDU3gkk|}YV3r;baKPp`26wmS^vE1t#y+* ze^Jcgcr3ObXjHl^m42!is+|{MhHvEv)`JLcH+k2~1Cnn7Vr7*8-2A2dqly{R4j#u5 zFzj&FUT}jn$zhCShB3+#+{B+I$T)okz}1kr7BJOFY*r(lE(_}!OTHgxhM`j>u{|jQ z3kA^gO*%@-t1k2<>-F#!rpH;?D8Y34hcZz4Nf1!=GF}9v+D>K-uPJh27?&|r>U^iMJ@Czhs7@hQ z0}`d$dv=}XjI%e1IojCJSeHQuojNT;7_C$MvC!i3-HK^V21OrP&~4{^*R zx+|WY4VDGN)2!h5mEI`eHQsWF^aidy(sO9!WRPyEZ;CdEs7Lgq;*JeW)z(aqf80P9mmwdKZ?+G2d@&Lw52omBs!eRqmM;lL)oX|>sPQ*Nqm$nUULtDSLlVn4C zw#;YVBay&lAFRw43E|D^Q<_ou3HtrrI!wQ zSwGOA%m7TE)s3ZUIX3HfU$oi25Mq51ss-OZtxH%?ObGxO+KoE#`YNRI!LSM#kMv{R zK1y!L!&?bwmJeGL5-GM%9s#~Cx7gStoB%b&eUmV1-rXnS`h?qCq4-0aXK@ztur37Z z<(h!i^JgR>qj^M$cmw!K@?ZXolCbVNA0H;M=*#@HQyt^lN-h0RiRS9sE)Uz1B;_uj zRqGMIJzD#!sgM0tg;V4Ouyp2|EbGQmyY4<=L$zAV(r}}WzU-x<8JNpeQRCMr>nrSdJihnBbstFmN>J3Xs^!nV3~Ks?V2k=>rcMz=2Pds~WyOUx26Yqz}F~yCsbA5`4%U5fYg#I0~iE2|SOz z-{&JtodlqQgB^0AbErB@1~MN6?Q?&mo2Q~WOwwl#Gz)cYnB4!hnkg=b|XkOY~%25P~9)9U-!$N~5H1nsYB2Cvha%7|uvD zBgDWQIw7>~zMLhJX>Kf$&j z8jXB&RJD%s{v0Yv@_^_NW_e8RBP?!`xDnCxLt)&trwt1GwCZ4<`P`vxe3*>Squ@Jp z7(IH|^P()I{N}9CR0RiIqRZ1NOKUs`~&+CQ)$64D)mtqw)oq9KWB^qvux zi937HS`F~|vXC?8)jKPmFltkQ^=uLoIV_{TQxDB2*Tgw1i9x`f8K8@eK6kz9I3h@! zi8ejx1#X&h7+~4AOT<=>vvl&vslmGqOV3~wuz+M{vEL9Lavu4*8h__{LKMr4x6qG! zuxpe^n*HO#qoLBJ3kn!0ruuGq%I(7YaH5%#U}zh)9eS~?z=R*8kW>g*DXkcAU)_3$ zC7b=Wq#o4R0uCDbCB=VvuCt8$Nt{HWj7}t)`-^BT{1}FxoY>6#Jm>H@o$3{9Pt)^R zGf+DhGr4+9t!$gH*|ZyFl#Ahx7NG&sAmtb}{g-p5_}_ip7_9{a9W(y{2Q1-Z(JDz%(of;o4+OOcI=Gj)mX zrR&2Q1r-M|e){Z};H{5;B`^KTzT&CRZ|t(|U-3(+M$u%_00o9LI9O(h4XuEBcyiMg zYBT%#hJ3s_Y0O z+L~Qe(T5D?U6B&z3R$fIGfm{TJmPZrfFH0DKx(mhwV`{P$cF7Jc(|<@S;*qipb+A0OL zY^#S9GYX#1#``p1y(pPMbRE|7Ow%7a+`6A00JQnHRU^cU(_Q%L3RI8l+J?v+$D@A7 z_60_@n@{96ge>XrQkwXubDVr&Bdw;5HIf-~OxmVyf6u$Pfrf1rb>Y^)(7SwR+CZo5 zycM)3ST@D0Nj*3o6nAy@03hxaDaNZsQWMOfRf}BH2pq+>tPPWRLuvr_A?ab~XW3%8 zfph}o^;W>953}}%3^WT~M+M7bxiLnp^EA$dpVh+(Wa+PBqrI1D2<;}SyU0?aucLj$OFwAtmD6y(8r+MntV3Q()U%)zRp4;war7Avgyl zlnp|nHqiRKbTXZ-^j6WPS5m?eIdb^&F*I84wSnagEDM9yM4Zrd7#7*YxjN@o)2)QT zCdP~C4j{VfE82bORna2yags0&k0q|UpY%{Tfg-Vw%c5uyUB>12ChnF(&Ja~c(Vn0@ z&Hf<=*{&dAH3u^lzq9Z-g~D#P=hS@u_=CP5&K+-Vc*+=5*5@eKV;9std86M*>#HYb zY<}D(g^YNLcyYT0SC`nOH8qs0Or54>LplBoONHL%z_kZ`@nQKA60{YOU$`9~`fxnv zrZ{jD9`53V@+@rn>zsy^ZFD?8cic*G{U_2+TQza54-V}S_CZ;AEFr&VAQ2YlvAK!8 z=Bvb=IYO;M{hIbVu@yKRti`$xtNg^e6Bg7g)V`1#W8sPUZ!1hwzyVQhw<6)2Hg4$h zl5u5{Use8HD{D>30alI+zc{%~^ff$#yzdTtr|@XgYs}qP1AvT_HTG1Iyqe&(qZNx5 zKb_9aaB5XBsl!id$3a1W+RCv#!GtzMZo(64VZTgmOF%Kf&_?YpdggPcx+IUDDo=KU z7fWST&l9E+*KfR3eCAZx66MJ+Xa5gV4!zl;vVY4s%|G5L0;K(OUUvR54@iAHg58QvZ1`^Yp=m^ssi2rpF!wxQ8}a>|wXKIeUR2 z*m5G&wgOr1Hva+M%^({`2_=7&9PeKsA8d;p4?hg)`ys`*eNrUxtGOR6P1cMvgp&;# zQ1GRKXa}6AIVj&i|hTI=Zx7l;pJh8_i%5?OA__a=oQxIz*k--jtZ z1HPk?I2xhhp{zvFqnx0a9*aEmAX!pGlcl7|i%4zWmFxl6uliX>>DDh+c}X) zvgQ($Lg<;SwyiGKXh#tu=V?>2qrHhnWh9#IGNCI)Qk05*tXZw~Teo=+bD>*l&Lj?k zTJI=HFtY6XMvrCY^ute>ie@&)YON}c>F?tVhw#bU$e4j*4YZp&&(W(?1z#D*4nMO9 z*Y@l2g#z>8Jo{apIZj~W=}9=%#ICp8rtP4M#ZhfSXScg?i;>OQT)h3RrBNLiv_uvV zZer8+yp6-Kq#5d>Twi!{Cda=Qw;t4>eNREEger zNR_^Q|1$ZP=5heFfd33ekbh~u`jY_s-!TE@|B~kaxzXwWAOB}G=wAjyVE$VrUI|3+ zh2Fc$F)f5pdI}U868Fa;Noi8(S^krajZvzc>mx_~P z2onl-Td?P#35)OL-~{j?p_`ox=FdWr!ct4`{VvSThbK38qL>X5HuQF$77k>Wh;d`w zWUvzWQ`{zs;t}0$hKe+~ny0l3wV2v?3iZS0WR|(pKt2>|CzdTJh3_IA2$prk=L{23 z!_a4#=qfVg$Z4?p3ME-zD~;*4JXngTm97*}G_)W{0r$!G*3)o&Z&m~WtI934QOGMH z{S)(XU``j2AaLD2&|F+A6NLx@+Wcq31BGZqTQI>oTEc;*Y{uL*50c#V&{^U^(_&oB zJgB!cN*J~5DB(+*zB4-%c<6Ky+UX6tDq{(u9(>%JD@D8b@~|H1UWZUG zt+2`bVs7c*(MtoAAOZkrYy3O<2X}wVy{P}(=*j+Xj{g7i)e!z@!r&mx%+LP6+itJ= z!gA_$SGe8*HR{~;lHB2dK18#9ao95q#g;eS+Lq4JCf%g@?)wXz#J22tK#KQdOU||h z+6AIWou0}J%p-53A0ZPv&vm~BmjWE5P_b2ghzt^9{v&JwUj-z2V z`#fz3fO$BJM%hiWb^tsIvuFcXBLU>I=*#|1zx_&fecpM^BAkk@e8}P=&gs0EB!g+u zTt#WNK%#l$=Aw}rH#}LrwY7dNf`W_5@cVY-$!+iIw)xk*9WMXaa2Q|BF}@+VuM~jv#y^kK37S3ToyYL#7zXkG5^xqoLeUga8!|SM+)|6gNW#f}*yUK=()n=1aEm>s| zb!MR8AR~qHP^wtaZ<`l$xFbr#?WoOJUPSsZPHs}qR0w!+n?ypz&xWiVG1!xAp+39G zK8Z(>OTRrR$L}KDOQ5T*FaW0w^?}T%zpoarCrAcH?uE=uLTL8E(GX9H=aw8PSDr!l zsL12zARXRbB`a>*C5yo|IOG(E)p#1<1V*c7FBsi(nJt(TJ=s1`(7c@t-~0CBVH521 z@Me*2C;+L6Jil*h7Sd&NQn1kvaN9&&XCH^+t-A+G%hz>}8-qbHPqHOJ8coN=f!1NzmD42J#;dG70vY~==d~=dobfbXTjj@c zwnESOX~3=gUa79~F=X845$F*stLqsk2~JWFWXwz8nICj1u0@|GNe~Mw6TS_~!5H-n zzYPdo1hy7qu-Jn~ zNOo|ymksoJTSmLdB2Fx0Ewziu>I!|2{tc9l?NS&q#ck&y1Rp*qaMmzMxeLhoYz;O| zI+k>4a9-RhCIU(o7A9XiWW1*41A~{%!Hb%Rw6mA9%mBN)*}&X8Txc^=O0O|nEs)3* zHX^l{53_J_H8I7Y2;&oBmi-#qP&Nqc(Ze#K<*>LW5L!eD9)o0Mu*Qb&PvZ#B*yG&r7V36|2$ zX5#eKWg>m4)MTOoVfQqG-9Kxnizr*qxs0QWTeR_u`NVaLa?jtC1sHvj-7HdQkleg{ zJZA=-OBN5%ELw7OGV%Dh@q7XX4``r9u!>J9jkL)u^Q`xAOK7dA74v3gj*xfk@`hd8 zpv&_mbF~|;f#tMX{j}htrgh#m( zwFyXSqfMTRhOgT*h3Yji_C0Rt{O_;1i=iQLN$(5%aumn$@KOu(v~JKiWEj&lCP~R? zs(0fo%yz9NuI28-FpbnkVyCa4{#ybNe~#fb?(|67PSeQ<|IFk4sA}|}s(8O5-)u)5 zoD+|bPaeMic$H9+2ZZdV-%*YEmLtT#Llib)k90kgspE#LT!EmncI%xjY#=M?Nk=jh zZBBQ6_A^Y|@Juc>K!SK5JSy--+#h8alnX(43SLWeye_hHG4Sab@ov+*m?m^@R@zXN zE`Xz}R9r^S^h~ZGJ(;*kuqKh)iUDl96!~pU z2zRF21u>1$g==RsQY=yevqw-3UYQ_kiPp0uLF*3~y=L3p;AK?kMYe(lxW}DYmddK1 zkCzRr7Hrh?+813VsK0{&*TkKiU06s&zGWzh(Q%L~;~t<@!P0-<;N=c6d^O0Uc)qR^ zJuf83L&_@ckyYxQ@PEfLX%=s)@y&0bZne}K?9i#)sC^SefF4D^uNJ)a8>zMhDAmDb z2?q~7f+x@gm)us|zcXxbk27-bZuTaUCKAb6DT>S{r#Y-7{-I`~WTv(x*iXL2Z1F6{ zrQ%g{PbG@}eAq}$U)bT}RO2m86w#L+R&PQ4>&be@J&+}>=w z+ZD7bz?mX~@oj#~LgzZSyx$uyq6po{!{W?rtx0woJ;?!bftUP6RvROu5B>|gRrlI? zdfNDlxzL)7eaIjvQx0-lrFFV?_{qb^UtVyEuhgOTl!|j~0k21l_k>?}_6og`{nGp} zrnM3+8E^%{dO4$wkEq^z4idCCy?T zl=DYmYZ40k5oBvGFARHW~?Z8*a1Lm@Zx<7Ywx(FSFvwsRMDHB&~T+mpKEnpdR zzgzM&di;@H!N-t@I0zHxxog%-6;rAjx`614_xf^jr(@fGHl^4J~kL z6kq+su4cz-=)!~dfUtIHk-NE^*XiFru%!YUcRG%31Y0W@n~+p&G*mr($Tl7{7>;J0f#Z?(;4@Q++A0&?@oA+$Y+9IJKbbz*ETLmehb9tP;b z3uqK%bC#BiP$Fk(zQZU@Rc!$zJ+x(usQ9#YvO(9_P;K&}4qDGM7^WmDiU`K&;$}J> zEM<9V?O1_@U4vOV)V}cPg>7cJ27P&wF@+9?3}A9TU}3MRNq%@`bCVp_yP?Br4N@wh zNnWbpp^Iad!7TMFvwS@JquRvsOLQ z#k4v(lzk_2KnWue6ARtTY>#ri2EvGRXt;|$cGHANAR*rfVBw%ZqZVK6oq-yk~Aayiew;k=be%wY)GmRMfT1qD-9#)fVc0TQn+` zs8)(#6sHZiqGkq}6%8wvSIR|4frmAK#(AR2TkEOAUQXlFj)dZa~N0 zNC!G2A&LML4<9Sl6W$A?Tn}&qanN$%y4m8Mp{f8G)NWT zGVJ8q{FZLB&8lIs6Gs3f_nJqXTt5%fMo}+!bq&w6=FzQU0b{PbtIs?&#&Be7>C^NR z53r%(mof8ddZpt?V~EO4AlwfW-wkHG(kZ&`J+Hyo++NOwEu6VAOIVkjroUYK0hUw?H%M)nYIU)b> zZ2_|$dOkL&SbF}sso*HE>#-K$Wf#ZUGE*FZ`ICV>GA2-3$1)Ww+N+J(30+ha-MgV_ zqP6k7 ze>=I|BsM9q7zKa!VVRpo58ugR#0}U~Ogm+#fy%@ET*KoCGoe$*5nR9trYkfOZvkZ# z8CJr0c&k@TNO}kev2~y;;nr|{R3YIIiJbgS>XdAjvyz=|P6EWspArswxPeU&^BdQe zc!=*xVlVMvvE6dh1N3d3Ht5LxQp;pNFKw$*@t18v;ww>j%Y2Dc0>)9|0r^;xVn_P? zoh(RVdZSMH=dd8?NIa}kyZI|h)h<;Wa<`j2Za(*NHt}L)T-8wWO@djzP>9DVWJ$O# zDYO#D?kOuAb@UV=(*?&7w!~(<3!83uq6<~LaNOo1$yIs#cW2yy=$Y|$kxj0*=yR^h z)7qABE9QjPr^+e`XU^U4yQ`;P>V9NfGh%?hx29`vPS*EdWGi-z{Ks0kCu|D>gK?9! z19fr(I+%gIy#m(eS8dB9cfnyw`2)xkamq$#9o8ewXUQ#E0s}r07@l{Blk{Zi@lHlt zy7;g4ULGR~$K2ah)^2=Jq?w+laCik((f+vem!Grb&*CFZMNx}OEa z$=e$*br8HL)z)(`N|`kS=MKW zLMb|H<{pS^jZ*1O>C|xPHyvX3B}$d@05@4W}+ma zF}>x$ce4#;gHEQ+4`uzP@?22ZW+sTN({kJ*Cr&@s!h)}?eF~%a{!)uEPezpnrdmj8 z>&MwEVogC2MBhd&og*pbNu6v)%->I`FxN?tbAM%Q)0EvWw@T^7wTQ~}*pK0d?EK+m z@8JZl?_pLIf2dz;lM`%zTk+j?uhaiyX!oav$4C!8q=ZFs!ZE{C#>q}kpyq`*KstFj z;@tui)!W`B0*dPD6(GC=h0=eN zK8F97mGB>>&(z)2*u~lIUu=NtuP|e4LnkK!F-zMYd!dS>p}oqF9LNO=MesA|=;&af zcE|sD9np`l==!6f1Ce-)_y4P(|9`#izl-Sqcr8otwf`q&@w_j8&&Kp}K#!$|p3>19WXIc62lu* zdQQ@cW;YQpb2cSu*37e4UthIqX`5_>Z|3+^l()JWRf@cx(qlQXntX*AA?6t1 z-pB`K#(@MT)Vj}zf^H;p|8F^)Zn`_;-J52+e&Ix9FOCx%Fi_O;&5W*6w^UKqI~ zTgb$(XXE6qgsjCccZiMVI9XP?PuG%sqVQF)!!p(Jzqop49P!Z8&I#tLLl%|mGJ3?A zN8LXJSbqHkTnZri=i4Iw1Rdzq=JN4hCHMd3lGE3>w6%2B*Z=2sUiriyR%Lc#3t;|^ zIA|zp8pWc#oE}9mSQJT62ng<32}n@H->@w7WaqAIEZ3r-G}Fd&$KEqJDd8b-f@@&Q z6sc)7g(i_f*&bcz=y`^hbS-3g3YZ%OgKq}UhK}!o+6dVAx>GNd61pF|_()Lpn1+@l zJ6eh5uMMo?rh9HZFhJo^S{)f4pz|zLv&e55G3KlBe^JiubfU_S0(f*GF3IruPYyEG$kpJt< zj;25Ec&C3WdkN{nVFP4gei%dn>b(Kp_#nVS^1s4ivFN2y=gcO!ShU>)x(eq+5EwGu zHxx^gD#(spMz0^ih8##Ekn@5YiZ^Yc*MkvD!cX9D($%Ar!agQRyd`nKa}h%^n3CY! zHe(_1!efu7Ko}E7Hb?Z^F6ATiXHq4c%kqaKR_-W?5skluMd~NUg)GPL2d-x>_#=Bf z%$(ecLb{O!CG_hpedG&^6@k-jcdS15O`;pbH31)8bGdfYtPC-GJf5e}vn({ek4Cd1 zgMIM~Z6zUaovmGvUOf`x(xy6+g+Ov6nLrw={$0N#K-YCnQf=*UKp8y@vY~Z zF%qdqD$Etv zQu%w2A2D%7M5B_2S*#{TrlVnm8{Vp?u~%)9Hm=5ZH#rKM(>C0#JzoQT*4f>@!0qGG z`tUM&vR|O+5PJQf3_WY=6dA|8CM zm<7(Ugmu{BeuHdfDx-mjtB79Q8qBXCj-Urtge>-(*{Hn)OTn8e(iuQ)*=+W+h_zl0 z8lE_#21*lrEy+BCM19LmJFF!s0}w_zmHX#LKtn!*6~XKE8x(y6>XPCa0!X}( zR1&@wuZ$bLuCRRaz~g8$Eh68s0ZxKhCSi2V!8sXUvND%jqhMao_7u0e!le|72YYj; z6!+&Q?oU{>hZ=R#oT?W&&+cv!VAv{y!)AnUBnwUNvJ=GU>qCGCsqx(qcZ6+|5U z=PL2xz(*ZTRg|Y0_}KOF<67tJ#ZAo^3IC2y^kD-d=!%g=&FC{)8`LG~hS;-X4uJEG zMs|rjuPQ8GSn~cJAWXlZVkn^^Tq+Qa&HnrT!eW@=OWp_hOgx4+|YKQSzMR_9ycw zT9LJPVC1uWW@TW793B8y14-Xw#6DSIMBX;)*0tCQD zY)N@Wva)DSB)f=QuPjIYhq{ZQ=TTn8^4oL;014MgMcjzi9On;`^LyRq(~q+g1etK6 z0ogdg`;S(9QVdXT`M$#(F#FhzOr{|TE4wjTjDdTYn*mk;2*S-<0)I+m)#7IW5jFAa zdDvs2%I(^cfjs&i^{dv(y%*x($d-}~dc?E1A-O_kNSVgpn=WU^#Va~n%7$^YgrT75 zXkdV8OaYdp<%I@)Xt3gBm6qGd5d}P(39g=kf&<)Uq?2pm6RVuyveMT%?2_T)HKYPA z`mRKXoZkcg^fJcum+wO)qqpUSG_S)v=XT2*5=7|v2)`KrmD{(DrME{^k$ER-L&~K> zcqec|`Z$h&tmJ4e9?;p+(xcR8}-^dEO)U1oq`3DAIII9f!ssP8l?i zy7AYIu>=afB45{TfAl2F&pg`gMOsb93X)`KVk1!kR;lAVSNEjl82U)fc%op;mUDEP zXI!LpQw`rx8q9xH%MW}{+--d-3ga3dWhAau7vWu0EQ{W9z_=kBX61i2fXwTcO9wqR zc+P)Qj1m-V5+o6g90H?>LhO~Sah&67w3HvWQ54Q)3KK!V5E-ebtyGc6jWea?catA$ zswR5DYL(xFEAFdCF2aHiTUJcK)`W>z>n~+}rNb$i{Zm)S6HV4;35tP^Ku1n$u)^xktPWoX%{8AVO9=)vIoDo zx>OSgbb#isbw~oHEC@jhrquv7^Sc1%_a&5nHGoC)9;+7DR6l~toC^r$pVbMmKh&N{ zzY@=>P3vLIfU5lS7{*r(ZWEj(gc|1v$_HIA;K&Zy0^uj*S#(%apJ@X4tjf!+Edz&> zo_xd}6wa}CpakPSewUT|+Se#!Fvl_O8Nwu|(OB?VwJTUU)r^^U=vmlVCs{)?*0(ou z!xIbb$y)T&&m>y4RAAC1h`kw;r>s;p7WAT~Iu;tIR5siKanGSO-OHm@5xew&UMi$o zJZ;Qvta&U$S-W)Bh4Frm!^tjlHA}(qD;$#GFLqgD)r1hX3@KGYnr8kPs3M|Ni20^S zQFrcv8Es5RL)Vrki9@$tHF>=T;qZK#?aIy%sU>s-Q>+JA2Ce|^_(m=`1_UEIlJM+# zYy{GYOk9`1j`$@t>e-FgXFP;RBVd_$%8*9YY79p|8GI0+QKQ2-cvbTi9WI!Gv%Gq4 zVZx=GN-iGVx_0Q8_M3jbH_f+?{;G@fPFdkBn|}ZbkPwiWQ^nJ>qK>_69LG6&L$5PD z+A>yWI36F6Z23cVFj8EFSsW}5yNv)RB|AiYq-u;yhlMsJ+3Lel*GX2%;2SwL->q?s z|9e95L|tGbO+)`6!N&<|dKDh};-seP zYEXK`sl{JmXj4f!wh%M7lRk-AWBPknnaGaU+*?97qMqBOabNY-RTDr){HR@7RaA8M zuOAUIbsXDw!`JtG;P6y0c8#S1ITG%=UEY(#R5@Sp3QLX zfl>9i3p6IIAR&TlZ1^lUfIIfvCW@0B312XObH6eSd!^ghi z=w=qS%YEJO^0Y6Y(+<>`u$UC%=3&kb+jJd}Z>{|9I?(1uVWme&!0E>|1Y>LwEAd%kD$4m24B|JwfdPazm9-w6uq45&MB^rww6exB&$$44Q0`0u8?ctcU(Wd zznresKCVK$S4ljnLp+R^QIu^eLGlC!J;WuC)Hx==e{JHYfCT&8m_fD%F~ z6mNB=U9ayOO`lOPdW=NhvVLlVYo}!$G|q1V4;s;;>olo*M!Dnl+fBpLo!=e66(;YH zZq=>eV+pnj!o9tP{WQ9)srAq4oK4u7SWoY>0I`Atk$P`yn_(S4{mA_pJmj4Ny4DQ2 zZX$@RxdN0%7cA{$R+~1&?>Ho7Q+BXEzL9Ha&^`erIveVC2{a)FkeUAy01Nya3U~n! zhyegtV}1?=VXGB&|H7a!{2lo&_Fu{0$em83bPRresH_t9j`m_eL0AFB@zwh zejPV80M01wGw!Z*iCn16e@8(tDSvQ8MqO{_ZeHni?MI!_;G7T+CSS2GE{B70fif7E z;g>D^S-&rw-Q8dKLjNChNZ>LB-C)$55X7mo@gsyh`s{m7md;=x-$qeGcp>Z}EYwxr z=zg8CZ%&jqD%Dbj_J%dsr$kTDUs#TMNF;;_*I{FA?3DGuF~oqk(cPz*c_f`X`WJtD z+mogB8_%z+W(@I%j)ueGAX#7fO9D47F5lLfL;RB`OEA(WvE53W0+BYPo_SA@^`%JO z6YU21H%H|rt1T?GO7$86krx?>zf(8{y>E`jN(cB;=tXLwvy^LcSDu0kC@hQ*Uwk>V zTd2dqYH2p}vSYS^!(m6o)(JZk!qL812o@Se<)}SRL70P3UITOO0CVuu*cqT4Y&gK3 zR}P=Cnzo{zggpHe@6?4FT{r8eSAKYl=Da;i@plU~y%?H%^TX-YOD!Xb-!xq0Ufod~ zw~w<`q0Cm)3et4EUzES5c1zTHGF`tSh0pXC{P&oYJ#jkZj??-e(maz<#+qW5t=p~31DK5Ecj-vC zOlTY4CPg_kZWRHdb?U_%h#%4;(SiG!fsD%4l{_otdC)IY9iJzX$s1p7rCM%pbm`>R zm>%I=!=)?VW0~N($_@D$n=!Il>&+} z6avWa3!2$rLFQTPjldvJ2NU%p+AS ziv6h6i&Fx`6bOz}FeKSVL)h$fBb1QYSV;eJbTT=UEoXNeo-cZnF>_s*K%u^GN$t$j zKY?S9^}8VYKGJ>N;&uc(@6MNec0~<6cAEw>T(L({hD4KLmp3(E6g${ofb6rNef2q_ zE~lhKx^~d0S?0t~1-u`|(B#wq5sF?nZ2QX218P})tzM{7x07rPnL}d&$LJCGUAi#P zGuLU`rdEb3tsR@K_`tz#w&cqU#3pTiA_I-RfjGQnG%ltWtM{b{nup|US0I1llqd9- zF@I15!K!F9w@>Vv&mSjf(5sQ3q6g;qyLSI`k{ooGhA*3pM-c~pIM_)51J#R+fO6>A zq3s@pf&m0bp8}FZEb6^PyIcjLztB>GOKAISh--)4s>ykKA3f%op!P32bRZUn5hpp5 zQ7|oZSLYT{CKG{zUeqd?a2WwQQV#-ru0Sy3X+~g1eoA?BQOzv>?{hCQ|L+YcSN1kI zgz54VfK^TCeq*mkU(7_iA`!+kg9(Pr8C)(^?!~g+?$3hdf!`5{0XG}~>&FpD8L{Z4 zUe<)j$2~Xfb#t#_U(yPVZhykk0r5hh54gM#4K=x1;Y2RX#@yr!p00m#UyoZ2$Y&L$@1l3HoP4y zSeBDvO05x;%&(pu>1c&rNBp}@?PsI|`aaC}f~1_w?$!u( z__ep_u4d_Kd(?srJFx$9rOBvfE0=z?Qd(f3Fr}Lg!!fr{HtKGd3=_&pV)Ng0M6~8) z7fWRV)N&Gr|5La~w-y))(j;>_-(P*s5&wBgpuzbYLxF6Xxg6SXlkYsqG@NhUyYGQp z9>o0fT^^^gR-(~CODdG&*WFdC3-8^fT}+ZRC}~2f1%96yy~f{g5C3iLXRvfJ)WG2r8*fYihw5II0f~ViPR!5IK40p%3cGe#=)?-g)@$7Zo?S|#C+!~HY?D~mWN3%5&FJxK|Ke%I0 z94Y}|#$8H-e{3zj%6pjcn0mYWs9ZF&D_o1?}sQ3+ykS2fJ)-YrFRp_X;>3#+(&tIBR%!PSAnY<^@`Q{Q_2f6oxq2KsJN69vB#>O@ge4vUq}N z&=5ODJWg5R4I^fA$me>1gmegPrS z)_u<*1bKWf@txa%ejiL`-~vAj@Xc8yDp4*q`t*b#FQ2t^N`$xCC95BZVW_?>v9osp zJP;{_W=Eel9e1qJ4|)IYH2rM;=`;0%SCCXL{gkB8v6JXfbg5|aMw7P=aAidne3(KG+64YSR_bvqx4}(l zsWn(_Tz=Qq6|P}_jZh~G;GQHv$6N8L@Y=|O(<0w@gp|+0wWcycO18IY2C`_*DJcMIe+=PS-?%B`w3kBcXi^D$7U_MM`D#F*g?UN=%iilyZK_ zOnWMRR6;Dw$SG=p>{zFbI5KCGTE*8#7+6HQb9nL*({FNKc9K}2kGu@)uPN2=U$do& z;c3(*-{cTp{Y=D%{77Ml-|}sM+w(#OB0ZQ>(DO`cd`9j$CE;y}Rxl zpJ?nFEoU?zLusE>MA3#PIqsw)NIO9v%ciTMMOth zm;7HvwMd=ACzrvu&()%UvA~&b)BXOxuQ5yyf3$>S>Xdmqq%rlrmdLq25k=#euBEjvivqy8P2&N( z{)5Bg)=!c8Q_0Sfnrf6HG$9!GCwxNPO&o5&P(UV4y-bM126t1et;^H^g<5c8Av8!3 z)eYOTK!NChP9bVXe*}3l$WeU$i~D$hj`n6W#`PFaJryPUxZb!E?@#z)=(zQr)cChLgs*+9DZt!5 zGC25iYEN+ja%*aO77M#aLPUQ)+1JbW0ADf|5eOr%s<dgjV1?DnTcnku{>~a z(Hv9hg?sF(lh>;83OgfPTVQ-Qt=jb)Bd-e#MYV>wWkKOUygx>j6h6TpwJ`7eVZ} zTHA?PAX$Z{ckU!MKAfN=Rcu-ZQxC>vxsO|By>^+7*n*mHnw7(zEx$f0R+qBr4uf3} z0~R18E5RFS`mgsPTF%v$iO>VGK%1p3sC$CJRj4_KOLX02{GmFlG49DS@Mxsw&89q13E0tZE z%iBSGE1!l5;$P$2aT#Zoi9GC|$Y@h9pFmF?{r0t)gQyGhz?p!5fhStd{KOt}DP3EM z|3!60{;)dc@%h|L^_O=Fl7GfKt9K?yh?#kRRx{(?y0(kczmZqsE+Zl?3U=)qP?{f( z-qf>%1jOynO<7`Q#1o791a^eZLU%p7x=M$?U>fb=UN=x!V>dYokZQ9kz`cy)7-n zN(reo>j!OEsG@b}#0ahb?1B zb1E@^)7h zK}0OuQ0~z10?BO&OP}VtkvfF4J5c;6Ygv$cx)!+5!>e=9^?eH5dTo4!SWQgrDaIX< zzEERgWGKOeM-Qvk@1Mrp>oPgosnKuUHzTy!Vol;-oIjmAy3V=DTeUB-BF8r~&aYo6 zQ7^6&_7u1htlz7=dj$fPPlhdMXEuzCt^#>@6}W=2FQsU%e5Ys@8m=MlTdd|FFR5-X zDhzw+Md03;nApl1OI}Q2?i_1C!ysPLgoWd;m3H+_IpGqVe4k3(hG2vBlmbBG+m7p$ zo+f8E<*i)68kSIeRoL8RZ@#dvS)p=&BUt$3+`n0%C6tvoW*W<-am%jSW-U_0%*Ak* zjEccM1rq?3f+?mp=_b$SyT*})wEe>BB;K8vq=!B6_oNydG`f`z!NW$B4p0F<9sa6{ z?9XXhe5>*@4FKi(ldtmxYYR9Op-m7C-BQL^9Fq`?Ua-_uT#7L=eEAS~K6|8vH4}~C z0(YV83KAWYb}VV@W3r;@nSpGO0?(Q>!w{wr|7XdR#U!Z6C(${Q!jUIzyM4Ub6h#6|92JgAO|W;vMqXGdFy2QXUK zTq1RNV9ONh%Nns>=Gz8Sz9fDrP2n4ziblRcKC+cXUDUSiX;zokcy8|$SMp(zOF!zk z;Fi-N$J*mh@UUKL<&wr_^R$u&53X$|KDRFtdWoC&k5w8+uFCh7Ly6ALGOk3NZ&P(! z2@faNYniD=X-fpeQEE%Ndc@Oe$iORalm)!{7i~If$Sh zg-)^5p+~jh&7Ij&#W@qp)Eal!p45LD(TIHbSEm~c(J^+6X-N1g-|sujB3 zyhVc$YVf4d1@~|4|AJhU^&nfSUN6!%Q@6Ukf}57l`t41q@e&0x;tO;LHQi5fe|w+1 z>3`QH@|aPJ#k}b*dfShrVX!My=$O8MI9HLtUSZOKYQC*UWR%t?S^_Ucs!~XfR*y)* zS3l(jp*659X6MkN;C{0)Y{1708a9-z5Am1(D2Y>Hek9w-k?zwX^0b+gC1Tout^TX_ z!W3oI2auh__s^{TK)a;@cyb8{j44rE) za|dSV!q-q}OS6ouUH71UwKO4t++!Xad{)K^nJIs2#)oY-II;9lGv6l{=B8cwYL;by zCL1|eXbediX$ZzQU7pm{BH~GF-@kCye0FJNz?%SAyo>Cz1kh-^iM%juU*IZhdZ*#{XcH`Y6J6HED(FZ&Wmmpx3;A6;d z%>rERt-jryT0Ci3OwN0w%Y(pSG2mOb;8|@JAq#1CFo3o40(8gn5mgP9F=U}g9ykNm zCIF*wB_?8ycv2ZzQ~_i(t-MTzd^463Sr$`*XhW!0iw1v2QEIs%5|q_lu~gv=tJFap zN=0gb1IA$$D>^K{JX~oMDgGZ01GI~!O;{#Vp0vFmTSwLt8DUrJP3cGIgI*Ae^)fBf zr^vj4`)aW-lVApP;@8~Pd(V8@eWF4gs83E190eL1k<|m|}M?}Rv}n1{t% z;;zVZ-W!>8@D&0~phTALwiP`2$|f`_iFXv-fq`ODa7&;GOuO)BkejX*N%Lk>T}Z9? zq6#~B(W4kE+!Yi*gSW7DwUwUtb#u1&mWVAnYQ&<_-_VUz#$B zZcX$!jPrajw;mDiC(w7!g$>Z<2~2(Ahr?3; zI->evt`XBa=%L>o!Z37xD-I?dn~-CLQlayW`8DNF&;^jKjv)t{49_`om1dQ*_CFIL zBJJLMT^jBNU{j$vMn)PXZ~G>{6>^6kvq;Ay5a7y$cvT4d1VkB;Go$?pZ%HaRW85E) zUFJUH$())9BL**~=3pRH;8mdUL60Lwdh-+pW;HL~X#YIzdJ8F z_4S~&0_~%@u)5T8b*Pik^`=94qXFT1R9!+EqrnAggq{Oab_$rX9Cjqm?={uY{j~+P zu9u4)Ez^OhxX09s!5T&BCnL#RG%Wx7Tv~`CNMqPhj*P&asimdI1C<1vasreWTk#Q% zG}~o;7MiWl(MaC9?NG77V^k)*;Z=;#*b*zvc+;EDs2L*tJvlq=BvoS|LQ(bCTd2i+ ziGE^BO<1}mpWNJBP|M+UkxMM2cpNR;z znUe|*JRQj@ySZi zL;=KzWT9b)`2|KNqU2pM1jcDGZY~gNo!a!t5MR}>wGRJeW>~U=U0@Bql}3vGI!~Wm zvYM_QP|_hjJ{`aVe4jp%C1}H*UV;dfiv?A}qwC-fL)!DVAuy5$I;kX1V>B1rAK#3v z83wA0^Eps;%qjF2^{VlqT1=-0P&25XP5@Yo_4obeaDZEv7S=pw8FS;$acTrzTHpEP zzx$~qX9MoWAVoS+s*Eud;KK1Ib6-t1Z0!Ow>uWunNN%73A$v=|&Pc z5L%rCHAA~TU$`bs3VaSgocLhHYeU{R2A^b7KBdCvyI)wwP2<_(kjyI^SDZbRSN1FH z+~oL#53An?%faPcMapRHKCyC*i|{Nqobk^m4(tYQJdQ<3VncqPFpAZ3=iwk%8$5fp zq%%gQd77cEs_Sm90+0w9dz^fW4(fN9H}aHOwQft8yjx^ne+-+54ZU$gvY#uou1kK4gec0vlXhV-} zO>)r4zZY^%zf|KOC|Kvd2>aR5fzQ!)_FMMfk5j(`2?(C6_1J`|tuz?$gX8lmjLayP zG2rSY6dPp2+#c)727yuDfIY>{fQleAlYPTcktj86(cEjZk}PLHOdpdNa-SMgdCq#; zw8x=t`!&)~YAMmqg;`sP)Fa3y^n~{=bVf8Zqu_aTO6ayu<^aoPMr~%wAIDRB(^@b^ z1oy99W1#}9BV|EvrRZX}E$n4nNH2C0eLoayk||cA~)eMSa>Zl9;JkP^4f&^ z?R;Sd!Wh7pVX|+d5JTUgOFFUd(_a(mAE2XJ^AslQx?U-FcR?Y05lnlak&7=s%8C>5 z`w+u%(6{aHlUn6%xL|6#c7Au8G8K4joc~V2ZTaNjVdKP8OPqbksQFbugvVXxBgmzN zRDmmHphTFsyLjD5)5zIG$RB#r_g7=sP`pdT8}t+=Hdt!P(jK?i1?3>^@fq^Z>|p zRs_hu0=W;r!elYBwBV7TD05`cBXk9fUYgJamhk<1;2EaIxv5O??qTc(Ww%uUv$eoN zAFHNW>&AE3zPON_K)3D)x;1;@s#H7F4uGJ%q*~#ZK)DPZsycnnZS!!TMj&8xu58On z@B#N9lCPW%s!JMS^~xQPLBQLB%|_v&z2F6@P6ez^N7o`NaR+oMut__w`?Jr$zv{k- zDR&fUOP5{H(8W)C8AA;@98+vdN3(Q}^%&I*?7zE2qUBa?q*&_X9EMw8pp&OMh9T0E z;12MPp3h%O-yI8nU_h~<7#?hOF+9KZV8X}4BD<#}9gGqQIqqQH*FBUFVOJzU&2 zvW*-7=H$MYaP5k0o=Mz&=po~YeW&oFW3k5%srEXITtMTb*|)iAN_ke$OAPb7psx(LcRRG`X>uOXO3DeUTeu=_wvzQzD46_MH&%XthYFw{|mB>LhmEiV>#oItsHHj&($+1EK)inw8 zan(;zSk7I(OQ6>VeFnLjp0EK~BEMbyKlC_XMskCackl))q*JYbsjUn@4c(knYc3O(Rqbu&#<`jE#|M zJz8EW`FoesL9Fj8*HbC64y3I&S}=knw-(EYo!hMeCrE{I?g#01g`yx#UP3Y|Y`i*( zksip=-#SzAtUjZ-*UODr{tXMtw!mv}_;SGZ#Ou0TSIDDn9OChQ{;BCH*QlpWWwTWR@mGEe}_tI7sGpWfm=7q!Xq^3_r6`WRgnFXT+(8|lrZ zRdeMm3W)5cZ;33>yv?+_Z@j)4_jeGB+`GI%(*HV2l5}i5z0$6vt)>{yBefWoGx_*o zzVE4Z1n-$8H;K9-_W|8y*$Rxr?n?kq>tBcMPq~Wyf8ayu=aFOoH;1jMqobYUzfPJ> zz6cmhgy?@jLsG9CHM>WWx7}2#)LuhsqXgAK7T{E^l-Ey!w+S&@*p6bH zJP7-Jo0ANE__1~eEL*S(tmflp4m+u@*lQ!f(32;@ubrMCXy+atigD3bHt;$$aFET(^L~4}aSm^eVbMLzE@570w z54tTjOlgXl_SH*gO>Ik#kSmIv8ec=b8&0*5VprP;uPJrnXD7~KAxbj(`FELrpQ6UP z2JNa&s*nI!rDCn?#cMbEZ09?aFrpIseNk=PtuO(vpS2Zo5h)h)wx7d!Hn=<6$O z0l7nhTI9t?LkSKHM_dasX|jx3kT90HV?8f!!dbCNbvZ<4*=(9Q}F$#aBM+JF8*JK73TluurhTwHnn%Q{P9`+W3d|bw1PlY z_#sdUqWeJKzUtD=mb^lto2*z0&9;eBf}$u6vCKOmJ8b-Q6Q+u3uDqqOCksb*T!~_I z%bBjro8GNIHfZWQ+rl~C_6Apm*%4(`&5_iwQV8*!1nFI9091q)BxiSe*y4q8Iw3-A zhX;7g8dlEX40Z_KDqwF+FeTejuiN5cz|LcwH%#GY5GW_w(39wVX>fJh%m3zSD+grc-YooK-LI$a3jWG~n+t3E^rHcrK18)YmrcCPHYc@iJU*PGaH0chu( z!tg?=<+{O)ySKM%6O&9sg=%e!&_&ywFb&%jO@SVAJhApfc!7*t@<6a)gTI!VsFl@Z z_~Vq7q3u_AW4R$C`h8LbqISst>VMPx6Ip(MZAbusAfBJd-bwt4FBkg{@acc4rTQ_n z{|jw(H2m+4f(yv}VQ}Lorx1BE=DJQXZ=KmAt-!<0?6>v+JVD0OGHJ}Nx1%~{+<+ll zlcJ0)X(hQ+?{z+UVcO^pEXh?xlBFfe&SHI8x_2!M1({62Q)Tp~^{i+ki7mqD@l3sHFaIPj>h@oY98NCEqDIv7e*KWQ6VcKZze z?P*f@0-sMrUnxM6ck|j++D!i;3Il#;@VC9hPq{(3L|XpR6-TelbOL0w@9e@gWGawY z2!UN}c0$J4i3<49BVp%HP`Bj80*Xg4I^`IyW|0fF5Bf-AO<7Stg_6f(r5{Yh0FY+1 zp44jl?7?R?11Bx$Hy&|eH675YORWN0%>cqyao(48B%uG4cYfrwiXa&`Mh8w(W5UfYB%Hnz z8f~iQT&TOm%@Ej|v6zJECzmqBMQVV`?5MmQKbsp&q7BpOK92N#T5V0@e)Rpkey5z( z*X2(=+c3H{n36QMb?VNR@fc^&ii@68fw>F9`;8C#Q^TR|H&w+0l)!bW^5yQ{mBv zH^|ddA_%~;olY|*&Z>Y*HjoNtMjVwVX3M2_tI!CIteUy?0q9E<*BC^D;=OFH5gVZ2 zkx$91M+zAHTg@K=d*T|tkMxGrCrNvu?C?~&?drhq~Aa#z9h1P8}yHBSy^JZ<+ zYVurU!7i}Kun#s(b`-8iylG(VqN1U~bYz_SQM&dQ*UL$SONL`Lls>p{Jc9hOg`?4K zEF_4?<2av`?Llh1qx%skgSsVz($Pt- zeAR7qA#TykC3zjMCXs_K7P!*LS!~}{zszJk@I^S64!l)P(&FwL4wIvhd3r$SBDiO{ zP3bEi_X1u>PHUq_ju>Q2b-$|LzMuIQ6*{pQUx8ND445~%rDm)@yK#nBPXhr2#d-+_ z^SIy~DMo*3ndN15givUG6;`0S6<(|gYxkb3|B+bmQ|)gI*2=sBj#2>5IW9*xv zLtD0OW81c!72CFL+qSu4+cs8`72CFLJ6X}o-uv9w&bhZee9VtIe`>UvHF}L2qekzX zS>_uuc2uT^#X}CFerqJv8jjSXj3$m()N1PW<5C(x*{@d1T3(UYOFQ_}dE&#lK3RW? zQmQ8jdnG+P>(7{IEGj`IG)ptmjjIy3PZJ2jC|A9oqonA|%jmAI-`GkC7*!j_EdzRptG7flp~1BTUz^hzZmsJMp(>yhelIV^hxypKn6h+ zPNlxK=~~zJ?866JP0WJ#zuKi=-7+<%%j*l+7|)$MZE8T@^kfVsp|bijPs{Ov<#^KZ z`(|O!F0s&f(rI}1!wYB(vuU)68l*dIIUILrn1&t2C_7&Dj#p|;Hh{CGhi1Ydbh+3; z{CogjZ?E{X-5Hh_CH%Wr1wdQ#(k`Y{9nW9UUj<%_*>PcD6#AY`O~cj9&En8=V%Z5l zEV_x1vc`N7$7%Z$o_gC`mSnoOm;aREoM}88Z-6X;ddCw3ZhOJA%p9zf*@69f3%2Rz0I&2XM zSS`%UR_mGs^NTU<${)_{VXCzTJbuh#&rqY<(6FD&vhL7|_b$m{VGMj=VVTbnVND48 zghpUS89}P{)JE1BVv>6&MfpbHiupNGQ_b~p4^816tP4txCXFk7Rp59&{>y2*bf=Cz zYYSRWPuNA(kBnzL(+y_>iEl=>J_EJ_PqQb;c$)zvr^_)B@Ah*bJ4=o5I}yp$4l`#v zx`BSt?5T8^54Q>(bl*bU%pvu3GqQxhb~KTA(Bb>Pmmx_HLo5U`8V>VIO&MehtN_9I z?R@%SV=zVLVI5BwcCXSB8yCM7Cq8*&bv|q5_1KKKVO^-{YeLz-tfU9d6p*`fh?#ET#Bf*U$N)I46xkpZDG*s6!H9`6I!XaybU^ zA|7etQ37EC-=q2K&j0emzLhoic-EAOZR}%PeR=czftgzlLstQDI1KZHI;WLq2)UK{ z=jh07+L++@uJf@WqBdO6i_1Q-=5Fz|sfeb^}b= z-)FJ2Z>_i+&hOw*MNw}eOX08J@PBqY+SnPJSpO4p|BfPs0hED-MR`v`bn7AS&-d52 zd2nU~2x4A=7ZpoiC5w)Mv4t!F2yCjjI%Bb*(M8*Qg8aM@vuVGPoK(E8AWLxDn6zUy zStaX;g{;An{8XMLi!FsXgkllOA`eDz%axWNrq&aZJa)F_Hvfd>Al5W_@%`F7JBq=j zb#8}2vRfhDT4eR3Fu1;2M(k!yGLe1Ueph^C>GlN%5E<@dmKodfe$`y48i-*RSg zD3W;C;+u)Z%g1pLtC#krbT{Ki2y6ZE`{6L;vlCA4c@A@?8pz=?V!2Ot^X*AEn)MFF z`1*KrS(3A^vN~7kc$O+sDd_!O`eNa%LhkoVeb`ZP%p1Q7!)d=D2fVx_`naIH3K!2Q5|lZA z%{Hx~xzgGlItJ=HW8BMmr81;WpubL>m%(OCc&N!hn1&>@@y&ZOZ(Ec?>yEW!<{3Ex%itg}PR!(1}u z)gNNZ@~@;}=suFmmCLgRe3>0RRx^#^n03<>=+}|)>K?Wm-zXD=1;PjBk-35CoSiVy zfZYqHC5-9dT_4`#ZlGWr2|HCASGGM;x)kFYoJxm^|F3doHA-7zPlfa{hem zMvk*;O=isLh9%793!!*lKz4Fc%sF7umI{M4>}Q`DA)%*-cFWh@IIk}d%!|uXCQXER zNfR~z-^>y3gBuHSMX(3}?eEo)m+gaO(DwoY8xL?GkWYi_@oy%;dk4}QJa$2tq6h7w zM{ll#DcGXnI$Y{5MafCHizJ2oNuK0k+1R+BjQL03{r9?K9GC0@)Bw(l|0qqxMTFu{ zHy@$tZqjGrsv7kwN8+HMcC0evWZyRXPb=6a+G2={=rt5Pcx(p0&XbK-I4=Z>PO z6Zm23_)3=hd}u^6skhPAbTHT6b;$xRx9|i|QT-JZEqOBy$9r`mhn;SxiL81LHaMxm zF>`ukLvm58JVe!1?q32@AY?E|kPyWnWc)XI_WUe;V3L7@0)jh9{K6DCreGL=Dm@AQ z4EzX%J=FWSpIS7U=ACHj&gBT#iy9;{pd7IPmap@4aa|>aB+BeZc`hT{s(~x1O_5N@ zLh&`q9n1Zg^n?;jte1oBc%&8z@}D)b%4IoAx=ix@mD2MH2f1!b4BDZkfjc<;0#NF(!7gc)UCC`$#uZ%t9Z$W1L1(b&3k*L<}>VWDcG>ivy1IK(z z^ar^^wdghUY$nD~pLJ(Z9{?$a@m_rqSW<62CiQnOPH>tt3OY`hRzFOS;xU~#+drIi zlp-&*7aqzZ%Lx~nF%P>gt{!4*SO%Ri+vm8Mn9WaFM!F?=sxf6-eL#%h0J0R84zfRE zu=XF0hLyPDkzgJ3`CEL`0*3kHLJ@NfJLq4|D>img>)$4$Pq>N<3nrCyL>;|w;>;Y@duV~n?&X77|P6+m_>E~vi zJ;-VffXcuv0>T#neb8R)4g(zRaQT=xWMb%e{g^t+=2bsq^#*(JBs3j_OSqDN1>y$F z2w7#gs^pGLOCkZ!!Fa65=n9r^z({tP&~|Bl1bFGKxe^NMltLbgU*nX%Ls7KD+CDrO z;j*4?Exz+W>jz;kQddD*JU^W<@wM&I%$0r=KI3nTk5~F#*9W2&6|a zVT#Igq=f%yq2Ipi8I_KX9vN|O#2CUjDa1xI`T-+^Vpt^+QBOup(+9;cPYlh(kOSzi zk3kL4Gcf@+(!~J%Fwr%ZIw5#N(kYUfZg{&=EO>&`E{Lw#ce)aqutVNbLe%c{xR04( z!AzM(yVU82HiK+NXmP;b%C=ssyBqxjnv+8 z$|%luf&q&wA(hfu-JmrA;>g%5$c#smy#=!fg`IRvWW#(wWb@^Pp;DAzVvEb48?^-$ zLC4wPF7z4X)4KzDP4L z9zWLc{`BVAHySVTgXHloh9>`2_SJWY7)^?gGgf}PtQdQZl=8Z5LfKsAH$_w$R-~Fw z(PZRNMNj*Z_)cjS)40lh)h&qIN;tl*AXg3H;@zDN<}}37u;cmFs~WD85Te~W>cQbw zCzxCJnFX1TdF_Ju9Y#iR#~39*H(l-FD)O8={RVGM9BszzO6^7GVExd6^OzLrsZJT4 z+TyK?y9_5;dMV=@ylK4;R#!x$*u(hE=_)DywjB)j;0K`}-KVac4)jQJbSScyF7?3c z+2X}?9mKfH>K#Ab-ue6E#>%hr1FM-85E0gDol;~A^wmRG8=cfA{-SE}emUK3`D(8> zK+7kQ$>(~WJ>@rPm0o&*+JzaW!SJCUtC_JEl;|%oackE z!CtoA6G<^!G*)yzOu>d+6CC-gUfUBh>-I*>8N;(+=WTDEj4A1FHFomf@RMWQ{DQf5 zh?3(*eJ2|!oy8;@rX!+ zUHjX)b*u+|TdR=>b5u!FQtdEBO-bVT9jyQUJ2egeO&LY{7iE;Et3>aM&|fj~|4dCg z8#r0%Ik=d({6ieobm#;d@GW`;KPm7Jaa1QH1*s8#!NW;yK{(kgz-+;+p6*W=idJk@ zvc#w$ZI|V%2lecqHDI##q)}*;4FN6H&Y~&EVTpHU(K+y=?DjXYu{*hM@Bspq+K$qq zhwI33Vox8jqj&`}E!v3YgrkqQ#5tA%S2Yr?26n#@9-n)e<{V2;rNF}5B7Rg+6GimhanfRQB-@o}syz_(x{o)K&)Rwpor=*>Ui3{_#igvltFR*Ru+x@N#Ll zerA&k{|n_tN-4nEwhOFS7f}DpckvC7$&*6$o(zoMr(!^$Oa`8|0fcSpdGe&S?jB!@ z7Nwmu>@A-+BeNt%W+kC|nnXBY95HMQw0h9sk7%fnPDB?yIj+;Vbq$lU!4kiOAx!6`bkO(t zYuW`UE=}GlBgl_cek#6h-PYP!0)`ESaReXw*MBlZAx+mvj@_564Ua`@Ok~5Bo8^G( z|NMg(4>Nt{yQ<0R@?E1(QTSvoK)8NKfIq8)?o->plMlqaIAJO_HL1XNfbC^XIimd< zJvh$P zk&Rw7JtbY}68i2+j%OlhEe5<*W;YDXv$Id<9z11=>8B892DgIToUHbj)7rQ}a4|l1 zr(b&XdMgdZmwm??CP<16`0S~=jy^Rk<1*f$0&kDn`)wK4L*vEVg9$WAavIvQNW$t{ zBqSWtD-Vt&{byEF1*!m5XX+ULN%M=pv{>OxTy$SlLFXe4OK%eO5{u5O0;hHJ)hotJZujzoL~kBGPe-)i!i_F z16yyXs^M8zZ)&%pV~5S5Mxkf)>{iw(|II~!Oe!G1sl}771U-{Mm#*R?%Ic~wM9s*N ztdI1gcS8tQfP62%p!D3$ZrQvL3^M!aJ!!JJ$B%|r`qHr9uBVOywMs8BjhGfyroLO9 zzKY@bL4bY8g|}IleOc=SH4`(zmL9*f0xpI~bUc@rw)rzS1;kiiEXh!Zoo&dsEP&mq zr^HNC++{|2c!7%#MYin8<1Ymyfs7w?jlOi-{NCyOPB*ThEO-LlK1_+~Yh|PlU6SV0 zWA?{QnJ`QdoV*3}$^^b-Z3bYvdSd&bC3g!v8yeg#PcH@^yw6;DWI$a!e;BsuD$3|N zstE}|2HjQ`W!H(j;h?y5Hf*!s{CwDSFrTKB{h8+6qF}?&Os7V*$iQw2l*A_ZU2>ZY zo&zu#f&`uY$lI^^22*YT-)~mG{lA#~VB#VY{;Bh!|BpJ~f6)3N#+yT`AdDaUCA>{% z?k@QACj?uOnsVR}-K4;EI4uN)hy(~8dfV60G1;d{_lsw({dby@nG%QxguDu5M3xGP zxeDbI^trRE*uaq1YX6Q_Q)P@^_l4KJE3~J(B(VxhJbhhmaYOK2Vne%{3Pu8E{)x2V z?8gL?>*)$+J2=rIlH#}JYyceJC2M%tZ_D**ny>z`9O>UJ{}0B@@YBG*hyy2svoCfm4q``8ivcAQ`SXZi468*DvO|amWnEh$N;}8KT2&88MKO zW_b9l>R&$htAf`_9MF6|UJ3%3OMMSn&t!3pPq6dx?ec8vknT45`>w{b)|ejd<%GLM zwuv{NnFZNO+%*V5!zJ(?@rcZru2x-w!t!rww*j&~Xmk7;4NfCR3Bht?<@9BJOk-+N z1O5-yh@k^?Uz}KtMRfRV!DWL=7lxv>i6qs?>};-$8X~-cm!?RRdn4kdEvTs45?1VGkMZoJjk*y#Ny>hgh zub|~vk_+0p9hfSRrrMrqkAC%L7ohLaPD#{)-ypsny%(NdR~Khp?Y-Fglf}`|JBWYv zgYEyq+N?1?yq(FDHS=o(zCfwo<_wFUa4DB!&2_xc9pE^JzKah#RV}>5W!73>n_zYG zeqE0y0Xht-O@44MQKG}+f|i%9EB*bH7Q`GrO)#nga)-S}^C{{(L5m7|f1kHv07{hF zb~i4hWA*^-U#&68%3tJMY zM;0Ilf8LrDPp{tj(;6H#bSs%PtTfuE9rY*x1!^dovxd7)#oLrWXa!eBE4LB+gD;ox zQ%vknRZ<|CtEybEmg}b!%4OSos1eO=5>sP4I;%SQJ3+?AH{P%USbf*+*{HtpW^s~m z@*gT)#DB*da|@?$eqN8iZbIDPjOxJPD!@!4yr(aE?I8D#OeLv;hO!a_Li8|vZ~ciN zqitZ8*$6!PfsvHNtqRl%hYv1I(h@|NET%GZlb{$7TCXEHub1#$`bb$ z-w8g(+Yi6rdb$AzbGWMvT-6SPs4pz<#lD%VKfgAtPmG3RAnFU*@W!7)p_} zlP=hC%@!Kg7uzMn42JWZyJ@F;V7vf_xPlTwG0iADxIh{f^;JDKRxcbgO$oyJA?l`w z7fO^#2jHG(Y;AdHu4a>?)jUy2&Un1uWic|cmrS;VX1mkdY+8h}*ezkT|7A;(*=-(N@y z+oP!$IY@xl{s6fa0iP`nI4?{%gH)O8J z&Ft-%a6RRiJ29CT+ws^p2_)&#{kl8f$++F**0zcRxpMee*4wHFEQ_?&Am?(Xgu-a4 zcPF?LpZP}?e|xUxH=_x3QD09+)9?lW2){bgh9KC%P45fX17Pcf&pM}r&=7xuv$`4a zO?w8v9hp^%5|PV^L9FiodgzP*Ps2!{d@9Fp=8H!gH9% zMNQ1oCE_P%Cwk!yY;7aw>b?l}Ed%n8A8}kLDnGgln;311tBg$T#c+rx^6t@vCyeUS z`dJ+ifoAzHC}Nm|s?khV*5N9&(`4@S4M(wClY*Dk(j2ozF=5oXv5R^0olQ{81d9&UH{ z@#rmNLFGevu#{aikVQ}AhIuaXP9TpCS*(~kThqXvWpfE7qpAky0s1lZsL$<_Z?l(7 zqdG)r#1@rs%Ajji6rX`Ox1+Qbwz3>XPNW>OW7mzT z(5`BZB)ghUI!VrXjuRM55|uI$Qv2u)4$Ji80XJXzaRjAlgV4dw$0 z&q6t8iowx9a&W)Lyvr+!A@GIfXMo|Wy_`O^T|Ix$d!}eK4)2(yiU^cja9B3c>s5{2 z*%Mha29TO}t&olyXS@I_ z66m1|O+4NT={wiznVGQ24~6c!(ZSHw-<>Ri6+@pjj680Ms}n_lLX+s<5zXoVvuepq z%BKouEXeq6yKP={Up)KNcyYGBb|FQG(vT*GJt{C62w3mYQof7liGl_QM@RO>vu`OY z5hASd;TJ>}LlT+63Vk$#2@>;K<{5Q8tsbH6CYt(V+IX>+Y&M36gh=lOa23~I|#+bl3<$xVrR~DNsH4G`f8R$wYq6 z3dMNWK4<|MdosSICvKyPdjguOQjbU*^IK-OfIyiR2p$!5NzKgVB(ZW2=0_Xsk%zCI zuikr04@%m8@wqcZvKoSzk41c^0#d-$W92k{nCu5uO;U3Om}^ot$ioo~p`1VD#*NDx zE4O&8=w=|euc%fSCpDZDP!Ai{lK1M|E(4Wm4e14X290n>{DOcSAHCrfc2BHGy&wx1 ztwf5U8r%HXrr0*|FpphLAm_qRtCfuOJ(XeR#TXn`**7UF`~|Rc!oyH)&&`SqzP5z{ z;;p0rqz6y9M$JZH^jXSjzr1x=3}3nH=kx6XW_?hU+m%?BhC1+Z}KN z>#F+Ja8VQQ)mH{Cuq)+GdvO>}g2*&p>3I3udeNAU*G{l=6ivvIf%mwOzewt(02aTG zv2=f3S;Zf-RsQE5^M5F5T3Z-u8yVOdTbtrd8IUD?|m>!rN`K@y> z@{#r}65IvfiBb_{$6UPcwGCK|q!QT^ZGlR=>$4YFfW{wXWTkr31=tvz$acZJaR z_VQh#^U1pJ-Z12z3rdNDm`T!?@Rarh_W9D(b2^=MBg7FvXj9cMT0<33iw_dNRVwoc+jUC9!ii;nCv{Z04 zTB~rsuB7#5XYo}QbXh!m;$B>En3b4}qNYKXkWw_sEVF?Wx2_Yc@;Pst?*dF~hu;Ic z@yE9Rdwwv#=jX2nXr_nD>+ktt_y#JV$zVDOt5-uno5<($6HqBvRn@-j38?MB)O2HE?y9+@)EX27 zv~1mf|Ggc~_hDa%R@fSsnl3&#<_8`Gvjh$^h0$i=2gHvrhueNU?K+W^fSqm{j|Ec? zZLbfM3Vgk~mG}x7+cV*X+;F#GosfyG(2@PA3;TJ{e%o^Ya<-){N4niYiI4G6k;_UGH6!6#>7m^CG;B>E7Y#IvPeHU5mJG};WnZAZ2tzN6qnGTzK_x>8h3Mf3(x-%?|J; zB?INxpmpX~o=HPp>HMPvYJw&4X^VktGHmn}w#EeUW9Wehc*}d+4FPr*NQ6ca|3TZW zvYaBHk$NX)CbLF_i@cVka=5SsG#03z0j4FwU<` zMh%EE_oKx%Y;xI48+Po(By*Yni z0h5|7F5zLLc*9F+iZaQsAl_kHcf;o}QM@FsjEQ0TGJtX;Ok;!S^KquXkWL@t*DU;* zKSM=E#Z~g=P&!yUQR*>iKNdO88r+ZE0#UMpJG&Uxdv&w{I=Jjpo|eLyR|p4T7nqtI zLR5gYUnf0HgXe*0t3Rfy48B1WrG@PSdg*|df1;ZNmL=*gZlT4`?GjBX|J#RWzPEQXEc0b03)x9%muQPft@dsZsd$0Ud#>P!NF33WN?q;Y$MNv}jn(Gc`Fd9X9!Ps| zT7CRKXxwTu-LTxOzubvt=#YK)ZPy$sO6cixCB}NWr%){C9;e2HLJxaJ-HCr`Lz5bD zgMS2fN8J;y|BQA`&0Uz;G|{KdE{#rDQDbk&y=EVjTNDaO&wjSyO)mG5f5rO-SS5fa zKmY*kznXObnkfEJVqv2D{{vXPzhqeS{t^@V8)`A$qrSU%M*h{s!=)5Y6n+Dhysy|; zyl>{3MV7z<81qYt(lF;*vA97X$QqIWC0-A}5E<5^Ewifk<><=vbA7S$;w{CD<_3Kh zg~;VDlb^sLFAULuTRd8WG9)?9>#YK|!;_doWa7$@r-DKD6|RMFjABDHfZJe+=OXY+(zdh_i1tGG7GfuW~#LlzJp`uA3~0rN_% z=`gw@TntuS1->YC4(Z>VA+8a7qOQ&9aQKE6q7Q09WiEydqen8F?&KKYa)sH@+@9f# z;pcI2HM%@3z_do)3iQaJO{20~kCQv#jvFDz=p))`@F5j0a#LARh-rIA%tZI59PC^g z)vX%nIxSF?zgmHD`RaC=1|~Xg+*Ddu_&y9-T~(}JMwkNT1VGQzIvm5(0s|?%@Wo&2 zzL$XrK-%{*_`7Gzi+*q6pX4{e|796`Z?HyICVz`Z-Mp6pK>)%`OmC`fgT1)wVOLYi zTnd5RZE<0{Z*wXpj2u?gut986vVG{+N;$0(+OGE9PM>J5pWV z6-ePT(iT;^%L%<#ejrJ3-OHmV|LE!8beQ2$oMeEsB5g##dgZ7zptr)(t(0w(-A7v$ zROX|zPT>~p4>P^;v=jw@$*A~2SHO=^2II*rEUq+oGCgu@jk8A>yq^trLK4$4C8=Ur z@&m7!i6>+#yq|hZO#i)Rta{@F-5X!RM?LiqWAC`I87}{BX$9CVs9PWBff4}{m6kUV{fx(oXnE3eS&Aq|yo#|9G zU|xHgAp?qJS$nvOGVf$o0E!`JS{yo(Xn)yy^lw0pC)8a4_m*mwVEfa%`D$HO@P=F zQfMQ`X_L9z(LvxhlF`V`~LSh=5|Fif5 z#@^kCX%E4gxfw)}Xb%?pIpXR%Duu%oc8pB2Jmn@phrIg$FWxnn%^gsEVvyrjp>I_l zncU(v1%CHu>`PN`H2LGbw)x4?MNR8=l!K+?I{cRdvBm>SwhuvX(X{AII%hU=nm^iJqM~U3vl0_>Q z>$nW@Nys)4+o_EuM>;q#JGRXD$h*37{6E}L{y9nb2J$|WWp*ltuQ|pS$yEB2rL5Gd zD~uM!kk4JLCf9@}VSNrcniEV$y60StiZm1OFa32?W4^cuMiApth{jCVA9z&!4@Ii> zO{3J2?V^JYTCS>niD9OV#}fK+6rXqEUbzs)8*rPOh#AdzjyYiHZ&ovC19cm%+ujyU zR;Jb1`tyhKm~v4`7NU}}WJgdn)B)(WckdpR(sRv1opf&-jp~qG9y5Ln;HF!C{wi=G zKhxKa)Ur$%Tu9Ir4=VJaTgF=^&#R-zj#Ykf=u4@11hsxHgGe5gcye!<)+Ty1l8&yN zJBu}y;LY8NhmPH>#sUw`hB|woCt!FrY=Qo~eT*9XgUX?8G?a;Q(*99lA=ySGPeE25 zK}W)xL}vuPm6lA*||FY^xsUx7UmA!VmMTY@|j$Rk&7Q&64rUMZxDp z&a~%|b9c$Eds*`-MC)#>GQfLZGt1c6h-frlcpEC)yB;rxqbDnbhd_MJoE&OF^AzR% zRdA`(LPu$!ugn0JE3o4pG4tltZ=A9eI|elZr_}S(wP*``MV@+#X=JQSmFR#<21(Y0 zUQr+u6M`fy{pfgTxE#$*d>NV?szVd@5#bnFjnieGO3ovWM_*~t2YmSfM&3rp9Z`&C zRHS@nxGa>xP7&PiK+TJ&`D~kaSD?8)6)t8{O1bb_r+N7D>o4dM0wDi}t-l_i7i%Vr zzX5^)@Bai4|BhQXlEL6+t_ekOZVBb*G_^k~D#2VMo z{0|fn|M!u;x4rKMN+)fnZ`rx;Q~y7&e`8UkB`5?g!X(TG4r=F#UQmJiz~x!FxgH+) zE`=rv&94NhUBMu9)?76s8^+?fQIqTTnG|P-rZ+|HJ-J#bK`(}^H7hnYHdUTn?8!~7 zFXAW6fKd12p5m$pD5v9T7LGv{RJ^7rj>KztiOSoTb~FG%;)3YmYz*M173|!fIbFXc z$3?NjS(#qMeeV z%%X|Rm<)!tW=vW@aP3@hfP~lv8>C10pPQgX6(~;2(^-i{?#JVFWk;J!)Xv7`sh(8k zd*W|+$oj+@WUhcXqPVvcEs>v8T1*`KkKQtPEK<@r*GdJwv<-BA(+75(xR?8|dK3O~ z0wBEV5dyr2sGJojmt|+ULFf|&W-k$=N?yi2AT(Iz-mRl^Vp58WrPs+fL1=tdr`Ck4 zql+MqZ1jb$X7^!W*JM^k9|PjtF&v<9X$a=a>#L!ytHJc%S16V!FsbEyV^XXH<4B&! zVrOP2)0lR~@3K_?1N5`2V5^}WX%uZY9Hxfs^5>yc|D-I^y9w7$BC~hvxGo~nvmUlc zC8}7RBoMMHV@rXcoFY-y#?nYf0rn12UQN*g^o*R+5LXmfn*tP0*b&qopvNsf14Bvj zxr+0yOBH$T@dJYQnq3Vm_m3kXStl8CH8x5V^emg%__Nhr8d5`E*|Ix_UXNr9F6$V! z&ueM3f@*+4O={yjn}ZRpb%=MqL+JO6L~k|$Al2z0SBFaxFjo^dO|%(!A9s`OkHH-U1w7ZY^>$4mmS&`7s0uBDRQ^y=TS2X z6`4`>MrtPUQc73mAL7#LjE=uqZ+&7;p&ub~<}g%G=VO4Ep3%T?nL@Utiu1w!hD7lp z=bZN_yV+k|Q3RR_^d$2+sY|E%WA)cqe(eKJ|AaSa|J`%{eT=$Nz(_~| z`SF9P2ORtwb4TSU4sqmCp^t_3HDY5B(nQ$j##pTj{J1jB#&C{DV#5R#p_KGP&rd@m zblZ8C+z!F`^h+&#V^H1>{s4w=3zz{uzOz)`e`Tq_DjN&_Ddocdy9IWR|LVKGLBQ07 z?N#`WmM63SzBedxD%^95T=Gz_f(nft2nm|RItUbsz+cc*VnvZOI=7)J@hvx5_(CK( zv9U>VO3GRFOSW`ol%p-Z?dHhTwiaW07yJT)!HJV&=liZ;kPx2tjY!sv`8-ZIt5e|$ zh#dL)lUq51!)1&cvsl{ASfj25?(Ig{S=wEp|JEwEaaL&*8(Gs#RoLl_+iz773P_s1 z<(^1?+z6N&M(%J{!K96KlC!7%Kn#Hj13^Eh;W_d}iUgNIlD$gHOtYm;6W3%TpZCN# zG)ILCgjb2$H}A==d=M?dsO09sQH6c=b#n}#GPhZNWPx$2%)rom1(SVQ){~n zX2%tSuYzApa7Fy?i_3UD)^zNIP2$lNPzgwTT@_+qK=Eugg2OF1tRT)9xRy6ix-L#ih?bxa8h$~%%-Lu;vR01h<_#4qLICUe=Q zk}OuJ%qySnIb1l-BptjB{yU7g;K7g045PU`WP(vdfG;jBEgu6&NqUiR0QNqWT0|o5 z3Fs&37YLJ^DU*78x-50h_sFPY$9Zrtd}8a9`4f#PTtmmA0y?d&H|&b+&gm8|6-TR4 zXvY50^*aH@ut%tNhja=ExE1tOIn~UZDC?YU2*rbn#B$a2Tm;d7FOL_MysdQC9b;i1Zw2Gt%{P0azT$%yKlrU$f3fIxfPH! zC3V$`{W)h6nnBj+LRGmU5SMHT7%(`AW#)LTcvwXOO_b3UH!7Qf<9KSwMY&8-3ch^& zplDVVPQC2IDNN76V-KX1b`{Vt{Twf}RL}yp?N{|4#xAfAqwsgGP!oIg>iAT}WGc6> zp;1Y0WlY-65b#t~bwf!of9mewyg$rRRiwM^)UEiM?i(%zPVV+)rF^;Awv?&;Rl2{j ziY2Lbd%y-t+TvH8beh!N5qkS4`kNeOCyx-S?ZV+qd2>~dec@SsHc9Yr9UZu%R zYw2)kUo&pUvg;?KgDTqp=B%~Bw+QG$yEa0q?0KG?jsmY7f#%-{c&7A@@kwWunrhUO z^u=WEE|0RO#(5vGHJ~(j5b=gZ4%eJc&b*w|DQ}m9CLE?J9=p0})7}0PDnYnQ4-H_6 z4VC?(^aa{{au}$5Jho_E-^FqWQ#8Ghgu{(Q?6yFZ_Ipv3CB44Z!vj4msk4i+fUf$k z*;tdD-~IRq4pfQvgRRFCaUrFL0SAv64rLSetHPWcW;9b!-2JsQ@P{=7v6ZyrIG8$N z09G(4{-%%;f$T4^TR-TZ9Q7jh1p((!%lb*rV*~fJd3Fj8b-B|#9Ea=5TvgaE*pR@t zDZSnW;lHHa2y+R=b`)59_)!qRTl|j%Y^sUYiz?$J-X2NAW<<7f=i43zdBaP?DQ6Sjp_*7yJ*H!sU!RC&0FhVci71iV( zd`^^kZj`XWBPWUntd1P{a(+v=&UCnD92o6)myfu8gx_23Nbk`qdI20~**S75hP~xl z0SuD-8_;n4LmNn4m~7ZL+qvWsJY>f{b2|V_D3TXsYy!=_TAwnFw~(vO+e#Kgw<89g z#dx(%iks?gv+z0;JDne#6M3L1j7uQU5?Rh6H2ARR-RTh8h}CXrwBI#92p8CGHX{#A z=XUOTe}{?ZQSGS=z6OP=@`Uh{r^n}WhFIf!!(a#S{@yTZP`@{ftikt-e>RN&P${;z zbF%o~JSaDpzx4iU%0z^o48U%UfANH4Bcmqj59k@li`K*fVulq67)C8C9#43}rjt_I zZPjG{YK=}a)lS$iRZ;9hCp!YOEev2c8FN0JujOOIH9Nv~UcY~xd+vBod?}s1fANy5 zesz(6$<%E5t*S-)5xeNg-}7I=h(oUjLHGp(UJn-Zo#HyH`fK(SvlEs zpD2su#+xSCRXJ_N+@Cv2-FcXY9nl8d2ENuAgmPi!%+hx&GG6R!x|#b$7D--pXif0=~{9$hnIeQ0w=w$8vONk?vWp=Z)j#7g|bsOt~CQBbOmwNs>fMUqjV zob6d|D7pqsW`YHzqbf&M2Mb7`d%uAf`_4fJVeq%2*Pi->|kIuJl_8ch*=TrBo2 zESu=N6fKx_&@m*{N)hJR2?$JH)eAEX_L$_F7f<_xrv;^2rPe) zt^6|{nRMO*ZC`Y5y$642o6^*2YPN!b$P*uoziUaJ`S>9VrNHcJnT-)#y~=2Z!*ev- zJ@Q%9;ZHI3t&7pU-csw00`|280yVO=HM$&>QO^oR5I6o&ecddK7S~Heu55pRX#GsP z{NVCO6YjJSuGZq1mmz8D{*vcezTK5|rEwx>FX=h`S(1G_lS8=C*s3H-_%Yujv5*IX z?WQQBTtMc0sf#@|blS~eHW?wQEQS<&B8)U?#rtuE2Glq?w(F#w6;SDLe6r}c+`4WA zCxC!e)Z9enGiha%Ew`aBc2qEV=*t1b6PyLWC!3_f*TsPOZmRGpR4A$=fs(gOH2=VK z)q+G`o#X0p^IkbUYvvU>W-T#xZM}CbLo{`T>SZ$dg_)u~S|zc*zXVnbi!MhOGV1Lc zfWo8}Tvno3q`ij`70K+q{(^Y#gwxcp#A(dfy6=pnA-^vQ?Txa{I{gvu)>`fL5w>Ww zSkE3-Ahd9`22pn!KG@zRc*!k~B9m_Mpos;`nipsp*z6*&O`Krsi0ghiW0cKeSU8yE zhkx@RpgCxd<#;F9)t4Sp2xg)60UJ#YqfZQ7j#B;8g`v#`7&sm5#f3mG#H4h1&#A&S z(COrl$NO-^RO~Y^0>d%yph`Tp4%@MriA%QB&B3}z0Ujqib7kaw>LXoA<_HtK#fB3r zOpVF0SS0ln4Sp*83Sj=pK0vwx1GH)kOd1Fks6S2KgxIcLY~_p!_l~BwxN+DmQ&}+Y z8hpg-40}Q&Ywi*TH$$EeBWOSQKE}B(NUwft2Z;ER^|lq9+$ecSCp>794} z^&PhFGuc*;I&Qht9O|jU7wPc==CR@ZA9_}mEE$&Xh{9gIlX1+1|2LRi5f}jcV8?zg+q0;|J5WxO>knd<<^LHwM&kGC&6Bgz> zE%{ycrw=-5Qb00T)I!nfgW7@78v0*seFKjz0hevtwr$_GZQI6e+qP}nwr$?FZQJhG z^G#kdlT1>7;G}Za-nI5Z1ObB7JOsjWNy$<;t+S=lo%eafW^_}t`OZK_g7q|tt}=Ol zHObk$Bi#O7Tmfbz zK@JWAn(v{aDa{6r531HW%$!+RLq_Z8Qe6?{7l;uz(8=iJXmc31aV)lpge8N*$s_99 z@21{SHfBU|$=TF*KP(e%ouu(;C@K7UDE$^49Hx$O>b>rvf{4iliC5)?abv^34MZ&D z1K`+qvfTv%jD*Ph1zEP*W>g7#r`y}x3G5j1T}_te3Bc6tSw+;4z6=q5 z3&|&+CCqg5PSEv0qtjH#(7c$-J$xBabUNMO`keFyLC#cyF{7qgI@5@E0QdVsoXU|i zw7M+w&FszF%fusYd%|8FM_d(8;4XV?UeXfzQN&dPXjt|r8VDC5g-T5n+Rx~gUE+ZJ zUv(QxFIySv%1)5mh+J&|FJz33zCKtyg^vtoPy5X9L_$6{*2fo3>&5uwXf>P$1v3zF*b{YaCCw=eGt;9w0{jxp(1(guy*# z?H{U7eiEvh;mU>6p&(hUkwLG9hYCf2V5&3Dl1fe_s%ajl zz&@cxrh^SEo!2ac;roalh~LE+Wq_l#ib@g9U1F^Fq3P0)Gvrb(V9N;M4!aP-Ddd(Ji~ zehb@-m*yOpFtu*+12ok7UOpm+rukm!F5$MdL}QSBo85L=sc^aX>my?~C#N{Cf1f;y|!X&EKm> z?5{D&+Tmykg-nF_u|MM6@ju~L?_h=rm;k5pZ`84}QNLU&M%iY+?g+d%; z<+tL(3zMo`k_OXCiQ7CvX_DPoFJJV8sCUY>iVA13a3qDv+Jc(na10ssnK2HVE5KOS zO+}N*`l;r`f0g`pb(xj=P#;j`D1YGC>mACK_5#tp+2ejc>#v-jzE+i90q6#RZ>sYl zVKcAU-zTGM68_y;ecJg&L{S5v`wVYBYIFy|uI$7>^;Wxi@=EYr;G3Lt1Wpo6r^h3) z&YL_*yxr@Gv6SIvU|HH0LbLjCD^Oq=i+6ehp2;YVvzHkro~G#-)`kotcxi=oYX!)! z`kGj?-Yu2Q94OI6v3V3d8c4?jW);+pvqJ-EMpul>Q!b?@`A9}LN69Zw0(~rrkCKc` z#6k!-1@@p$`DBiRrKQQx@jnP@j<#>m@2}t1xgWpVvOt0`;6;7xR{pDYW*AOPPtm=T z2KFVB9z?!oe}LmB_V6o45RTo(!(!s-1VFR1dWzU!4qCpLQ{OKt2tK)xP?Pp3ny;*I z*{BF1WkKjtd3G%cW3|4A$wmROF2a)}Hs-I(EJS#F8LaSq!Yh@_9zxW3ap$^P8uufIAJO0EV3OTyp3mRpuCEev zTCJ|Aj2dZ7LrJh0^0oN%PqrayoJ3k`_w7Aj*vJM9^{+0Q5g0W1kjI3kA|4~ihPD%M z0=!MvJO*A`!om}V_s2l}9uT$y9u}2pWqP*V-d{FsT6`9$-Eejtz-FV1%rB=Vp5*yL z*{_xH0q<17ecMScJI)&7TFPvhRG4syLhG1t(Qz=fmCfV{7`quHVmLVNE!3!q?X6HN zjJXJ#-Fkk`z%T!oWgP}0{@G}Yn>4^DQ71kAEdv7IB| zz`2i(E+c;?rxzY|9-MG{(9{I-?~6y|Zm^dw=p&uz*Bjq~;j95^7zyZRVDvZETq5aD z{`!SrH4qSdG4~@jsc7mNy(L9S`sO9cJ2FUB`lzphwI1pE1C_4HXbL(H)RIOwv1eWp z(Jjw=GDSBW2c$@RvFL+8D=Da!V50Ty0XVjoBT7`1l+!RA+fDh8gpN7x`M|A}%iJ?J znF>DUH3C#3f>Ne}M?X>act)m7$m;8vtY`cAK=t2Xz(E=cpokS#=e*I!Ij+|522ZI0 z@Q>XgZisr|vtbKr0ighPPro=1Tsnp9ym;;{`A{(JjRJPJb`@6MZg_IqYx4!tddkA9 z@xiuMwq#bu!T+R=OX#io5Fug{z+SM;NuoL%^{&ySTm~Gyy?cVdz3^HGxUO8Ee>uh# z+F#OTKV!iB>_bNCqDc;BzUinZnZwj^Z-pk_dLjZ<&q|8tx2h5m%6+R+8#L^f@EsX7 zkC*;w8tIKMoxaxp-dQwd6x_a5+g*$E<)UkAq%bm>X)RoPdu)5?=Wj%-C~T&fdYg;{ zr^&lDgXtR~8!7tavfM;b@7PMM!tU5u`rcqw#Oe*C;I)D^(~nHIr1{h67;%Eu_;W%* zc9s1?jQe}&<+5RPw0|9_brf0;O^(H|k_L0JRBx?R98V+QYQ;A7a)xTGI4aa z`j5cmR=-If2J_bg^Q+}U_X2X`2`)+m8YIX>00%LY_Ty)C0^3X!fK?bsQGoWDz~UXbViFRCf-OaOe0nkmg)UQFs;YZzjJR8 zYj*-l#on?Hp2m_5a$OxEd~L)PGzqvIWg_Y7=PtpCe37?A3Rv9jl_9~59B52NQm)Pr zc5yjOMPXK~s(!IGD`-bn;k}lFu6TDbsXk;+P~Fu; zAnYPHNFdLtY8P&W=fvDVv#G*9XSn?CIg(t< z%C091)v-0^^)L){UjE1Oe#)!2NBMZgfqvcGWKYMF7j` zn+3;=_Z39m-(6Br-CEak8Q+~B`nvj+qK`A2tIbYeH~axplI)* zGH5%%Tlhj4_efRxD@~DYN4(QZ!WSK=<&q1H0wwywHzSW98^7#&A{^5p7d3+;U29~^Grk1TaINYF33Teg=&;F81x9(O5iE=? zE@hap2Ld`kpL^h4;(#+EkPTKkU-TzA4mc86AO#t4bEuB5V@a<`t^9sAE~r#L^gtfd z<6hu;ekg`e&yTB#sofh!*AuC-qJ|%gWBhp)1`jRvOEyR*Fxn3#qs+lCmH{-~k!OWR z#LgNeVLl1OTHY5?E9@q2JR+DX7qx5S8Da@Q%l?+^4==vBB3T}x(IUuI6J+g>Yju1yZ z#P41=oi^0)a;|QQE6o}T9&GC|8aXUMGs@R&c6FU)WKAc9J!D7zKI`<5H|Leu9mjdc z-q8zKBnOHh$bF0pY@EOu*5Z@9%ze>^ba^K)fLQ@G+aC8ms8LbQfe$=C4sZjJ3$r1o z$|htepQrhAjNJ@KSW*N(U#uRvkL`)YtV32c6yUA_iVo^yo_%i_ZExpQLENb$2vk+W zurtyUv1n2VEQ!HQS9{hYaEG9iQDm8NjJfu8Y06s8r@Mj_Aq>9?#@7Ci1PeLnz{#z=| z^`%m`{N&^+$&+L4SfmLM|QpkzG({l$9%R3}};-rii2D!HH*x1~gH5;{tCj;}ly7k_6jWzJKI< zrGD{~4S*j40N{i87e7IWzDEBWKmV6$+0n$&@&D&3-#Yml!2E{(PA&Y?`LE*>PV||% z=04IE_MCnMAjpQ3+3&N}S`mRD!+5BLY#x*t!|-c?0pg$uCwqVgBDL$m6ggX(T_-t# zoJJ1CzO(wZ2IIpFz#--$Koa1U-X4TdLR`AnbAR&svO?q!NL`O-u)4?SCxWmz{C9-lTWfN|{oG_B>XW(puz-{}JsuP}^ zsAK1NdG94M79RqzP>;MO7mDLQW(D~L0Li}&`@chcjttlV&L@!Hu(+>uI7MO*!lIWo zWTxp1onp;XUg6AydO>~z6OveqSHf}7?a>E}U3_J}HxVXVB5eP-Mb%=GgA=9Dqxt!t z9Ig8-gi<@9Y6^!~cM2X_3KAenK1M^DiL@J@M1$ZxVig(21u~sXS_leke#cAW#2YHy z#e{izS^F6YT{xxb4acFZHOSpij&dOE_ZD#F32aB8KBA2YCNU)er7Yg71%^0`0HCod z7dhQOOITq6X&*?diZ_0FGlZ3PK~U@uOt@!8N*zj}AjGio8O3y;d_FiNDGp=M;L@4HUrS8@vi$ zG<4OvzbN|Si&uOEeb}YJn4}z{Zk4G$6Jy-#X~xK?^E1&Elz^U^EokGqJq4(#V+3wLRsD8^c&BnR>*FgD}(%6?f72k9Q?E?U*xAgwxLn3G%F* z6fpV(C*5{@H^@pL;EV@dmXODxY3aQ%7(o2YSSesamUbuy(#I9gkECSRRw^+d3eyx> zRNxM?u4=-@8)7X9Ha}`i_T2#RpS`yeaYPIU5<#P7-6Gl_YG5*$%vAIQH@a)H2!v%A zYx%5d-`)0xLDcsy6k428J+36@sCZsIyuam%Q;*AsbITjy7IAz@HdwDW0&}*kuUWcM zcoI|3?GkE|Eq_{H-Ic!KRD8XYy`Rek8S7vwvDl@|5PboVOK})1P^z%$&MBwT<8v~Z z6b;v!*2<(&saCTpkbuc%qp(=SllU{8_@C^MGvv;cR1A)F&6;rPOcFO@T?J?$ZY5m~|H99W3+J7SiZqM>Ylw+r z{Dy;)ZVbZ>kwI3D&5jp{$T%eHj|T~uO7$5j7h!l@zyxH4If)QQtq95RX5$LMo(m4b ztp`Qq)C5*RI%9A>y-69&KKxmFE1@#J4xdvmb}G}U%U1#XR?74)O`z7;kwCKu%dkQK zu~X1D53%Yy01&E4I;1m2Ux%v@B}~TH!uB?;+!X zkq^LKvLE^wwqn9!tMp%MAh;UgCgNEr9yH5cze>*(X~6>(WqRM$$mOW=CXcMZU^L(r z`0DI>QV4n6Ps{NAD>E%_gaMoH&eWC;PqG5Nd}p8L+#96AXz9#-T8%J zhk(_CPagIYdT3aiCNVR4Q*gKMB@+oPZ*{OM3PY_X#a` zuvYtaqJb=;H7aQ&6ZYXIy};+u1uZk!ohMjcQD%NozOGQTm|U9v2QOh*1J&$VLJ`J( z0sRh7BOB3-x%*(W)ZgQ%$Op0$x;C7=9^^>kK@f`B-yzPydI9hbCVr?%6aghdUZGlZ zPOY!ONyys?8~DJ2d=sClsR0@X?cQTY>l@iJZgU9x2*h81Fw&d6n{E3H+Gy~R5iX%; zj^uR2MHr@e;l*wkLT+>J*7XoxSbYI#dE_WT-4&5SgM}+_b_$yb-++Cs3EWJFHYVZN z2Hb9YDW3DhI;OFo`PDhM)I^}8TKxqKJ;qugzX)#_@E$UN*dv?wXueKqS}5r5v9x($nG)_sP=WRcAs=fbMu|)QUfrL zNpsu^te!-)ev_Ld1f~Eos4}>E=ceab5HF53l z3nxCy$J7jUK4x%zLrpgdFx_9whBa0b-sWOE6lSa%rS~T;AjVqFO!M(z)T&i=RZdz1 z!Pu=6+Jbxm45^OgKrJ6$Esa=!h<*akGEAM#OXX~S9ewFXl7e%mx0NGxEw{fv{>xhdM#j(%4%Y z_`?du@M)5miR7RR8;x_c52Uvjbb+9h-N#szK0CO3wtGGB(g7C9z|c+q?}AOjux}!$l`Sp2`IVo;0=oaK9c{mk0c@DxwPV_-S>gX$JASo2P9~=R9bS|qI4%byY=1VU#a5+BJyKw4BK6(vLiFL* z^C$P=$sFF^sb7#oOnbIk6T#cW`Zl>EYf}CabxjA({Yrl*sMPT18MdbAvi|Ruv5(nm zZn19O{BpJSpNQ@9;;;<{A=>!#7rmC6Nv&3DEUnLMFBUFtJXJ?x$L)8$o)mLT7CV;` zP}#q#)5hqL(sk$Ba(QapDvI05id0#E_+o4T{wE7d3dZp8IsVCKkhoR?_iBE&ZO|=r z0;c5KX5svnT4<$qdR5x?_Ka=4)oI)y#pgQ(dXO@H6C^Jq`X3*?-)K+_`Wr60Cje)_ zj>{H@m^g<)%m6Yv%Jj#{VCwh!AK+pbtaK>dpvXvZ5Z}b8(s<+b{@V@1_QjGL0Hw9N z%2oNz$B;E!72vdiTJgtM%%q``?iKPW^!9~Ou}S)mL_4uEY zD>RO}YAU^?csW+8Xk2k57q2i}@1qD$WtpvY;KJANx}EJTIBGNr>@~<&3kksUHTt|G z$>4mK^$usRamA-0ic7h?A;G(uoPd3OPxCgFnuV-=kj$nZ-c1tV_Lm(}Vb3@luY^kO{^-FDl z6I;EavYH3a#bfSBMUab)CC=6t%W*#=utb58M*=@Lj2TRxw)Uju_w0h{QqO!1BkD+# zPaw<#5tH*UGV0Y>UGL)ZWBWeP94jp3OQ)aIl&}=qXti?tWB_=pLaMRI#Ko#`aKY+A z=}N)b0n#*g07z~tlz%ghz9~Y*_Ed^V}BpR){P_~Ya z$`4cC?@UG}R^SW<1s};Qsp1>TME>i*e^UILsumssI%K(LEER}HApiaZ=-w%@;#`9(% z9i@^hCS~V}YFZ(iK^s^<{aVW!Tbwd+i=Kd_Gr3LZW)lct>>@bgqS6-6P+mU&rY6BK z7tVukQGpN?az6xQP)m2A&Wpl&Jxx2XE}_-o!=02mRZ&@)R|S?0aV+m#J(s4VB*LnZtZA4BuJ#B%lJmQX zPh#khuQl&`4)6|lZ}mo?hTZ-Cm~R3-*x9yNn68|TPwsntaUAJwLvB->_a1ZXiGr-r zU3VJ~dM#AP>hc4_z_dMQ3aCTZ)blp1&fuT9?S#fU8s~cYbSOzDE9H=xW;&{9Bqmjh=j8y#7DDo01sU+Gd89-%+!J3$1>9tU;5`12pvb}DK%q1l+Kz9o!iRHLGYk< zA%{h17_8xm?=l3>{|d1>~)rkPP@*j|^)W^iO7*T_1F>meW1i8LWO=an23M;;aWa)1mb# z7x3hYkiz7c`#YjWwgriQRXT<1Z>ICIQ2u>ZNwcD?nRe8_0sYe#uYJAK#c%8IIHhdx zkOWPnyGNR*%7A~(5i75mcbq;H?tBYvMZ{R)k_&_@=czEDG2m(<0(rWfDD}da|LDjz zNw4S`p0?FB_}z|tA{&O`)C_auHTHp|aj6>NACU09HEoH#-u-c&$f^1JD}3|2`abnN z9GqHv#k8d`(4#bErHe%nTp z08KDy#p4klkjO$zTU>!Jf?z5!nUPjDVNSVnY4d4=-1Wqdz%CrF-c>AAKpXU%7MNa< zhUs)9xxQwvA1D)!JSiEWqO@*YBn*o^`E}8hGqv6g@qsY%Ya_9Z0!_#)q!+_gy^T~md)uR zhLH3p@4KR)X9JeXsVw*AF3Z19(tLObA!R0;XO3F(Xo>&H4Xsb@(<0#etnEUQnYdDd z`MO{o8@JhjlorJxC4Ls(sjsy0!>z3N6q#~!K7dj3-_Mir`u1@8WSIp*rFoc)2qTWg zsf`P9H}IeDXA`N?3G62o11q;sn#Ud;C-->k)&31T{xgRs>=P-D!9+NI!XQM5XF(3Z z2(^q9#;5gaWt|(S0$*-$CZjfP{u!{*?MP$hj!&l@x664q99_ zLua(TAELHNq~BdXgOcS*O|!l6u{f<+um zVIlB?NkRxv$Tha9{fPgqm59y&Aq^)qOYygvQRv)RV_^H!aWp~0-v?7PT5*usx)}I* zo%bJy#fbzU!^0yt1nP6wnz09Fg;%kkx=~`bFyIZhf*yw7_9%-SJIA>~*;{y(1830O zfD|UnC0ceL<#=JDDh8CYn>+}CQe>VU+xJiIQ_UZd7D8h=a~M}6ybGQHKjrSq7K3~D z>k+&nZ3zjZAuHQz|4sWm`RvPG`8`-7C_|+%Pd_q4knf)s!Xi9WatRUJRll> zl-i9!`>e#U@-3!66otUl0uf94moAHuENUCkZY+P@YZm{-7B~9EKI~bKQuSR)*A;Vx zh`-3zO-4R|A5(v@hYlaVDnHb^aR@wogRvwCc0x)qkgv-X^tA~xRH1vjWlswEAUy+~ zLZGJYM-;*tOH(0K{W4rvvCW1+DZNc$a@<|<`;d$xx_JC~iL*HJz)7JVX%=V%)hQXb zK&4a51c&278B0$9@%ZGb%P0{`Hg2hvbIfMM?xT-qV7blE=}F-5gg7_2jwcg1tjpdX zr045`-^ey7IOmX*Me6F-(P*3@e&R6Yrrg3aH53&C_}0yFXD`;(W8=IFTYtEkf%94j!>s#6 z^@9xN;CL56eB)IDZMiP$|LSXNOgEhF$bTs#0fxn(hdydLiBNR8fKkc%B3y{@pox0e zhX6L(izgW`5LX&r3~Afalk(tDP$Up05Y1{noNn zb%XIMv92B0CdWPQfpE#z^#$dL)c=J>1QbePvqX~=c_tOXZFx3xBK-5* z#(;yG?g=Mbbh9hb*sFxtt0VdzY9U3=w+LsHRrR}TrL-96A2==bOvo~o~N66^0O;IBsw zc*;<-Y_Fp}JNhVe-rxa5U0}}@gwbdKhmzJO)f)mvx26=U;Fs>7y$uxLchF0Qa$19@ z1o#0jF;b{s&ncsqmG7$s8o%EiOiaGY;O1ZgCn`N!YG*4}?Okbroh4SOk1HAh-Z6^U zV)iI5oiIvm+nbg&ifnK=hm1JJgtsK)*qO$uwpp6D%@P30R$i(yUQ1@YOr$1bsF~)M zv(jJzrGV9m5tlf%x4iks4J{cw6GVIsqCXDJf3@P(0ph2Uz9l8 zW-#4=ecxY(JY8hQ@l=OaHtDG<3oyqP;Cu2p+IJ9hfy?n#Z$OVWKdpZi|GZObIqWrcHU|*PK=2)c0Me`mkB6Z%O@*ySM#1m1SB8SI4zx)3m+g+ zVhvuM;?3&LqIy=c6zmKAD#aC+6C`KO0k&(13LRCx9~X-C{5a2`VaY-t`jF%R+(0x1 zzw7#s_=3(OB~r@~6m7AMq>3pQaLUA%@1;A(&l9n-MGFYzIRIM$6BvTTaUi3-y9$*a z9ba*;y?3sjY4QdI&6*XhC+fW*^<$_z1(Yc)a5gaspLcDb%tDwNF9 zu)nM5N2(jUa@Ig26#EzZX{48%-x##U0;Z#i9?{6pt3 ztLawe(yU7-TxIYaw0!;J!I3lkug)+t6W;h@wE||2&9}H8-ymd>#S4{>uYPzA5J3B> zPCar28Y|#d>8=%mYCG=6j(F#(Z4WlIqpSNxS6ydopcu!tg*#*6C$Z1G{B39N?sefq z&SkStg7gYbUn{Nz^WnF#QjD$-9J^RyLTH@Ww3@tAw{+h=F*+wtdXJvqWB{bp8#>0S zX(yq~i1f%bi^~XHoG+zbbh?MOPFh5=x z+pJeesb&RT^rLuQK#TFrmQ5C&I>iqv%9hRNVqAN7*?1*^b2S>fX^VJfC~p5qnTE<0 zIAuUSY9g0sd zawAH)-siCY$V}1scbdk7%rUuzoDXI_XEXWLno`=n*Q+@w`Ql#M(EMh4;u&3R8E?Mz zs^Uxql1c%(Xb}gaEK=QY^m>%Qq6lCh-j?BxXfwlB3KkIl0A6 zvIU*(UTuo9QrR(zqHVBvGj-h9uO}(SSEU+x5o-2e!aQkk^YF?n(DJEhwyI8q7lm2r|b-ZZ8cJhIlLU^^qALf~URaIoRvXD3v%(Bw_%nEA6YXJ9 z(k~D51dbyMj0k{sAM7%^+-)x)d7j{8(^DC4`O5&7csM;#8kiPgbQY}2KG zMaR0qc72Ybm3y)?PBjTWx$MWTLThBteCltWkQ7%O!nU$N8Z>_=5`DGYetRrDDY;ya z>}LGs3t02WiafI~cGKSXP{_6mO79)#nAh6lV5jks(*ReHnE1_}GDz9xAd7zZ0ZFPH zrfZ}<3uNk+GCm(!qXBexSQbo(z0m47D-Kv0g}~gSO=E&6pqkQNQi6iCtNRP2x%bjZ?@HoMwMOU1RSE950h5)_K3S?GPO>)S zGZ6D$_H0&B|9kkKi3z;JBTu^(C^Fe(qRx^*8YAYeju#$kx9Vc{5tPuq;n-nn3kgNC z+ID#xAHD6*DZ)lG3ce_|KD_uGp)JgZ>a3hB#*rU`6J9gpj9-jl27vj+mk@$qjM42U z%B0dq`|WA?UoJ~0b0f?DZZRulVu8VphxrG~oxJ4v2z%>*fq}$8L(Ep_ArCFu?Vyjr zD$Xnc=2SNTN}^<{AzmgSvmf2-8o+qhyi zp~aM2(g{BNM$d7Z0f|4X0F6HT?G-zDu+#jO`!WwRtC%~TBm~mSoQ?Sw5@QGVP7Ti) zNvo{j4}t}JY^g;ATS)Zp#;70eSdA2Q=-%;+2+m`!Z*bN3`g_t znxr`ByT$Ky+PrCc2gLq{gH5dnHj%JRB_}()ml4O^T&j}AcGv(Kg@X#5MxjTT*P794 zx={PakMO1ny&SK7Z}Nfsb4Ch7aA<-$0ibs4W3;iwnu}VPw#B-K;zQ9in(U_AqR|Q( z&fNY>3CtnAJp-d4L>>5aoHp2E+_xk{N9l^O&*>Oz-8Mu>`8%KcRV53bl$?9r93a$n z@g1jRv7<-yvdAl3lQ;#}p#!BhsRSwLdob_IX+9#u-L5TG(5RWwYytp$b7j?I;V?as zAEBNZQf53aWW=_fcscDuD5P_`6cu~@d#G+NkCpFqYt>4_mgCtw+q-sLF{U05P`%W^ zf6p(eJd9 zKLK)hRxQmQ-byvx?+McjKs}zg2V{!2{yqh+g3!+4SPDNtUoJyKLsBgSX~D#=VS>md zHr=%*lK}N8>~uw^*NX)&Q0vb`(Sm#u9#*L^vwuMbiYZrvB7I;6vdbs-R7RInG)k;8 z{DaKOLrug`BG&_FLlC_wXfuQMU4!l4-A)R)0!W|v~8EUk=UaR#Wf~`MT=rj z&X{ZQm6KZ73(pEfo(3jmL{c74X?#cckCOU@V09-^390`j8~H2ZWxb`>Gt#|Qm8QBb z^W*N6_RAO7QRFk}Uv@zgD!Gvfu(*La!A0%xvAqO6gpl3rG_rwntz>QOI)sYCd&??L z^PHKeoV5qw$j5zv3UF4jA5+MJsKI1u3Z@-xO(>qDz;q_6`=vgd3#|Zae$)Seari%{ zsYN5Hsba#pC^Q8UDiD5k0+0s)&CrG=l2ltMj3Nm1U@E*oL{Nf6j|0$5Bo{iub4^Hx zua%LimYmtzs{6V+j4{{rrg5WP%T#bh9=vi06S(I5_F`-T3B&Y{af1A$j5rh3kZ-r?FTj zjTgvWvOPNY>E-y^g1xaX$Y`jsjHo=FMz{r}aNM9qD4g844FpVoo1&c6%J+!Q^ia_J z8y!_r^vzFHfv{i5vW$FbBJOeGc2P~YtaC{_!fR$K5)kGSc??o|TL@#Jdz=aL0JysH`q$(Q#=`^Q{TrnUDghfe@yA zu7&x|bcPjqxidlhQJ;zo$)upv;`3W)iV)g0BU<+X+9_C46nSXfX07VJc3q0Hg!c}uEv9-tm@B8S zctI@0pqK?N)bu7CX}OW2*oM~3gcp#G(``3Egr4o=@L5I(@pC6!-RG?#Azh(n6U+X##}*bN30LAKW`*b;AsLl(y>Vkgg=4 z(B(=Bt`ye(w)KhLm~n^O$0CCcG^1sEZEBaaqG!gV5JciixufoPoz|qEQ9=7wH8pC) zSeNm>psHw@;9qi3S0kd~e6?60DbiU9=RpxV@|8VDW-e<}`C|KAg`G`3agD|bn2il7 zLA*p{pXbA*TD&w!*hF+jzOrGs;z-qyJ=}NIj-ITyC;j;j&e&(6$sO;-k41a_(8;m? zcwOFX;|YVD?!0AY5*-h<5TKitKWCo$gFn+Ln;bO;!D^dM(mt>QxW2ttlKSX#P|nU6 zo8i6i5@-4_ExBYV&u|j_$4bMQ*{T#sM9PQubj>ODKBT|;;;PU#`@;C(Kr^?x7<`!G3&HbjyJhMzD?6* z71|}KXNQoO;I`r>i{4!92&d{mDw%l<<{YWN0;yu+SIk)_Jg2c!5g~c>%&1_ize_zT z{(#VvDtW8abJE3Ipnj^vbp!t}2S!Q16>O~~8QZ?{RFqh(7^(3u3-;~Ep zDlE4oqy&gA9K=d?bp2LZ1RoM%79u;6pnB$**j|a4!ih_a>T%md1CpU}a;B~3m2J<_ zE$BC9AD$o;n|W0XVqRo$f-;Y}Fto1sOGaE6VI?wJw&<@H>@Jw)2(u8|vmYj^d^Z0PobOuNibg{$t7n^E`%bE6M#xk3^NJ_Z`|!xew%4Z=)s9c6z+T0Q>0aF%C_M;;;D6Mf1Wbuwsx zY}So|{4KviNuo{71&PJTMB@P8?MSTz=1h$~HDsF(+U;&T(K&KBJI^d|sLv5E1ovYk ze%=#>Qy$DY$FbAs(L^j<|8Wvg@tl7^8e+SL^zQE-9f>p}sVJZF1vC_Pya!0TE40#$ z8Y_E4oEFH!e)jJ^QGbRL4D_Ah4=0%xWAOD*cSp&BmyD%Xml((K7MHXCC<(}5tW?!( z7I^EHie}_`#@EV1)EmxiQ`SykQWk1;>QYV{L`3^8{<-(n1dU^~l8x~p4v5C&a?p=} zVs4*-P9SW&&&$+-J4i^jV^GNFUZa>k-g}jO zhbKGk;@(`pG}n(qg})o197qKCve`+R#RmfQc9>9uX>$&1QvvtdpNvO?571HjHn@tH z55^rR7x=_14H5Y@v~CwdYtx@^!nipDmR$+9!8ag;UoKq1)m5xTj_Knepq+|GK_@Bz zR?r}KA;*=Sqzk4F$)v0)Xf5k+hXj363NeYh7yi`~V1a;Dnfb8($F_7_PozKSj)R`E zyrZqFi$=1_8h;H5*{LB4{6k>N58~Ty)XqTdK*F|WYq51Z8qrDIg87vx5Hmf|HuahI zL``z=CMYX0W1DtNl0usbEY4LB+*2T>sV+Obp?RUs6uM`ryipQkw8}^pdlw&X`FBot zoeYFn8G|RtMGaViYSGwFZf8$tL+acr{;Ka=Y>8C%gZj<5CyGIMzp1~F=e`iM)Ov>P z-^y57L$ELq7L*vy2oe{L(rZCVhi)Xtbm^hMGAO2>F$w>I8Oq6?)Q~Rz+3T`%vgF9# z8`j1g51=q(zo};NmtAq2Yf*8NZx-s77Gbiw3dFRkN|J7!Hn3a@Lcn@~jok-J-jkN; z?Xnk4C^Y3FvWhBbuAbbPc}kTwCFg2555^*(zbPhEJ@I^m1X@SeH-Sg0trq2bzfZRb z>itZn2)ffhlUU7NP@-Uug7DC8n77wAci&4aeeYeM#y3d0QeJ)3%ez0-KniWI_AfUM zFyjX?&V@!0DuY#2oA>9lM8l7+>sVcMI<0~O2if&G%e!*wM3wR*elG7sGnDX}^8nNp2`FQBIe*0^Cu`$!g~bHr2Pgr%DuP9U4YN`L|E z^#O`qZ4aaxg&~_Ah@W)H*x$ER=cl^yVbZ%4hUetQQFP$j`&triVCK`KfC5!(DZ!px zxmuFAB#Wm`Ct^!1-m1ySr<-F^!UW@&$|P1kH&xtjguA-^EjLWl#SO3tqzcuDm~3Ou z8U`yFwBM6)h?*O*&C5tzvTAd?Eh$+#e&gQ8&;Dt}+%_gTf1W+MVp~119|w*hAh7WA z&UU~LLsTF688w?yQt-|I5exmm1e^(s-+8b+eCYbqZ?Gg=zBt;$X=GOu1zfRk6RT|7UnQ8*f9M#{o-mr~ z;H4OE8^`^6BDvl#d32quMdUCK@g;C-Bb#iqJxV(zkBpD?(c5@m$UI3OgS1U|xd?Ml z7J%mozUcUk*|;e`D5(+0J0tUv_rg`)M;dirFC&RTlTBVv+jpvv#cV5VW_!D6crPf@ zM%}mpuX7UVLkk;3=^{>|l50_e{X;yIJ6#9r$F86(Lc-npD*xt9^Iw?O>bl4ot_ncz zTKsff&SrXZ(W>IJPv7_KisThrtoQR*q>I_QfO7<^9q6oI^{t)JB|f$?8I>dG#tHti z%?Iz(pq<9b*cFBebZ7?|t#_5o)`DA6bpD=f}RNu2&_w00b5 zd?fmhjwcpHu9zLRByiuaPc5Hfl%IsT%vbl*J16ROCnNM9-Ar|IrdPsvMl|_KonQ%) zo$zNbxe=Vz!{wq1XW=kRve9F)wpDP`bU|JOULup&6O0N1u(h7OL@M37L!&Kg)m}h$ zYp!{x)Y)$$Bdt+Dh2M`@(?odB{GeGRBb&z^18Gt215AzKcvS@_XbbRTZ{%Y6Jj4SV z=*vpOI4Xu}--1i><_FDAyverv=}zJM#=gR8+^V5OozEaA26yq2Sq4V_mVJt%EP6AZ zou-o=k;g_`=hXllh6%86IKo#J4`ulpIVwQW8yQ-@T0t^`mwIHd|Cf-{yGqm2#UD{m ztn@CrFQ1@$rxJ0$X*o0fUFJbcfo3Jxf^6L*vBSKLw4o5jzMi)ejKj1wgQq-nu`h9L zSvhz7Ink~;+a!gM z>xjs0`^jgZKH0ZHpWxU0Z^T}zQZ@#YzX0&+HTrRxTV6EFl$PWU4@lB!I*Mj0i(IaY zLP!~5A}UF$88oNV{>CS(gj-|K2&1O_>XNx}Z?A=_x%biIbXxR-a#q_QFYsnmwE)p5 z|BR|!Qfr%Q;J&evJJ$i*t5RIgfeFMr^NtK5xa=0D-VE+;aH<+>)-73~#UinkLq(+b z1NyR41N10eOu(x7OZWIQGKG6v04m(6Gl4N#mD))naqY=?eQwLOt=s2wHmUR9GLMed zW!3zpBsC9!to_7-fEZppKE(Ag!7ce_4PI`bB8!ul`<$%G7sLp<_WC33yHDTB)CSgd zLhp9zyF+`CLJYTDcW2#z-IEA_i=9f4mgaqCgC|zlfZ>*dsR{oL1EINZ!w#WS^kgyd zu>lAxzh|$y3Qnnd&$ItJ1Ztng4anB#;ug~jzpYu7-^L?K4InQ~$ z71@u@&Pl&h$a;-|zhq%L<)uEm?{$vF{t^;XiGxL(rSg zz1uYIjJTHl;p#VT47H8$piC4^GzW396$if7U(Ma-4Ik`ZOmJ!Lf15j402ZxHKbdur zkZ$z;MeLKhAKU8pAA|S_H7!7yx@6&eGtm9`t<-DB@EDHRa|8$%=G& zA^~}ukCxFEB|U?vF%J1=045KPeQ@7|49VH1WK?oXX4&D0SNfd3tNqlNx*XSd%E36G z$k|fN`xYw4@TH@L_mFP&YbHH?ZAgue?Q%%sd8E&q84vBZlL68(yG-A7@6E#=AAYpTubNZ!iLpO~m|D5A$yeZf;L}zT} z;n0Ad((d9vgdE52;kI4`5B`wvO)TQ0EwYh%!i#5ubxi6)HXpX(E6OI1G8WK2NN^wn(BG+lb;oN82oJ_Q2Lx$uRjs1xYM75xjn)fmv*~LB$%(gtA479nhPRXcR9iJY`OH z<7z8mBLw;YbB!lRpo?d8W(!|Q5>{!m0`1QX;c@=(hL%ZdY`YW+QAB_aLm#U!ftI2Ey{ z*?_Z%5kePj<2r^eA!hyB@XfMmTBA?x8yZ_d4cs<{rH4UJ9UHdh1J!YXU1aTt4Gm2F z*9+#_Ghz-rRD(n7Ub63JaOdJ+*z6M7{Om?44~^Y0(we!}>+?Wd{TyWXk2x(~EA7v^ z!q3cvVZ9?g2IePfQX5KJee8MyVZxfF-@tBdOs(se+w5D4((L8G@E(dxw9k2Yvu$2x zOGVbj7%QQZJV?f3Cdn4OL95#8Sx3~8s@(5aJuj6w_Z!#CRVk_Z>jJu*ch`wYX@y4> zJqiWdGG!4>-Zofv69v;=@v#bYug&9Z{~lGzqk{}d_rhOiTdTvfdsbahvv zz^k6v-~sHDpzvOe>$Wx@2z_>yF@TLp@oym~v85R{^SJK{rykmN`X= zg>&ORR^_;tsISFhiqRVy_r5*x1HzUTMmyKA)>;-~JsFt_6<)>VB@@bYE6_Ti)q(+8 zIWCe3YVFG?Qm&AL{upl`4v>2y8P$5Du34nG>AU(w5quaC0kF0(g1_Nf>`9H0d{7Vm za#SNoda@raE*rabh7<0ZI$9SrmNp@1S0hm1lzoG#7QTRZw5z5>=zk5O#UqrHEoKM6 z8!Z^ym^RE3V9-x%V@gdkE+uW%AZn2WMn8>=V%wSqpJIZ**(JW<pWsXy(#8&k>rX>uD8Ye$h9@E6U<^R9kSig&mYa2 z%h8x~aPR>){|E;Exq<42rl%s`08^bLMA?3&`1_Ya+-7JsAdG|oSe|@2{(jg1R`k(c1jk+ihi3p_wQ9@3S&c;-?4zvnpY-1I z5k|s)rT-?l3Q!py94EPl>--%K`EUF`nM;65*^ziFF&2qBNbV`Jgpq>(L+ Cursor: try: index, time = next(self.iter) @@ -75,12 +104,12 @@ class BackTestEngine: self.iter = zip_longest(self.range, self.span) self.cursor = Cursor(index=self.range.start, time=self.span.start) - def go_to(self, *, time: datetime | int): + def go_to(self, *, time: datetime | float): time = int(time.timestamp()) if isinstance(time, datetime) else int(time) steps = time - self.cursor.time if steps > 0: - self.fast_forward(steps) + self.fast_forward(steps=steps) return range_start = time - self.span.start @@ -126,6 +155,7 @@ class BackTestEngine: if self.config.use_terminal_for_backtesting: tick = await self.mt5.copy_ticks_from(symbol, time, 1, CopyTicks.ALL) return Tick(tick[-1]) if tick else None + tick = self.prices[symbol].loc[self.cursor.time] return Tick(tick) except Exception as exe: @@ -217,15 +247,38 @@ class BackTestEngine: @cached_property def prices(self) -> dict[str, DataFrame]: - return self._data.prices + prices = {} + for symbol in self._data.prices.keys(): + res = self._data.prices[symbol] + res = pd.DataFrame(res) + res.drop_duplicates(subset=['time'], keep='last', inplace=True) + res.set_index('time', inplace=True, drop=False) + res.reindex(self.span) # fill in missing values with NaN + prices[symbol] = res + return prices @cached_property def ticks(self) -> dict[str, DataFrame]: - return self._data.ticks + ticks = {} + for symbol in self._data.ticks.keys(): + res = self._data.ticks[symbol] + res = pd.DataFrame(res) + res.drop_duplicates(subset=['time'], keep='last', inplace=True) + res.set_index('time', inplace=True, drop=False) + ticks[symbol] = res + return ticks - @property - def rates(self) -> dict[str, dict[str, DataFrame]]: - return self._data.rates + @cached_property + def rates(self) -> dict[str, dict[int, DataFrame]]: + rates = {} + for symbol in self._data.rates.keys(): + for timeframe in self._data.rates[symbol].keys(): + res = self._data.rates[symbol][timeframe] + res = pd.DataFrame(res) + res.drop_duplicates(subset=['time'], keep='last', inplace=True) + res.set_index('time', inplace=True, drop=False) + rates[symbol][timeframe] = res + return rates @cached_property def symbols(self) -> dict[str, SymbolInfo]: @@ -257,18 +310,24 @@ class BackTestEngine: if action == TradeAction.DEAL and current_position and order_type.opposite == current_position.type: res = self.close_position(current_position.ticket) if res: - trade_order.update({'comment': 'Done', 'position_id': deal_ticket, 'ticket': order_ticket, - 'position_by_id': current_position.ticket, 'time_setup': current_tick.time, 'time_expiration': current_tick.time, - 'time_setup_msc': current_tick.time_msc, 'time_done': current_tick.time, 'time_done_msc': current_tick.time_msc}) - # ToDo: Create a deal object here? - # ToDo: Update trade order with more information? + trade_order.update({'comment': '', 'position_id': current_position.ticket, 'ticket': order_ticket, + 'time_setup': current_tick.time, 'time_expiration': current_tick.time, + 'time_setup_msc': current_tick.time_msc, 'time_done': current_tick.time, + 'time_done_msc': current_tick.time_msc, 'type': order_type, 'symbol': symbol, + 'price_current': current_position.price_current, 'reason': OrderReason.EXPERT, + 'volume_initial': current_position.volume}) + deal = {'ticket': deal_ticket, 'position_id': current_position.ticket, 'order': order_ticket, + 'symbol': symbol, 'commission': 0, 'swap': 0, 'fee': 0, 'time': current_tick.time, + 'time_msc': current_tick.time_msc, 'volume': current_position.volume, + 'price': current_position.price_current, 'type': DealType(order_type), 'reason': DealReason.EXPERT, + 'entry': DealEntry.OUT, 'comment': ''} + order = TradeOrder((trade_order.get(k, 0) for k in TradeOrder.__match_args__)) self.orders[order.ticket] = order - del self.orders[order.ticket] + deal = TradeDeal((deal.get(k, 0) for k in TradeDeal.__match_args__)) + self.deals[deal.ticket] = deal osr.update({'comment': 'Request completed', 'retcode': 10009, 'order': order_ticket, 'deal': deal_ticket,}) - # ToDo: remove later - self.to_json(osr) return OrderSendResult((osr.get(k, 0) for k in OrderSendResult.__match_args__)) if action == TradeAction.SLTP and current_position: @@ -282,33 +341,37 @@ class BackTestEngine: if res: # ToDo: Create a deal object here osr.update({'comment': 'Request completed', 'retcode': 10009, 'order': order_ticket, 'deal': deal_ticket,}) - self.to_json(osr) # ToDo: remove later - return OrderSendResult((osr.get(k, 0) for k in OrderSendResult.__match_args__)) if action == TradeAction.DEAL and order_type in (OrderType.BUY, OrderType.SELL): check = await self.order_check(request=request) + if check.retcode != 0: osr = {'retcode': check.retcode, 'comment': check.comment, 'request': check.request} return OrderSendResult((osr.get(k, 0) for k in OrderSendResult.__match_args__)) - # self.to_json(osr) # ToDo: remove later - # return OrderSendResult(osr) + price = current_tick.ask if order_type == OrderType.BUY else current_tick.bid - # ToDo: Cross check this values with actual values. - position = {'comment': 'Position Opened', 'ticket': order_ticket, 'symbol': symbol, 'volume': volume, - 'price_open': price, 'price_current': price, 'type': order_type, 'profit': 0, 'reason': PositionReason.EXPERT, + position = {'ticket': order_ticket, 'symbol': symbol, 'volume': volume, + 'price_open': price, 'price_current': price, 'type': order_type, 'profit': 0, + 'reason': PositionReason.EXPERT, 'identifier': order_ticket, 'sl': sl, 'tp': tp, 'time': current_tick.time, 'time_msc': current_tick.time_msc, 'time_update': current_tick.time, 'time_update_msc': current_tick.time_msc} + deal = {'ticket': deal_ticket, 'position': order_ticket, 'symbol': symbol, 'commission': 0, 'swap': 0, + 'position_id': order_ticket, 'fee': 0, 'time': current_tick.time, 'time_msc': current_tick.time_msc, + 'volume': volume, 'price': price, 'type': DealType(order_type), 'reason': DealReason.EXPERT, + 'entry': DealEntry.IN} + # ToDo: set time_expiration based on order_type_time - trade_order.update({'ticket': order_ticket, 'symbol': symbol, 'volume': volume, 'price': price, 'price_current': price, 'sl': sl, - 'tp': tp, 'price_open': price, 'type': order_type, 'time_setup': current_tick.time, 'time_setup_msc': current_tick.time_msc, - 'volume_current': volume, 'volume_initial': volume, 'position_id': order_ticket}) + trade_order.update({'ticket': order_ticket, 'symbol': symbol, 'volume': volume, 'price': price, + 'price_current': price, 'sl': sl, 'time_setup_msc': current_tick.time_msc, + 'tp': tp, 'price_open': price, 'type': order_type, 'time_setup': current_tick.time, + 'volume_current': volume, 'volume_initial': volume, 'position_id': order_ticket}) pos = TradePosition((position.get(k, 0) for k in TradePosition.__match_args__)) order = TradeOrder((trade_order.get(k, 0) for k in TradeOrder.__match_args__)) - # ToDo: Create a deal object here - + deal = TradeDeal((deal.get(k, 0) for k in TradeDeal.__match_args__)) + self.deals[deal_ticket] = deal self.positions[order.ticket] = pos self.orders[order.ticket] = order osr.update({'order': order_ticket, 'price': price, 'volume': volume, 'bid': current_tick.bid, @@ -316,7 +379,6 @@ class BackTestEngine: margin = await self.order_calc_margin(action, symbol, volume, price) self.margins[order_ticket] = margin self.update_account(margin=margin) - self.to_json(osr) # ToDo: remove later return OrderSendResult((osr.get(k, 0) for k in OrderSendResult.__match_args__)) @error_handler diff --git a/src/aiomql/contrib/backtester/check1.py b/src/aiomql/contrib/backtester/check1.py index c1eb3b9..b12eb33 100644 --- a/src/aiomql/contrib/backtester/check1.py +++ b/src/aiomql/contrib/backtester/check1.py @@ -1,9 +1,10 @@ +class Form: + rest: str -def add(a, b): - return a + b + @property + def rest(self): + return 'rest' -def sum(a, b): - return add(a, b) -f = sum(1, 2) -print(f) \ No newline at end of file +g = Form() +print(g.rest) diff --git a/src/aiomql/contrib/backtester/d.pkl b/src/aiomql/contrib/backtester/d.pkl deleted file mode 100644 index e69de29..0000000 diff --git a/src/aiomql/contrib/backtester/get_data.py b/src/aiomql/contrib/backtester/get_data.py index ecfc708..2a0ceea 100644 --- a/src/aiomql/contrib/backtester/get_data.py +++ b/src/aiomql/contrib/backtester/get_data.py @@ -31,7 +31,7 @@ Cursor = namedtuple('Cursor', ['index', 'time']) @dataclass -class Data: +class TestData: name: str = '' terminal: dict[str, [str | int | bool | float]] = field(default_factory=dict) version: tuple[int, int, str] = (0, 0, '') @@ -39,7 +39,7 @@ class Data: symbols: dict[str, dict] = field(default_factory=dict) prices: dict[str, ndarray] = field(default_factory=dict) ticks: dict[str, ndarray] = field(default_factory=dict) - rates: dict[str, dict[str, ndarray]] = field(default_factory=dict) + rates: dict[str, dict[int, ndarray]] = field(default_factory=dict) span: range = range(0) range: range = range(0) orders: dict[int, dict] = field(default_factory=lambda: {}) @@ -48,6 +48,7 @@ class Data: active_orders: tuple[int, ...] = field(default_factory=lambda: ()) open_positions: tuple[int, ...] = field(default_factory=lambda: ()) cursor: Cursor = None + margins: dict[int, float] = field(default_factory=lambda: {}) def __str__(self): return f""" @@ -74,7 +75,7 @@ class Data: class GetData: - data: Data | None + data: TestData def __init__(self, *, start: datetime, end: datetime, symbols: Sequence[str], timeframes: Sequence[TimeFrame], name: str = '', tz: str = 'Etc/UTC'): @@ -89,22 +90,22 @@ class GetData: diff = int((self.end - self.start).total_seconds()) self.range = range(diff) self.span = range(start := int(self.start.timestamp()), diff + start) - self.data = Data(name=name, span=self.span, range=self.range) + self.data = TestData(name=name, span=self.span, range=self.range) self.mt5 = MetaTrader() self.task_queue = TaskQueue(workers=250) @classmethod - def pickle_data(cls, *, data: Data, name: str | Path): + def pickle_data(cls, *, data: TestData, name: str | Path): """""" try: with open(name, 'wb') as fo: - data = pickle.dump(data, fo, protocol=pickle.HIGHEST_PROTOCOL) + pickle.dump(data, fo, protocol=pickle.HIGHEST_PROTOCOL) except Exception as err: logger.error(f"Error in dump_data: {err}") @classmethod - def load_data(cls, *, name: str | Path): + def load_data(cls, *, name: str | Path) -> TestData: """""" try: with open(name, 'rb') as fo: @@ -112,12 +113,11 @@ class GetData: return data except Exception as err: logger.error(f"Error: {err}") - return None - def pickle_data(self, *, name: str | Path = ''): + def save_data(self, *, name: str | Path = ''): name = name or self.name - self.__class___.pickle_data(data=self.data, name=name) - + with open(name, 'wb') as fo: + pickle.dump(self.data, fo, protocol=pickle.HIGHEST_PROTOCOL) async def get_data(self, workers: int = None): """""" @@ -192,26 +192,16 @@ class GetData: async def get_symbol_ticks(self, *, symbol: str): """""" res = await self.mt5.copy_ticks_range(symbol, self.start, self.end, CopyTicks.ALL) - # res = pd.DataFrame(res) - # res.drop_duplicates(subset=['time'], keep='last', inplace=True) - # res.set_index('time', inplace=True, drop=False) self.data.ticks[symbol] = res @backoff_decorator async def get_symbol_prices(self, *, symbol: str): """""" res = await self.mt5.copy_ticks_range(symbol, self.start, self.end, CopyTicks.ALL) - # res = pd.DataFrame(res) - # res.drop_duplicates(subset=['time'], keep='last', inplace=True) - # res.set_index('time', inplace=True, drop=False) - # res = res.reindex(self.span) # fill in missing values with NaN self.data.prices[symbol] = res @backoff_decorator async def get_symbol_rates(self, *, symbol: str, timeframe: TimeFrame): """""" res = await self.mt5.copy_rates_range(symbol, timeframe, self.start, self.end) - # res = pd.DataFrame(res) - # res.drop_duplicates(subset=['time'], keep='last', inplace=True) - # res.set_index('time', inplace=True, drop=False) self.data.rates.setdefault(symbol, {})[timeframe] = res