From 2e45c6b67b0dbbe8e0711019cdc1bdccf93b785d Mon Sep 17 00:00:00 2001 From: geoffsee <> Date: Wed, 28 May 2025 19:43:36 -0400 Subject: [PATCH] enables deep research --- Cargo.toml | 2 +- bun.lockb | Bin 504218 -> 510752 bytes killport.js | 51 ++++++++ package.json | 4 +- packages/genaiscript-rust-shim/README.md | 3 - packages/genaiscript-rust-shim/bun.lockb | Bin 3144 -> 0 bytes .../genaisrc/deep-research.genai.mts | 112 ++++++++++-------- packages/genaiscript/package.json | 7 +- smoke-tests/test-deep-research.ts | 43 +++++++ smoke-tests/test-search.ts | 43 +++++++ src/agents/deep_research.rs | 32 +++++ src/agents/mod.rs | 3 +- src/handlers/agents.rs | 3 + src/routes.rs | 1 + 14 files changed, 245 insertions(+), 59 deletions(-) create mode 100644 killport.js create mode 100644 smoke-tests/test-deep-research.ts create mode 100644 smoke-tests/test-search.ts create mode 100644 src/agents/deep_research.rs diff --git a/Cargo.toml b/Cargo.toml index da9f138..af79aab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ rust-embed = "8.5.0" bytes = "1.8.0" lazy_static = "1.5.0" sled = "0.34.7" -tower-http = { version = "0.6.2", features = ["trace"] } +tower-http = { version = "0.6.2", features = ["trace", "cors"] } anyhow = "1.0.97" base64 = "0.22.1" fips204 = "0.4.6" \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 1b99e399a19423a8c5c0064539cb2abea25683bd..97e3aa918028a4ea60172afc78d7eb4a6ac4f52d 100755 GIT binary patch delta 114663 zcmeFad3a4%|2DqQk;B>MS%RR(2*=DxBspech@qy021y)}BlAFFN>tTQwCw7ltyZa) zXsW6MTAj6MwNxoBE!7s$v~)03)qCH2tsQAE&-3*CzR&mi{qb`yau+Ko+FwEA zXU~eUjq^Lc>Sq#7%goC5W@T&IL*O+vt>9Z=CE%Ap9hm8jOF*=iXp?*|!nL4xw`*F( zGU<0fuMYkkure?qD=RxM-K(t!XS$u`Wd0k#O8F3a!vZE8js!u#l%&+8l%%Ze2cgq| zo8@H&1G$@kXJ;iR#Ut$sL{G^S>Ep`hxw+})$&ct>OiOu;e8+tngwKr<|v2;bwMeNe_qAwK=#-`#Ir{>)|U7) zn#~HrkePj zAiMYpRY5CsExZ0!4x}NqVK|2- z8$&~$|1CU@Et`niVMD=rAjfP}u()``yR7t&!O^yY;7-y70)gaH(lT91shaj4;!$pamEYnoL+3~(Wu?XYyb0M%pEe^^ zQ~C0>5>!9~Cwt>_rlJ8US!{-;JqDe=Hma+PpOWSB=4NNc9Ra7lAIJv!veHtgBqe*- zp+i_scUVCmY~_{}HwNcOGzyV?9%eOtduAFvFkjPha-=V&yE47mnR(jWP+5UwnwIX$ z$noZQweHBgS=5$S7yp8~?a3*PS`UBEK%FmxKa zzNhrfz2Gz?FD@k+^=n!Q%%<=C)=L)r9k4ohW?Fn&c4tjHf_Q)MnSErs27TppcLM3u zSD@2?n*F4qXTh1jm%@$;n*(V`0eNb-8U z?yg-ll$M<~t+Tdxq%pHXqo#{d9P2apzA|WSf$MZ*SA~}O%g4xmdSkTg{~BXu>EnQv zk!>zIk;*|-~_GZvIl+`5W7i@P*Z>|AkS2vy{4X6!dS6_$D4CjFC z)1yE(G7m#r1Na$`osoft@e_r0nS2M3zqNe?#^kN_SpBX-YK&N^c$S$_d8w=2K zT0UK&bvAuETed{YkrgyXd{v~|0M3=pOy^31u>Y@F4(tuZhwV^)^WWg(d^qov^R$B6OueN%Y z?2+ZbiqH#yEWdL;0vrN!E@7<7&5;FOn=KQb2B(4V0Rw^F%uMX)-rS>eWxnkyegPW7 zf)jvEfhEXKpO{-9F$2hkRh}oyKY@6bn|}%|q9q3rL5p)>c|+jpdu7*`n=gCDm*vgE zMA4GL0}$WxKDkm>1G39ULnpRcAbV&j^3#CV!5aY2g42LsRk=Js#U*Er*UDimcp{pr z#(1E@XoX>FY+VZPTOJciBGjxS0FqBzC4F|7%Fs`tHF*+}v*7ib7K3#3 z=}(kl?*eJSs|q&=$^BMK54Z--@_z!F2d)c^Q`Qv=k(SCd;J|Qa{4CE}G5|?EzVDpfW zh9xAYrD8GHW+?vild`8$!D-M#>*Nrf19EQU18V@)X+xV1&UD?^%XA58nY2SoNJ}%$ zRI8J38Qvc8?0}{~x`0=eZ=E*MGt&~hSy@_q&Xg%U(%z%ut)p#fPO2{lYre(fvf{Af zYTCyeWxd#wGt+XWdXrK!a*{H=nGw&LBbQ$=(IE|C|-)&mMlIP&U-s%%>w>hi)CEU)UlWb`!{sO)=x)gQHc&eSz$`&I+3WSy3&8 z4YvVxBd122{F&Qi zlam!jz9=n;17{Z`Wx32}x_aAXiI@eGCnsg5uL5Ti<5Kfd;<6JG<1^zhMw-_5C7Ess zkX?BK$aFK3QnRwtQni&Y%kmcjQGOd7gr?#lEJd3Np$-yG@xoXPUfe5kOf09H{jxEr zW~2NuD*v>cWV(XpO^u6B_Dsd!aoIROX5q2H%onfX`@Uujs?}~>Ur_ejqd*p)lbW7{TO@6{;`3GVu?jQe zX1L0McU6yoU#Z-KMCSKl>0t<|pk);)4jdJ4#HSp{S@ixtiV()w&5 zv-=cI+GBLD-N>G@*BDp3QPZXS1HSP8;{m*l%IiU7G|Ayc*B(* zmzDLDOWI^z3M3+(j&#`vWN}l0>|$#=S!k}H(5(g3T4}{6vN6_5tEOLm>4J0-hj`lc zHIUQoGawCnw(RH3xG^N4Okx-rQ)AM`E1zzr%Y?| z3$nc_>D+v5r=^+0flN@k0v4(vL^>DN3F}dAmMj1d3E9Z4X;%82GqU;Pf%L;9#fJjf z4Ih3h`<4DSkWP$eNpoIX26%J5 z32{g__y<{G2(T8?wFjE%`LyUt$!Z2(8T!K|vH|IF*@-S#TMv3ZBPt@mmQ6{Tnu8@v zJN%<;`A-*QPsGAf7HnYb0)Saq`_obJ$e-mAxHGT`^x8oB!sScS7mg`>4M<;j5=h^f zuQ2Hn`k&4*0)juVJFp(GIj}CUs={j*Wfy*{@F0*r^18xJ3I(tR^dncL^IA*xXy}}! zm4BBzz}MF#|Lhw2pL1eA1db_=CsWZd&HjfRtDmn+{6^s?K=#BNKvqyb8#M z+zVv7bYM+lavU!RQ(D20>fks^vl=bWI3Ccd{*0S4wPju%q++gl<&FCFTh`iTx0#h~ z0kRcO+HJhGqeNeprg1YZPhoRC}uFD|FinCAFSi9b*X0E z)@3%3?Mlju%gl_+)24uPAxMv#mPWTsPVy2oSD@_hR1{A$O{$mp2 zIiS8I^VFEH&2J({{CyxjAy@HuAP3-=#?qy6)^o+jWqHG)v!9MOlIeMmNdq=EmE}CD za4C=##UeiqY5=6m!mXxsLi%dpmAR;=r%q)*X?B&sm+qbFf>MkM*wT1xCcK~@w$deQqu__`!%%8dL> zJguBkUD?+qyVUBD=5QtUK$bUovNzM~H79YhH*a-2nJyXMO0w&%Nm~&*7wvk;$F8oZ za7JQMLL$;xPt(6S!&wC|mLXkjvH_Ajd8%D>0qRk$-176xBK#OBy$_ zFX&_xHg1{k-&LAX>XOLCY7-QW?Iz>-$jQ$~;M_v2Cr;d!ah$a=D!p~%J_MYeXx&5i z0q0th0Pjo2FJxj|v=&@n-3U;4u%}Eg z7sxUH5juM^ua}%niO@N#qJieJ*ITBGRJ<#YKGhfb8UPogBJRhp0oiw+zS7`l!0B`8 zzyQu7>k*)4KRFGp?@_F$T#5gz=(HY6t*2w_A=G+^{L8~A*H`Q5 z)q1M^SNHJNjc`lT@>^dRTi<9~Uo2bS16$v4TVFt1-*j8w2lI>SeDfrN0LRYy!r1yk z+4{!W`lj0Y!ujvtOk3YzTi;yc8*1}_V12LqZ@w+fH^HlX3 z*~~GuT4H^J{r7LYtrlB7V0}+)eV2dhD|_^RbF}>L-`W4G@9M1nnKcEBE{J(e+JXfc4$_|MV+$tE>OccI>V>-C7gzxH5#<^7+&S{I{i znhOQZ05$>s{i}A%X{}R=br?{GhWygwhjluzjv>}D#yVB}K1J>o*6G1IrdY=u^SA;7 ztYeUM?6FQG)+xq1b;#2U=D&3=vW_d(xyU-^Sm!0{xMLkxaO-BSfYzHSSl!Hr!}n9= zRxphZeE94J=Zb2bFs(0uH$ykiSDESZL^%$~bM+cTaD{s%L#~X~Gi~M*NqHcb+&`cb zt%t$M-eeqaH0`BTi4_Z5TW6{i^)Tilhu1{;PrmSMc`W?N&@2xqzBc1>() zW{c35qWFGhsh4tUR|>`Z4G)}cp77qDEMxcxfBg_*dz`xBK6AK+jmqYzNBvQZ3}TGap*tZ1{$H99M8G z8ezDi!W@&Z1jtY@_S*r}oEZqQCBpW#y#u?z`5~0ye^EMNs~B2Vu@}@df`@w?=Mj-) zxQ2&0?#4zuj3N6|wTxm!l|YCwN}|H-{c9V(5gz-V+D0LuX&s|@gvU7#8}i*{i*z1_ z(!W$$w^nyzPhpaB#2(+wVqKt(&LE4yh2-H z&>DZkH_BuG$=@`2Xn>}THcj4ukWBGwfZ-eMakj;wVN$6D=nDJN`bP0+kNt=GM(`Mq zb1V)S(PiTuTcLQ3lo4U}+6|3jBpHY!<+#5j*#Kn(ljt^_O*$Y>H!==}_<dLlV?6ewjg4YJ#U@7Z zIFIA*COEyC3AZCO(G1nR3t!rsp?L_6HbX}dlCfQzn#RCG`Zv?GEHic|LP-qSn>MGX zIp$;6OfaLqN64(eKA?pW9P4qcZJ}x5hATGAe!PWI2%$ksxR5BCXbX2D#L==F9b?`4 zPU>I|<5Fsft(8$Y!J|LgN_H7E3^T|8vy!kNT1T(7w`LcxtL{Z;Dnq(G*z%2zyF&ax zJgnZa0ii5&(CfA_iYIyOd2Ni~IFBCOR@0`NR&0xL>j%KnEoP5!8O2DFfh~=rQ^Dvs z&aLkOiv+V7+s3-}D(&P71Gdp^AKcC;j`!#fLmXfxxfJDg{sI;bCQiRy&YVVi`}Vlw zm+^6Kdscg+IKgAz(%uN3?9tC4u1jfLy$(hp!~v*&6vT40z_ASsefoJgPVGLgNAJ;5 zt}!;_64sbJFjj|^Y?NF75{z?LGcLUw;_RepJwdS8!1U>0Dhi9^4lvfMnM>slV6u=) zquqKC)=4f~GT#I+#-X|dx8qT;{zgecn0^YO5a^hcW8HTDE`~4BqYp)yx0-Wr7o#}Q zV}HGi5uD_)|A-`j`dy7eKx|i|ILV{0=&EU0QVS}Yi}YzQY4N3BLu}oQLZ3&U1XEZ~ zc{9aoFfOou#-$N%`={Lu-!zY-o7?o2X<_;tga#uTPBz(XcZC?i$sYS-A%+idF2pEI z_UQFc9eN2hatI?sjo=iIeMzX{1H2b%6sCCeD@ei)C~tI3aXb2;zV4!^K3td~=yLSm z>TVRKdi1JTzGDT?im;}Qy#BE<4X86)P`bQA)hgD)ADxf!+K^o8_+z3wh*cXNy zzI2cNHsZ|A79H=gg*XvpVdaf&m@@7N>3a^55o-&vMHs#ekK-$fM$yJFdrOZ|oZ-=v zu>rCK2b-tw0viHm4w7EJhxBZC$I1{tkU>TfrfNYCBRI?BI0_-sD2WNv8(|FSDkuX( zJE^BpoaND9hj_Lz^du**En!3UfVr34~j9bwQAZ zV*$cm{v{Zl(T`d6=BS8F<1pJNM;gU>9(@-?StUFB4=`8@=gXK7;v6VP8Et~2<_r>dRMfI>0vOc%LC(Jg*E7buf=nGBQjLjgot+S-PGNHr%WW)5P%! z;|!NKOs|6lnjMPSg}EL}X6hReLQm1QShwQ>SUV#H>6_!!1P^0}T@7)9v;)EHzzFXi zX7~y`dSz5YuaV1VBA7H81MOG`)}6kqe}NE3sk)Id+U*D%p=lG0lDIH^6GE&P3t@^| zuXwlBd=B?ei;0dsFjc^42`tZd>!-jlG1xV5p}>)HI-{QvH&QV>*71(B|TlxW_rQAY87IAV-4f){w~?M53uK-y@daDm6M ze>D4t?Yhbk@?a&!fVCVWr$7Z`+hZY4MPNphTNhv)e7WQv0^=acC9mOF*)((2(Wii^ z0mkHdW~@=X5KHS=BY2U=J~-O&0hUA?g@E^>jbcFi7$bPG$G$km@Bt3S7=?>Hdd+ci zC2)$4Bhh(atX(?dY%tDLtQqk17seTdOFa5DCCc5~HQq9pJvtSPUSqb>u@x-BNWo(K z140~aOo7F2d-HpY;H4gi58i;I&C)P?(LF}tQjhM5m7`;hfSwH|^Khwr4vgcEtvKDS z{|rVmD~N5qVDtpJ@k^uUf-xUhf?IzZjNX7Iq`LK+U~n)pOq5|0jpF4V`y&&L;0HbW zv59g)fu}5R>#ZlL<(Dq3d%;+WoM0O!nfZz*8NP=+dT5+A4BL)|I6>qZg|$IHrJ~Rs zv)y`=c-%6h5RBzaw<89ur{Tf^^nSciyuzbbO0ZTCZr`b3?0WPVJbZm=9GAs!!Dx-m z=;(FpO($DJMs`mrqrX3Li=p+ufnmZTUj|a9dF9C!{e&7m0Fx^<{j=5-=@fFV_5owB znJcH=m|_I4^4LG0V)#~hbl+5K)@(Z#Vw-9dL+g?#J3+eX+*@p^+p!m{uTionOs|(@ zwE~{w91TX#F&{a^I-5;*LSa{8>v=THcus`d!+l1v@Yr*FhHte;ci>``y?|-6Jj4mY z#7+*ny=a;dyvC#d29Xm)?#Eq|<%nWE#E8yP3~fqs>#u@!KuYOBXThYev1g)FWGR@d z@WTyY-H=j_%W*K;U~Z54m{iMunetUI`Y2LjO?RY~dRMkv?*%4H;h4=(aVQ1TYQKl!hQ_3)6QYgk=o{U@_3EPnVWp zg~h@?2n^e$oM^fM76t}KT7q2;Y=+6WK=+$r6tDN#UzuU}HhA=_h`^x*`7X`C`6yTR z7N%>i+mQ|?YkmzOPAcr<--q~tgqcPL=i#VG)9i=yjNpwPz1mD^6P)A45Zg?naHGeu z2HFsIh5j8voJQyX#LhB&&v^7#XW`3m(>6|@z}cmXN2=Q%GusG$)}ucGk-mZ>3e2xO z$0&T(s2vMI_*_lHQUN!@6R#5_#EfFsod#oxXmq~Y-Zs9M2-u(+t&`k1~uDXv-1m#NFEd)_kM*Igj4!zS4zx zk=tQ_4KhmN!|W&TGYX45diVnANtku{ZpXb~-HntjVUEuciZ;vcdp|pcWfvf1)~COP z5c{B#kpYLf3Wn1UXYL5M-e)0(8VqOdD7T}4%qUqNX5YQg2!6rixDEk}&-yUE$0B)? zgZVVetv?LL#Ro%!@1w`X1N`6z`7VEABQ^;2uC8h?^RzS6PatAefSb1_(hMt z5@K5VDvUjYZ&u0SO>Fnnm%9zZ};d^9+1)Is;WN<#?s}f>@t`f7p^2BOQpkM zrQ7IsJPd|LB!)STA=K7L84{*9U1mK|Zz~9~Ei-~&hQC3R-hpP=Pb@PEA=X(gTZ*mY zw-7&&p<-J~xz4=f(YJv1mkq>0Nr>``8 zfKOK%g@8teQM}WmCm6UuLMbxe>tLh6&}SI?1`o?JtC?f(1?$c8uKn4EjpBTqv>!Hn zuX*$)tK`xkOUMVK_ei!M%xy8d?GeNGI=1&mWCqhXJrk@0l3-ECQ^$I+0agb6yh>?0 zpWakR2f^rLMTiIMg_Kw`@Ep07afWMLn6trZxfb49hclqC-<@W@tzdME^5Rl&9CQ?O z@V3ad#_+xAu|NE%QTV1uZ}phGr@~r*)BZxRP^0Kg%*4kG-&+`+$Be?aJbLuwrTZKl zeGwQ7H%|ce_Z~NVZ+q<8TBGo7JczB8u56y<>=V`+!S8q+&q2flj}OzoLWovkLBS(R z!zYa5cRYIL6P6cpTY3v@xLG>Aw)&HBAoB?#5+T;=5Zk7pNnrE~bSMt7uRLk^-t*|% zx>CayVFd)^{)SZ>=i_x?bUv_AZinAfyt(3<67!T%xX0tz0KsLHyc4FMLx|Zhw%l0O z%WMu_q}W%kHwxeP=pP7VZROXK0 zcmz=)M#?C3ZfPRuy8knl%XR!A#0jFN-dMNuAuw8e%X{`h!IcFTM`j)NtX$>b6gUb$ z4A#>$go{evCOJ{D3x6EuU`Ltl)_;S}k(GzH&YPvZI5c62-U^0|V|JMHCxqzFw`%TC zXssSxL#KnWF06z&@V{AT6d&;Dze8lva(N8dQaU~vAx;n(#bfJku--@ri(sk#oaGIC z`tAoNy@4&v2V+Xp4;^oVVO|~X;gEGRcdw!{o~q|7W|r*OO=gt56z=>>qR{8dWO3XN zhLcZXnEmMUM)4tB^K6wC$Y~R~)$o1l(bqy`rKTV2C&9Xbq2pn4truhiOe3Acz}NuU zb?d&=oe(-es9-K!JHbM@Y3Y|3f^Ke)dh2bHl@r@KVcIB$>ejoRZ-MnKEs|@w--}W~ zJX|XV%)H>yHz34*##s@gbQ+9i;>?FN{;uuPOyt4Z77NDOv0!6|d;(1R2)Ef|rExes zJF33~2REnoP=q*BNs}EMzBt1mCW!t7&FL;Qe~%A5#4ei*sY@HfiWK@ z7oLjW1fy?Yr+*a}$Gc<=SWZyG2rxDlo`Q+;;4Z^=(xV@OC>Lh*uf57^Mlr+&ugldH z`EWCv1ja5ip8*})!Eiq_IZVHf5IY?@CQ^^x)&kIRs9V1ejFSZpg#msaj8hohw%F~c z@CNQe4cDqLJp>_XEp5*QqkU*Io|;|(ldWV4Ki-PN3Lo+&@(I^aT#h2dRC4;h07mzg zy><$W<;iE)MsJmwN_sSy91z;R9E^R46&Ahr78pxGJ`C%{QpR&$lebZyd8~^@h)yQ! zS_#(E%tNRB6s(KMxF3~&2XW>VXMcpGMcm5nd&emL)}y}*Q8fW8`So`U-*+B8;$3U3 zxJbcK9&D6p7+2%VV3AP*IE1z3N?nS2an4FqCY-}xM7+m}54~@bSkE8oXe8NjPAExIZ#Nm_&{30-pmAnZ!3#O`tfvy8G z4hOaKm@!~90<&`rW{ir%B?GFQ_OVPU7qpFvAr9Np*I@Jw)Cbn!6UpQy-dHe>lw5*0 zg0V}br<@0)FX|$rAr|?Ak|7_S@4N?%!b=|e%7aGnC69g_af8i#+i-u;{E$qEu0tC( zg0V&B7VfyrIHL$Rzg<2p)sbo@SVyF)WG={Cz*w`KIp@K6GLc_XG(Rj`if!WU5GM#1 z9vD2y?KlB8&`2o=(_4Hdb*%OWL!2ONzr3K>0><9QVxMP5b&*ld@!1X35p^4 z42)LDLTVk8{wvSweZUwem&qAm?ZC`I&|d(PWpZGD1PehNJaVDi(egN^xj7&1L5Mnb zD$JUP6_ceO1yiNtOjhxWGIrQKUl_%|dmOVM4lqi753|4Xh2gvIu~+-jD7@}*%szpu z0Hf%7nByyi#+jjzljgJX^>9A~CYjPjgeI7wp6|JusxLuiz#y@8OK zPOpDTKK!HYi`@DOFt!%1ic`cVU^x9JhB>RA{@dKNPd;s4lDvcnT=!rf`Vk>|5FQ^_ zxt*=QksVSxnVoS^I0s7={V^!AGVZmiDbBLp13C7>-sZj`V_L_GY`cq&W9drj$oheP# z;74l=Y0!8urjn1uYr(piB{1$R*l;krxYPvKT|dzc^@TrKM;jg%_JTzr31%sdSd%Xb zUuCp8=V!b(02OV0h1;%(;Oe#>eph%)V`koh;1C(S zax2*9YN`4lg8j_|`nL$u570i`$Tq#kxr@_s&@_b1)@bGnu=puIqoCJA`pw@&H$E6T zFORP@1$F%$@3OEEq^V=21U7=s#LXvmKX~X;+gv8LKl;1y)kM#pLSzrKW?s-WzApU- z-ibZF<{#Ed%Qq@|gVDF7-_5m{$Y=vkvzWPtUIwEJm?<40H_$f2^>(XnvW+k90Hbr(c$F! zeHe`Ex16OFG@IH1IPrUcbv0AsX~UTf#+0{~rcF?2pt%+}egumWuDZ4`JSGfJ#s-e7zP#x+bn!PUW= za;yyur?T;2y};_2tKH*ZY&W)K%<<2_IIHFIRUW@9j3ZD6bktJ4xpcrYxbc+a47d6@^- zGsit~>DvacFQ0 z^8&tP1>>qA&x2>d*bFcnsT<%odGIuWJIj#>O_6$Hh!ceEfQ4SSqg+MU%U34!0SM7F zEcVzV7l0viVwk?0DWJ;}h7G^=!_{0K^P<5xGV&z*1Q<&;@0avqFqx0bTL^v)h+QF% zj_F|12FAS%#wAvc_D?FMJS4TMVpCuBVK=kSt0ID%V`N^3%F&ZIX_c!=o6H>ciB&~0 z(m1B$_k)Itq99wiA3{S!Npq}P)oU=A(h8ys1zRCA`d3plgFS1)1!bls2u8}_r?-Oj zYn7_;w}OSYfm3m(4}{070kGHJ`Yr9t1V z;PbbFKbHpeZuR7lqMOjo*Y>1L+tfz#)bR{{ZEMUw7@wM=`Xz+J&9FdCKz21 zbL3^W{sI_BQ1>JT>UiV5O5tUk)Z0OnUyuU>(g9|4oEwqkNX@hTor}H)2J>I-d?E7hj%2 zUJn$79nq>^p@y0k@HWPU-`b%!n^yt$q(;Km32B~zs!kvH_GNh!^qwf`j7tTCRBG($ zmG828l{ZmmYKN|ARFkAZPAOLiLUmYIRgrDNbw2~QdZ#x9a67ppjVzG!VFj+cZF02=1xgZ}527}RQ@$3kPUj#-+fQ$2v2<&dj#=0HO))*Sz zOgY9NG{n54T8~hvrH=2(jFRKw&fqe#o(jepCL6Z{>{e5?Hl>E5sYAeSHDV=LX+FmZ zFswmgSRvY?bdeG&L*0#%Z^E6BII~d&TKGAb8w?vOCQ?9D=<17Mi=H+Z7=;x-YN_M8!JuVbp?&6dg?MIqIqj&fpPlD`z< z1Ytj6zkoCL>Qvg>XwnHVt|A!1OSn$xY|VJ?9+NwZ;JzsANvL!kGy=z~&%tCPxSCYx zVmWLESOgf?7IV$hXMxFCzio?Ke+f+G`vR}BfN^C*O008DyIKQ+rxSfFn4A*qbOTJT zLVP|u4A#4}hC1CO!?!AESsWPinLDq2Z8uRk0M>sG^&V4Y>wCN9dWR{FJLZ*OU5p}} zL*7S-L zsPGMfEssNOi&}6P+3vRQ4Hd;yD|EN|mv#35W3RzU;GDUoaae=xFLW2hgOTG~sIpJC zVee=jCVWGn#)V1Cu;}2)<_j>U!MO$Na{X|*ci;gS&q8Cvg)a&@?uW{=p(Zjs*fqdp zJDH;jev?n_UzqB1!T21CcJ6fRN5D8Makj(xFVG{3hoZDpk4z&^d@qBkWd!4P1B|_f zQz+Pd_$56bSQXrAIV;q4^6K-W|Y;fDyf`AVkkYbYEn9Ja9nH|{T|5gw@VZe}bPmaVujhd`*O+yXvFP+rvWC|q-Z%plL4 z!xfV|@^Ua1Z5F0~494D&ta_x(CsPgusimCd8-70Sp z7&lPl!2+U>q%zIjRh` z;qkm=f~|*Rc&WGzBAo9+xE})eDsV}-a~P7D@mv^Ifk|`th;#w$R`H?3%NU_QP|BF^ zB-pK5Tq7`1%rDn-5Ryw3%R2-%#j-_r-(99W=VCA}w6{Fy11M@C-{N-s4i+I?DLC?s zloJmN(NecF1B^pln$P~hNa2gaKr|dB3W1LIM#0hft2%nU(Kc-o(&9#Z2;Nl#<5U5| zzsC4F7^jM4HOAP?w=+-&T*3zyYsP^&J^;%SMU(I_(S0oZK@`Q|1Tzo8Tcy1ZmQ-3A zet*ooDwAc;1>;8f7O5^0dDocw8 zqdQ@V8tHaC2R7VrO$yWhK#1cC$IS_Gj<;ze%mUC<`%~jZ@KjWJrL5|Rya%(}DB2U| zC_reKQ8Fpa@d-j+Q8F1#?GlS3%wV|%v3PQr6rrDkbgRoECfLlEtxU7*1rucFe+e~K zc2>wl6f1)Z5eyS4(=eC_$#s|SKvbM$)8d#U+z+9NGVy){(_}C-4mHZ)as*X^5(E>> zQE&{8Hw(akIJO};LZ-DRm_e!|5tJk5coe}TnV{U{(rl9vL}47=52VUqkk_Wol2vR# z5H_+fzbWPv$18z@5DMqhx&8hrA~+4+_wE$o13IcrH4kfPtQ$dGX)(A4!AKcAeJeqW z#8Nc{K|H21?M?($wwnkJlIp;u(sGv}s0urRpvrcauT)J!5ch5@>{SF+f^ySJ%N>ZI zDq#hJI9xLAky~nDa%r|C1eG~k5me?}Lr|5_E2T8;G6XHl5R~QG15!nC4!USqstBHL zo2ws5MTziEJk4R3Z;&QW6kyBU`T#Jloz+D~d0R*YFs3Y>?D}3PoJ{7UM~&L)GG4>S zj=!PC>A|h|Mp)&S5W|ItF-C_6&EJNs(Kth{Zxs0%Y9-faAco66cCYPj{ar9_=aRL~ zl-nrI+PD;&561PUy!l0<6O2z2m;@>#Uk)|#Zw36Vh`;<0 zX>er{e99vAs;2r^^^quQ?F#H>t#C2&0d=L}^R#*NML? z@s}SW3pDVThOAO36s`f5$KNOMHwb?}P>73aGyNrnzW`azuc+T_{S_r#RSA9vvR7{4 zuOI%}keWT@R9Fp2!|DO?NAt%Irf&dbgPJJb42VBkbNryeEfodi{Bh4;^hng*(q4Zh6O2}|O5P!6V{GpJBKM2mAGJqU{HHxnVvZ8g0KMkZmy#PeI zeC-t(&|U{tLBu{F9q=%aEj$Kf0beTo3dpWJrSKad{%B|LgF{rT_yvVO09!(@iA*kF z45M^r#iYEd2DT|EvL1$F5ivJ6u zelvn`sVV`H8PkBQI2%ZdXDB@v$Pbb6bAW8XJRqay^T)qHmV2LyC({441xg^2->-OC zq`pw;MDj(76KUWBikC%7%al%JzU7Joo0?;`3Id&Lol5YON?@XBG1t~u44G?lipg_r zP4YR&MJmDVkTpE7;{P2o-BwlM3qWRhQQ=D@_}m8b&4jP01Z9y0zN+-wA-iaoioYGQ zVQ(Xz(`g@&7AG9>{h2Hz1wn z8jv3%gVz`!fF?jz&{XMVk$Q8b-wqkos+_DJ0WedL1qUfknzPHkQn|rttxHS()1T&6M35X1iQv7zv zsImCLe9^a64DE;3d(=R|emj8gtx70+8|1u>k z2jY*mLgB+e&c4ThY|&aq{tKibPavN7q{4M7J(2m>D}4iyL%j{?Y=Qv)l@$EZUdIn6 ze1k-xUBu3})ywCyvR6g#SJ6ZU4=7G#M;%i9c1Zg^Rq2ibne@0y|8G#vl7Eu`#r(A( zR`i7`n8*fv1EhXN;kPQD$n#B!(tlL?EmX6V0t@&F$RYhzCA=Ln{+fy}i`=UG*iHWd znY9Aa5i5#b3v3PYS!8vUwJcJqt@N@;Q|l<5$fEoeFN+-W`bsAFZKc;9g#a_wRYF;$ zP4$)j?~o(f6zNz&Ghjtgv=}1`rga3R14O7|Zimd~QSoJwBi{=;<9jRYqtcZ{N|E@% z^n-zHPLuh~x>1mqoi+wgm0t0H&yDBD*0+ z@v_KbrYoIDK0{%y(uvgb6eqGBvy?tt;T(l?9m;bNFdtp`?;)~XOM(0lIYU<}{!fqw z7%F{PWVw$h{T3?EU9BRBwD?hlj{{lYS`|+ue?oC$WANQde?#g21UaDZa4+Kn`zIWdW|u=YmhJ$OmsiDwv6dhSeBFp)hp z7s!h96&9%Ye}X*QKA_SQS9D6pl=6~7&FX0B54{|;G>Q0dAdD_*U13tbE_ zVvUL@i){H?75@ZL1g@~v6GK+ms+$vZ12irNTUFk&$TDA0I*~@bsQAA_=G(5)-41Ef ztMr??2pmue|6h<5evER6pC~-2@Q}h!f&37e?r?eKH;0wL|6qa_I9Skv`WJNHg0j>;z=`EaV6_3J=Z z{DO z$n>p&v?o~UMB39HSR2?!>1C1a=ntLi%`hi61r{(|B_y)oyA>xgex%|=@=*#$18HCk zkOkiZURpC$hjfikC&EpQm&p)6G}BEHYjGLX}`KkQF|p5|%|8xI*bf@|8dq z@Cc9g#%PP|KD3yJQPSnMgy5XTH$!0`7kk23GqOFh|D+{$b!8pK2h-`AYW&g z31qt2KpHd;$O`UL`u#w*c!}amf$W);z#!l*{4X*$JFAv|HU_o%m)3F7m8T_|H2zZvi1Mqg`#}3i~j3x6k(j$qyPDZ zBD9~=?!Wy;(La8nh|gp6r~mRBMgRDPqWu4zH;Vr83q|?=J8u-BNBM>keIS)T6mt6h z^@Spg|Nq7tMXcx_y->vY_rLH)kvXgW?F&VymoFBHwsUR%citMR(pSy7OMqo%f2c9Pk8u=e;8Nei4_(GVc?Cnf%UsMeLY6?-kv7uSh=l-g&PG z*9x2x9$qi}4SCGE^InncpF8grm3`lc_l$SmE8-2@o%f3Heo=y)BX`~_lF#UO-YepJ zM!Z-4ckdG++KlJjSK0T8sFQP7vfd}M@XmWh?3Fw372SES2(yb5=gxaY=mhz`(Vh2- z_}&pN>v@vD^Ip-N_lnG!VZLX?mEz8OMR(pSy7OMqo%f3FyjNts#q3zV~N5eD#54Eyu2$-fv5XGw*5rE;s7)e$6X^-9o;; zyUvttCoBB^d11+^;2CR2Mn3q|$)gEZ*5l#Eru|v%Pay9et&iV?198(cJk^@6%gvn7 zD)iu*`A)x-!$I@*wdj%8=gC$LU)oah?u`Kz=LbXuF6{I9rEi<%*B`oS;k9;8*M8R( zmGfu%w||Pj_ig_9b=r&CwbGu*{KIX>{B=gP zm;)1z6gURXd*^ae4d?t*3qDOQD8AV6!zNp=2Q+lb&Xznk=Fjg*f{ z{&=C?sc3Nk=0yekRQY0;wtYLcsnqf2jt5)Ehv)5HCH7Q0`_?CyI+pVjwSybAx<9#M z>p4q$Y`NCrkv`w{+cw|<=hVi2=li}@xy3^pc9k)&f+jLc>|?~D4{TNPudLs^?boK) zuREHY{kd+&_7B@7J@wl5{OF~AJ)*{ZzH#REkNzCF_jpdtQ=6WC_r&w91HOr!9roh` zzr8r&l-~4#7w6u~e-g-_`Xk34z4ecY$hGbV)pxc#~L zbNc`J-s{nwUrt-PVL-sq&)U>F^hmqSITPkTc;?~{Ctr7L4jM3G$rts7YcHDJ;`B?; z^?TIlGqdRzzxNt4cVbby-U)NRKY8Zzn;(w~8}rfV{XWmr)rP0H>iqNz5srGB9@(>I ze61MUr(4rr$>}z8(4$Anm{&;??}Ve-=k}u6BV!UG4)%SfM)s3chBS@3tJ%(K^Iz?k z{m0TD20Ytn|IG1g61(Kh`uMqBEh^mXyKdduftQ2AKYONUdc$k)HILle?8#jG%Ved^ z=G%q-xvxY6K&U4ce*nRG z0740c01>(u!VU^+_d;kO&QnPI7(&!O2!UeFJ_!DwK)6Anu^6}?!d?nR`yt#Vu2IN6 z2qE@E2+hRi47ln2rWd+M-Yxt*iE68&<{XZ^eKdt0}xt^ofJY2LkRpBLK~6v zF@$pz4p4B3fKMQ-{tUvLPaw1x`zS;nf#5m_p`*w<2;nM)lN36O)`uW$ItpRgAqZW? zaSG9&Lx}hkf?F*96oT^@gc1s&BJ?nX9Te6ch7cysQ%F1xA?h;-5n|0}5d6P@aDze* zG4Ke4y%dU$K={SUQ6b?{`5&>U8Sp7AGIbT2+CiYQ?JO#n^C4>?p3KPY^QxNu2C^`ipPF$mq`#pr%(-0EG=F<>@&O)g2 z4Fs=<`3Ax<3cD#x75W(ni_SqvIRha{?4%HK9zx)^5T=QwZy}tcaDYOJ2>1@d>S73U zzJrh^_ECtu0KxS=gbb1QJ%p;}oJxAVi#lFheXp2f_Ix zgc1sQBJ@0j9Te7{hcHW=r;zv)gs5T&bHtir2>ur#+@O#z23~-$mqO762=l}>3b~gc z#Qp$bzS#T&grJ`xR4IY5K*W?lI7VSNg@r=@5yGNhAf)^VVX@drA>>yGfj>cbKqUPH z;T(kn6qbpAix5`-24T)c2oH*V6e2G}a9x71LgZb7aFxPI3WjL?GlWf7AT0YC!YXl` zLiAM#5x+nXV(~8!oYx?fP*@{Ee}%Av!rEUUJSNUlNc28AcZ zz{?Q!QYg9%;VE&ALhc_BVy{5hAU0ot5Of1Vm8%doikPbqj#1c6;aQ_&bCxBI$Ps=O`SYP$UAb+s3Y1ZAW)p2j438fs05R1lJ!Bwu!tyAY7$z zlEQY;`UZqeb_mOEKzLakrx0BZLd2gCUKNY~gy8gpP(op+2)zkm2ZgmaA-pEeQ%H2! ztE`H$54P=IwZ@LlC=YrA^i46)2EG?u6xkrWEv`|>tpFj`4&hy~*$yGd386|k2zx|K zIS9un?56O6(ET7R(jlbyLD(mDQV6LCA!Y5)M zg~-YfTooW35_uIMT%~Z5!ePzFqN_rP&>?&-7V8k4)gY8mI4(jf zLfAoJZAA!Qit`i_t3!yY1mUDuQwf594G1?Vd@Tl6hOn1HQDq3H#Wf1KH6g@SfpA7_ zt^y&b7KAEQA$%udszNwMVK;@dLazp4QEdn*)gYV~J1KEmxFqswLbyudB!yo@>sk;t`9oM%3&L;WIECl{2obd* zToH?FLvYrIP(tCF2(1HQ2ZgnDAY2#cDI_+45LFk#4Y8&!1pkH*Zcw->2G+BWwd0qc z*VnU;vE%=_`5h>71Cb!s-#*x0&L#@|p#(L8QY8S2!zRWBKsiQbHs6`QEv5X$Pipv-9qW2%XL4PjkmQwXj=2sK1r zAcU(FPEx2PS~r5QsTqW2jUdz!$0aX+Mj5FysIh2Y-_!VL;N#6TB>y%ZenAoLO=+Cj+e4B=%8 zeT1z&grF`EyzL?M6Wb^pqfn;#ENbZc2M|@!g$dO|02Ig42OXK!;%M(OBDPgAdC)yFi|`e z0%0!&M<|3iF(MQ~t_Q-)6cU83JA|Mf5WL+Xc*Qmf$0*bZgD_RZg+W-<6T%(}NuowL zgpghka>5}@69Ewr&QX{X0U<@~qp-R+1eXUwn#l7&i0lL5B!vvox(9@-6qfaXkR^^& z*whz7L{A7gVsTFh(fuHlP?#Y?dqHsahp@I6ggkMc!VU^iy&=pJYkEUS901`4g*jqi z9|-=D5Q_Rh$QRcr?4=Of7s5QTxi5s=fe@!G!8<<7zi(m#bY2ukB3k~;Z+ej7J~C0 z2y4ee*eT9a*g+vG8p3O0O*DkWSO_;L>=pxKAox#!P!t2vFFUJ9|}AiOO$kAsjq z5ki&m5Z)Cr;~@l1g0P#y9--d@;TVOKdmwxuc2Zar2O%&P!ak7{3n3&P!T|~&ihv0a z&QX{%0m1>XkHYE%2(F0`J`s5nAw*7waFW6y(Rvbus}z<^f^b+Ir?ANjAtDaK5wSQ9 zLi7{}B@{jvq45x$Qz5L4hj3h+r?7)UR04!A#hL^NiHQ(yP&g?DPKMy01fgg$gs;Ul z3VSKUdLf(^o4pWneGsZlfpA8|Oo0$I4Z>~;-wAyxgkuy^rb0L?c2ZcB3?VQP!g-OD z2q7c|!T|~wL_iXRa}?$zK`0UXD6CF};POHEN#yw;M5aMFN#T-cJq^ND3d^QJ_(dG2 zuqhovL^6cm#NuQK(HRg*C|nVtDG;2Q5Z0zZxF*h1*g+vG6~c9~CKWn`S|Xm;s@VSUdwl^lS(v6zYl4TnNrN5Z2~G2oUEf z?4S^p2cdyjlLsMjE`%Et0>!|Y5d8BY6wQRtSX`s9mqP3;2zQCivmoRaK&UbsLNgIF z8$!@L2)ik?5c(Vl$0(%CfzV3qq_F5-2!V4Uv=&KoA%x6_aDYM^5s(kz9ECag5L{v( zh1K^#a1}skFY*fPV{IM8AwoyddLE*$ETj#JolKZJ;TA#@ds?}ZS(5JCwB zw+NjN!MO;++W8Pd#d!)lC`8={Axx~f4?^N%2sbE1h=B_r_%DG_v;aa6agD-W3bFS? z=p{Da4o7={1C-g|&oQT6@WI}H+gCqP0kp(K#d z5<1d5Nbdxs_a-314hqslI*SgW_ue}wy$A{l(glR5C`A;Ma_-;G8ja}V^StN0=l!nh zyUxCH=fCEjHEY(aDSP(J+IxDAK~yt4CB{rZ1dm13FkQzYB0oZ$mZ)VijYHg%7&Z=3 z#~hcKIS~;$9#PK>8IPzw32{}Tfyw_N;;F=h4-pN`C5aW25oISJ8k?~b5Y46_?n^W^ zQ6C}vry}NkglKN!Bz8#DnTTjQ~B|4gbsfddbJ*Of%o1GG4W+H;8A-bBb(-4uf5T_-&n@rOY z_auf*NAxtuC1%b>gw8 zVuV>a7cn>%k$fKFebam%B4iO_uf!-5FduPIqUU_XXtPsd%wk0F0>oI;bpaxB3F5TG zc#~-%;-18?g@_5}xWvq*h|pNXL^C87QGFTWs>EcIe-YxT#DqnNspgWzisgv1ixJb! z*u{uuD-ic3jEP!;@L!3Tw*)cE#7XRssIwF?$IM!a=&}m&LSmk&u?!Ko8nJd6Vu5)k zaZIB1azw0Ixg0Tg4I=pp#A4HY1tMfEVz0zf6R;9-QKIKc#B#G!V$3>3@G8Vg({&Xh zay{a-#A=giHR7Jcu+@mQ=D5Vn4T#V+i1lX38btMth^rDCP5!lrrxFv^A~u^#5-T<# z%C19fHDlKynr%khm)LHi)+7A4Am*({>@;x_J0$9CK%Omb;jh_PWaReQ8;VPDV#I;cMv`^BNRS2mlV#M@STJU zW~{;&=BC1zCTbVO`tPUMdAlg~l8KYpAyH>H;jI? zOyZbC>%EAZX60VQ;6sSy`w+KG^L>brj}dz%?wEl6h>H?E_ap9_of2a{K?EN_#F?%K z5Rr!wrzO5KnGPcENenxPxNnY2%she!J%sqt3^|0TeiU(4;-Sg^G2*GjgpU!A%_WHy z#}H*dK|C>IKS4A*j<_%Ji-|gn@IQf=cNp=^#7XRssB;AIo0)Y4(d8uKg~SU}<0vBV z6k_dB#4Gbm;+RD1W1I?j`IuG5I29Ot8k77u#>dCBIL=iNUmvqc(a*;uIYCV1W7;bw z_A$E@{e4WDlf(cY(@imnk2$26)W>8#MNH;n`Vn<%af-E>!sIwjNNI*Bq%!9eQk(o| z2x-g+g|z09LOK)vDIvWXtB}FmRLE$e&JqI6WQ9y7P9d|Yc#e?8%u)z44;6wK zO{_vT^GqSTY4ABAhgqqR(|DaHlg9*HKwOmQc>$5n?35Vu6(aZx zM1Irt3q<5)#A%6wCexRQdlJLGM1-2-5;LzLLN6i;n;{nw)vqG1N`#yImk>`SCR{=k zHJ2n-Ttk%o3Q^pQ{fhdPFgF!SnyAZ+_P@dCd6yX-W#S}uNYuH4C~an4L3Fu^cp*{N z)VPWW{2H__+?35UD2N8S|QNwh-iHQ6Laay95$@Deip2V=P5p~RQiJ5m1p|=qA%#d4%>h};= zB^sFgw-HYzCfr6eG?ye+#39PwK{PgF?;x6ei?}b*)I@!Q@c#}m?;AvO6DP4lqRw4J zOEc>(qRaP)7ZR;ajeCf|`-rvo5N*vfiDMG2;}FqiWgKGg4~XR7B08An-y%YOMC_I5 zXac@tZFDlx3Z2bPg)S!b_k^ydt3o$(P@%iYbf3_}99QURa{NH(Wris9Hs=)jnEXEy z`kE06{mdnW{wDkZVSpK{Fwopoc-urhBn&c>6$YC)g(0TmBf>jomcmf;P~lxu<1t~F ziB%YGo+-FZgP#a7W~IUirk1 zZ-^DI5YvA{OgA?X)0_ElQR+Fv#!P-r27fQa6Ny=-;tRwMiKQ`O$T55n&iVu5M!3UN$gt3>Q{FCW&kuTS#n9ep?fn7)z05I;tz_hNXdiPrdw5{D(0 zo7CQjF^LcZy%8(TL5ax3h&(=s)uyix;-16>iM1w&FJh)YVw5jpy*VdQJpfVM53$jV z@IyS6xFfOIgeO9*NP?K22(i`NlxUU|Q6({AyP2FA;hzlgL}I6@=#SVTvD6>2+dP!$ zk{r=E0I}D^1|R}cApDXb_L~Mt5XU68N*pv^NfConB045Td~7yKgrq{GPlh;bqLU#m zN*tCrYEmahj7g0cm>hB39F&MmgUFKtankfnfw(7eLE^N@krFX8En-wk#HZ$*MD=ut z;;9hl%!pKorxJH0J~!d15i8Oorl&?+FgGQdWk6I(gZR=+PJ{5zh*dehr zE#k6yDA6Sl(KsFAs)K;OnGoNZzL^mBBrZtYH#ssRW@bf<%8dBY zoRg@Y4N*J`;-MLl1@Tnkj>KaV9)wtt9Wgx!@x<@yt}r zir68sG%Mma^H8EoE=1#Oh!-X{8zL|_!Y@1Gm1&S2aZF+>!rRN&c<1op>>v-OV-Adu zuh}FMk{6RcC&tg$w9kpTD05gQv9C#!3o|AkW?(K%fUh|u6B&ZZlN*!N*YwMcxhHc0 z!+AoEJj{G%e#EFeh?M4>MD+rQ;&~CN&4|2+rxJH0(wgvmh!q79)AJ$Ho0}5N3L&b5 zATpZCAqf9a#1n~3rec1?4vD4t5n0Sbi7sJ?#sv_;Cbj?~urR`}AR?P-P!MrUVyi?B z<5dVTxCo+SAw({-Q6eN9kvn}ZUOMG<)lBMO?n zg%S58E=Yu$97PZ_iy=l8K@>LUB&ruj6sN-qClZ&!5lk^3aW@QP) zF^S|Q5fx4Il8C{j5ql*nnSe+{NEt-WNJJI0Q{tjTa1^4N=^BL?Qx+KsBwk3gG&L$9x>QE2t$=84o=F5&LA0)j zXlqthL>!Yy{sto2G=BpzxGG|=L);uL0@ij4`g%q)f3=AptIQ=>s6+OX%_k5azhx7fQI2KL)A>F}8=w<}&By6l5$y{g2_tvJ$E*0NXMvZ$%hX;-TVBWff;VMUY4MP9%m|TslpBur@(1SJHjqA zi{Rd!aGo{Cc1wHn@xeWn(-eql;`JbH>+V0dy7gATfp@FzE^?qz+I^qb&pV@F-}lb7 z{P^9e$-A8yH1ATYvrBqy>sGmYrT3d(Y{k>5e_s~o87x{H-?+Vpb~bKy^oNI^-5H^0PVyKvAadlwceRCmg_^7|eVE3Z;K5DsX z*Z8v;3hLM8oJP{aT%4EhrW)x|MCVA-c=L=C&nIMf#+&-@`P4THJNR7TVW_^TCsHp;i}{S0p2#zTHx=Gq zf4R>^Fa2-irCc*Q`}lkR6lB)*^qFB6YT&(W+t&^9`M_Ia&G(CZ{I{3s=Hu(*ov)CH-sdM~%*LKR69ZUVuEHPC42C?bHD|w(WB4&~ z^Khn5HN%`dEw(+?NS~2DNm9*;Z?`OSw$C5!lffs+z@_{GD-Aei>Gpl&d~ybOFaN}R zJ(Y#YahQeCY_r7Aw$OBDoA0;^X0}5$pX41*dVZ!crYA8~f+{A+8#~OWQjWLJd42#j zrp@R4q9!xbcYqF%=9e5}P7zZXWi#z&vWmu+*7_Q*^1Xll!u&APr-`5cMQW|tPBT|$ z`6Tu`bx94~pqEdU44yWpm<~Ok6)h~YC76;qK}&V-S{QBGK<+9 zcxBEkVln@`L^%fc=s#H7`_DYQmEV{2)b#C+9R~D^X2C0`LH@holfC-n8!=5A1)SvK6hXM;~VZ@=&;3iy4+ z7|$Y}x@6jH_Su)bN?9*GN+6~sG1vBk<9zlfR%=}J(#A3E_d5GEqEoqNL(3Jve9w7i zuqx%*5>$3e6L-)jd^`WHd+Yy{x%z*rs^2&sf1FY|vPj(UPSR(4{Ba}ub<<^qZKS!%>Rhhhebwu8>-2-9xjn|^I&YokSZzFL9oSO{&|reqvQGJ(o^1(GQr;vdwVWIz48Sz1Q=)g3~wG^+@Eg@#^HK(I@Eeyt$SeesrA}f=YD8qX2d`%A6cj0xbJ4&W9#%>us+u5A$wZ7 zV0hcQC)QoNSewRPGKT3YwQx;zZmvhJmIc^R(nwDl`1^C279jA}nET?kYIRnW`2{G=O#Uf$Lf zAYI*K*s!eA2H4s;{c5$AE)=$E4!rb?LCrV}`djC3ownWq)&*Es1oyUe zNo;xHxWU#Xvn~RsAK%a`g>~+t41^&)TQib|a1{gnCb)LLv^Z6!IQZf8(i08kN%Q~Kk?((+z za^uv3JQ>~fvueOAuXW`}JHNgjVqJOM2Ai*d^SrnU$c-6kIO1jAm`&Y11Tjg|{v7&X_y=GXaCp&7!^}twH$-4Tu znbzrXhRUZsX_j?Wta}qT$GWO|UZ65+SDI^OHJh;!ZoYNZt!s>1U|kLCn&1{%SJS$t zxLE6IS=S7=$hz9rHP`Ylwz7_uEy%dUy1LfsfKtddtDa}6O1FYA>+0k9^X%&b?6i$+ zzBc%F)-|@SEv}86+P?`>>$n~0$t+2UdPt^@-O=DY+@_D6xIONr-H-L?NmZr;yu#@n zuAeRMEz){Sx?Tft+QW26PK(o<*&v+fDLS1PNM|z+Myl-2klwoC)^)*Uux=#IkKwM6 z(YmoXEtK9f0?rgy(OD){Vdw!)Zx2TK695k~ZHaoRaTDq;*?x z+Tcb)lyy4w)OsHUrQ)62^RQCM51_QoxYK4FjVoi_E*yWJQ?Rnu?X&sD;>Uqr`*GTU zHT4 z9cn7t0s5y9@vTh3LI5!3AobR-iQ%OIxGdW}3G~7?teQMowoSqu3bH20I%^*nKbk|Hk%ZS*HseClYpuJCQ#rA)7?+25&E{J~dW+3>-MYof zYuyby?GjvoHVR&we1!Hu*|2Yyv>D^$Tn5WTG1M*0n# z&)d4~xC++!ShoYmlOf%niG7j$xpqQo-u{Xa^@v{0WEbceAbKUiY3X)@9^Il>GF)!r z9_WTEK`esHO56+Gt*eX6#_&GqVO>wHf4yVvhn}{;0c6xFIRL$^)AMC%2-iXAZJnMa ztK=c*W8Fxc%KI4l;#8UOI4#I0(9h=6<7D}B9cKQn{x;)ejF#>Q46qsX+*oBi3U6Dd zN5iTz$DksvB++?1>~Ye8IGtYW5wV)~1f;ia5kd=h67;wq&EK^YsT!Vw4XObz?UHh* zLC+B?M_g{*8Pa;jPpmr|=MPmNuC(qf>03CxR#|tBv>sSgk+@n<-PKG!1O4jA z8^kp>C6H)&mCH6L;aXo^F6IPA})tzBfrkR0K&3BJCCDGcKUe6;?bLIeYPU9uBDBVCa6a^hFk z{YpBYb(gLC4Hsga9+<3|JO|H?Pq=E`3)0RrsIOV~66bzoYojI7#IHb)UDbQQ4eK;Q z524lTrgdC}b=9`+YwNfQ>#AwpE$e)6?P=BROncipUtGKRd~VkrE49wsBK5}bjdh7| zdhV0n1McFqb`s-mC5e9zh_g=jMZU4_JDgUxuD;*3PLGC`OM-i3-9wz0)_+puV=Etd zByTFXpR9Xq9oLdwzgYK^b^5W7r`G8Tuqvnx^*8H&u`U(vxpmL1OO1P}r)KHh>^ECr z8l*k|%00I(ElxLRsvly5!d7z-_cHg>^Y`JFH7-T`t_zfcW!)R5(>eKUfm0r>5y7A&t$L z2f4^*Olw_U++yp}S(gvD%)0c}h2WN3r-ycHCVCj`D(eDmz5=+_)@9P8bd|9na;=qF zY{o*k_0|Ph$K43m2J3>Y3&U-vQR_}bwT_VPu16_nCs7WmXZlHww-cAg>3M)haZ~KX6>x6rrdp>*-L}B#HO;y= za9MH3anr4nwravExQ6xwL{G$)tBU(Ui_U9~owyoK&j-~> zhfdcSbXDh{o=JS2wDa`r8n|@Ud7h-rxSBXU9NB$?fdzKrT1dUyeT`daU2W@h;t*?H z9o$Ly2Diw%x(vTTP4D6sTUXCIog?VO2!pQr{L?)2_Ptc+|B?;(=VzCAna%hnE)!|J zWiGc)=L*_86zI9i-$=*#di#*0ee>Igd`~ zW~XObIp;Czy-D9=#yVIzk5unNT2JCEq4ocnopE2JYVA2%;dF%ShtnHJB=M5X*PnE( zb(e7rx(4u1?;FZ@#kzr{^}Zo@)w;Jy>pep5n#yDTu0agw4MFmTByKQiy&uSZZ6_W= zdcAeGta}Hi_XFj-ZQW4PdOwi6W8J%?)ml-+Z*ZE&Fw$-{tK>bT*3)p(dW5GAvESjc z;K=-9*w_C30o0 zn?$;h&j0l0Qx2&mo=jR>zgz{IaSCZQt6W8#nsqAa))c5$W$UKlYT+sqtJ!I%lWxX) zgkIIHn}N$nTJII^8de$xv|sDkUemgnq^nRX9ouVJH_JL5+iP1loAkS?J+C@ACFkJO z2SBfSHs4&FE?zVx){l2?*E|OFG+Z4>8rY2UNq=VDo3_9OxQ93$TpHPY3rTBQ9b6h) z7fV{x$~CdmE+Vai83!C!Gn@`mi%Fl<`JWCht&pnh64E+K$+fi^my*_ub$sZ6Be<6F z?;_~<@RoJUNnf(Aqjf77){J$`=w#hW(wfI$VrN|#Ai7rZPZ_nJcEPEJt4ZsCG>oW= z1!~qcq&2ZzFPm>IX`RmxC-$@X){)lfyqs=G5nSu}r_*`4f!4VqC{G8W6*k`<(nGCVr60m( z*tM5`?^?N2S@*G)bexr& zt^5Qx*}5&(9mZ*c)1h;#bw@~RgOl54-BHpy+0fB+J5DWgjI>%%N7J1)-*M7vEw_$p zyR1B6GwR5+8>gl|Nm@;8_5YR4c$KsY)&6|hx@)Ah?zBH&vF2f!0zOPAZLzlaW)BIhx_@^yh@@t#%Hfe3?a<^=OcSvhXm%C%#H>9|ks!X3o#tox3%no#b0oR;o;(rW&lM13+M zc&-O(S{)01wC)GenpW>Q_7QFQhfG+;4W`r=(SD zt?L&y-!syxwA@SUekH9+YyH2n?l;n^v{sk;=_u6amKkSwyq&%>%RcqZtGakbsHS@O zcrhprC7>ikLKLKBd^$)E89{rg&X!de^YiorVqUJ=tK>PU(5#CAqV7y+>i(ILO#d^A&?&mKtU)3p->o#fbLQ0 z!Rci{z5T+?>9fB166GM7GpRZAsc!~%2XEJs4WJRc z3H6~N=xN0>z`#sUN5a`K2j+qv%RYuO#=?8>K8#>j^xPN!fPs+^16m>Pz%UpNqoE(X z1-+pww1a`r4f?>_&=I=B5aa z)Co*|zSPHSDX3r9a(`}2%_A`vVqr0if)Ahv^n_lZ4qxiv)fYk_6J&-g5Cp;gX4B`s z1>Dow5odq_^~+K}tl2OJ=E6MC>C^&P2(h43sl}kvr=?JU@(O}_K81pMJN3r*fxe)V z&HkVhOr21^4TE4XKP>(DbKg8=btc;eDnW8kPo@{}61*8+=FJRY2`mCV$6Gy?)EOzg zi9PR|E0enOsQXTKQ16_akPC8~bLV}txYegcU0Bp*r8txTbxTn<6m>gMHxuF3=TPfqD$9gYaEYr{FkHN8s;t z`$%1p)k$NhFO3iC=`|3BfI4dQ1$EBo5AVSDa36kv3Q!T$v#cFu=puh_j^sU|FZ6?6 z&>#B19`dQX!%g@aZmau(`bm5Pp1u)exBV!&Y~YcYtmN&j;OKjRoCP)$LNbqUO4DpxX@okO-23ZZTwK zd^X4d!4L#lAT#_(MKcgH!bZy23|n9uY=<3?f^q7&p$;4Bm!W9;3pTsEm z07kZ}bH9 zujmcxKhY1=?LplfnnD9;1Pvi2ETFRUU=GX$^;B>_*I|i)M$j0VKpgISP}hSsuolL` zI2aEf!9TXaT%E22D2^FC%g~AqP}}7c_Gk zqA&P?KLmgeB(BWArDV{j1)cTl($ZvT0VQD_(8D9x%FP5c0KLp~5P0pE^F;+N5# zlw>mSfhT178GeDjpxg5L9)SA&KL_>USC@Sk%i#sy-~;;dfxghtALcTwuAQr45{!qg zPzfr7`WdTVvHA>G)Sm3eY8}GfI}`@OAW#Rx{je9*>5MaG*HyU5IQ0?Gy?%8n&<*Av zVIVWUPt?7>jF28mF&qxM#eabDAHxyY4XJQxAgwwgy`o^9M<)jLh;u>LZu}li@>{pgnmww1C=B2Wmns zXa~Jm1u5Bcb*F0+=^|934V7sJ#n}p`u(=I^cVG|83uvwDJ6ni z+Q5jw*gRQg>wK>BUQ4bnULU=l+hGfNu;Ss?@Hi%0sRk-iOe9QMFoFcdHcQj;eZ z4Ah1C&;%O7o6wmGy#=~l8%_S9ENDH@2h?by9=X*-dvY@p)u9g5fLc(2OoN$t2n+>X zW*r2%sd+BQ0XZQX6ow*@6p}%5NCAn#9|B+)6^Nno@4-lT7ly%bH~&JY?Fpi;+n$2C zWFE!LM#3O8)tzYzF)j=WKxRODzCo3Y z=$=o81yGHRtS_P(l!Y)Vr7xrCJ0ST$hnzRyIsO%Rk#0*#%b7MUV|Gq>mBI_45c6(-1r_43^}1H)PrWAn+i>#7Bq(jpgSRNLTzXPt)U^bgho&u z>gYmbD-w;N1~h@XP!nFVfuts;fRv!CWx5ikD_Xi7vycsI9qfRepw3F_T5}A(gq!d+ z+=4rxOKveR0^Wm>utXPvmXgqoh2@}|1iG-O>wdAItDEy-Hq3zmFc7ALq0qrZUAFBB zb)Y;{fVxz^9@GYP)9Zxm3~xa+w1=Y5T(xQmt)Ly0flzow;gQ5ZXb6qK8~h*<{KojF z@B~saoEp+VTKExnpQsB`zRcVY5`ntt&1KwlmzA<|H8wNjtx^~lqOva)XOfv-v4ux$OE|` zFBF0TkPp@LFcW(beZe1|Gm{UAqHy_Rj_)yrAlgkz2#f3v3jbhW12dmJ%OJ=9njR_>>2zD>S(5pWiQ|*yaM$fQ-3k_ z4^w}zM35NN4{V0%`<-vb^z+HK02V?l=vL8Uv-Y-c#;BDfSAjZe>4wi*&`loQ)X`0x zEwB}~!FEtzE8WbUW=6zO@;s9BVF4@z-M(F9Zr=0F=w3l`CFo}BYFGohp}HP)!*nxj zfvvC&bi=d|rR#oZVJHIOP!x*6HMkBpK;4xt!B=n@&cLUj?n&q1Gu>+XoP_!zT>$zX zdAb@MB&sXXQ8*4K;3Twy-LMDt!amp!(eM^brgG{rGyy(>iJ;y>!(ce5mr!L02K5BW zrdy3!NCbg;{FH{0aD#1nGn>R=j%^NY*_530-^KZCGELc}0-5G(4oR(uqlh1XHnX(E z^pFmcz!m0kQG2-dV(m3_0*S_|4f+CXjygPKqanzM1Y1l=)e$KI7uX9yV>$i{}M ztzQ&`Dr~?)!zq~{ALH{tPEg)`>@oX6{T{lKuRTtA^``AKkXDy){NE3={hT9{?g}~U z_&#av0T1EzasO&tlh=}KuTc6|P&q${UdHQt-;8wzF?uizfp=giybHR`IUL*&10&!)cppZBZf|}7x}~XG znB!oAiN5Wd*6lQi4n_ZT82YE9hg0L%4*+dxC*3`d2EA*vV3V827NeDoXmPjfCs&^>z7Al=aLpnTFB2V|I{~!dn=2YiVWoQd{v!YNq5{_928xQaM*VA zBD$rbD??wyWmpbe3GiID(B+GsPz!p1W>$I%%p1xNv3QrnYo9CQU@87zgg8Hf;>g_oWsn0yxt4G5J@POe_L|xp`MV@zH9zFuZ53P>>OgJa=;o>fH9-?sh8pk&L_%>W z3>BdQl!tK86{=!T1agBGCKU35Dis0wp#+p+{+@mhc^JqAIUzd)gO(@=nu97xZU6f# z$^8F=TK;n-)geQb&1R$0IUwOGaMEfKC#}`zPPqQmtR+F2G}37@6<8e9ylPf8rwYjj z8mHBuW|mXaszM>)w4(CJIm2P3RYpOrf2THzg+Q4_La$*v!S6Fkn5Q`7wa!&>XMwby zwK|orD7;=?{4njW37sV>L0S`O$(-7%0H;MXkqUO4hNHllk$l3IQ|}2mC%@*SRpYd5 zPObm!pbYBQ;Z#J!@imN(37b!Qh4zSq>ry`%raj2nQ;L&LSeCrX(?+hcHLN^tXUUYg zI{aQU(p5p3tAREyr$DV+EwNUY(@M?^oF&$k-um#eq9S)G#5BuN{9E2U9b$bAuaeGPchF!1|G+yihHMwxo z@=hL=>!jtK@;v1*|G%A?GZR(hC-@OQ0j=N1@CY7)np87>0LpU*Zo@730?xuII1DG@ z1RRAUa2(vn_$PT9F2JX72F}B0paRap=Wq?K!WFm-U%@4~2w%b|&?>nB*WqipY10~3 znJQ1^-iL3s{=Xq{7kWb++yiC)9=?MgY;-E7NO&24Z^92aI%}OAVPodxg+v0-ftS>1?ER&-C^2xo}!a zE!fYHhhg2T(bDUFP8jG$k}f5?^Vxv{#6qAeX!$|I;h>C4D|2Be3JF~V!$m-Ol}9+! zX`CvjN~`kPkjoLvfUaprskeCv5?U9LM0HRp4cd^(61C3D6H^i!L2J^jAe3}<&_>&m zVQu{_h|QrHR0QXE;_Q;n?%R}c)j=Ei8@kEoWT=F!0+pc}RD~wsjDM4~Q%DWcZ$K@m z2@RkQ)Q0*{&!+1VwcRu(>OP&euZG0mkD$!ob9yx%*%#(OH|Ppo;4O%T_Rs;Ge7#5~ z%-5OWj-b4qZ0t$w0o_4mC1qY3?qi2Fjk`DhCV&cdCQ!j|!$24S{h=QyuksCrLGTU? zfx)0{W*mF~!(kY_3-7}ShyiWv@4+b0!i?1VA46g^jD-(j27Cl+s@ZmUCUF)_1Qn=Z z<(meRVG>M*DKH)6ls2H5DX-9UnqI9CzZcQ|+B)Z1p>*(T>75M6!VcID+aNWSTSeRo zTVN$@fHklf7QuD$tR^a-#xH^8und+$Z^qx%`tJuT96>r3bo7%~=5?U-TH<=x44Xie z*hthNcNZ~!iQ*S%KEwM#Tl+pZ2U`DUiJ!t5I0o)h{L?x;2}j`wd<@P}(23fx4#FYO z#;9S%Pe279CaRnhAg{umX*7HsI)U;izpYT3Kh;JfKQn#3{nENMty4*9)k99xISZkA zXq@Klj8|0o&bVHT>jT|v9w(m~%URoMtS{gaT!b&ZxZL#>2{XdmuY;N7?HAy_!r*nd z23KwRF7X?<4Y%NH&|1GqyaRgQj3c&%@8LW67JdND?*aSCwOFsAIC?x z=Zh+;yk0MnFQ7a)1w13|6!Ht{C!mU`;q|8boT&V|npcMCO$;D<5%sI0q=azJ*-23a8(f*?60oL=Q+fsCM*S2=PS zK>0KebstItsdbfIGfNMF;H<7pq%%Xpf;CZUa4M={C;jj8C7jNgM$@~Uf!qw_hkTF+ z@oQMzed6)J%GmuQ^4hBZxPs04bCRbKh(PzTf}r54l!^;2mG^&zv?e*+S4LLeJeC zdx5j$+V_=FPBYPx_5*Df&XQ?~luvmauU&Bf!-GH_BmZez(e5{rJnw7$zei#O#DH2u z2fpFNVbGkkGHcHm17l$Z%mM?`U;=yyA3+9~0+V4POoFMPX{N(W=tV{65NE?et$*!u z^BK^-I*&LPG(%@sTugc)D9-{L7ZGDYmD6h(=?$LaLd*%w_N>ByX!CF`YPNkc< z$)u60nQCW|pTRje3!lOnI1R~t zs0}T-5^umIt^bQ8uERCB3SYrxxB|bx6Zi?fg>_6ENBjnE!yUK1@Etsa2k;nv*7{d-zGC1vcm}_MK8U>_K8KgEk{PSZxHhsRL=_%D^amBD z?qfcXfwVW#3)Js8F(d+YIWG?-AP=Z_i@Kf7i(*DvuQ?gW0ofrNsONPs1cAE4s2jVw zu&XP3M##VuN|X3ycBdkp8qz>oNC)X511MiE4Kt5SRIEM}U|4Fl}$*7#Iy7z$h3A??d|c_%{M#K$RH|!_3%Zens7CVI53A zB-*2`=O8;?StwTrUN;PfNjR;Qi9{V@CJ;Y@Wv~Qd8Mm0Y2nrQsJUbGkcO^(`+C6qyOP{bZPNm&W?IaG6N%5ea z$XOaSsq&qGet5lC2`(#n%Cs#1=_yFE)Up`}S!OUG&Euh-luP}8VD zrzO55{RL=26cbK&iQ%u{CVa^Jw1?ktzOZDoB9gQxHKf!nK*bYA;J^&pqek9(9AK-hNmeV**E1dMtq_Z)@C)WQ$lym>azhB`cv?ap} z;&aed(UYKf9#nf(PG9Co0{Zx^eO=$1(048}Kq|qU(ZuaZ=t~?07@>(Pg9_7^IP|?4b(hc=JoNpU>>!sH@<1-ow@u{rjgzd9!w%;r zI^*P(M^V!_>0mu?!zolz-vrSNoC%%b-ZZJcDG~}5sbB@rxotFFNAX@nech!T=zAGu zpfu?F8c`4lB|+cO2!|B3N-<(lH~%6a9R;KXjSxi>_$>J14C}N(Z)h29UQYowpEIqT z%6olSnIPiB9=KdEGCaj<{v;WGq;tEuPYsLKDK1*AX0iC<*<3I_PuoUQ1 zdO3)KnT($Str_2**c{%3`p^ujLKUbCP07;)bUx#tar$DU^4EiEpm9~S{_8MM8)`uf zs1ETX|A;mJg?~L?-M^Xk^*pNF?-kYh*VoasG)_j1R81QuaE)wQd7OO8qh8ku^J!cL z2!?Es6AD2HIMcOAP;L!%Ds@J*BCX1_gEr6_+JeRlxoGP(Je~AJ=msNAjvy{vjVCz? zK7_8IN#24E;1uP=&Ix=+(kimk-{jM@UH-<8#HsuQWygPOsyPKUf{z%fOsdp47z<_OUT1w|*Vf}OM~qn2}8$(fO+S0z;`RYsN2G<_jG^Y_$VwUf-xa8}UjcV<2i zuZjBGJStFmwV62SgfU@Wm6vdwDxy|VCAEs&Do9PCB~F-8nVg!Ipb(8$jh#w4ORi5k z&a_&u&Qh1QGgdy8qZV|=Ijzh5_@qHbXGRGtpo*y_oEd5x(E4{~ti1Y+?rc=rF0^zB z%Tj)oqgAT>8de^ap~?=>;batvgf**5MrGFC=oF^ap<1iSoeDXHJ4>3datT{S-YLha zgev7pyI&hQmEkEc879Hs?Uo65E$z)}feD})X{i#9|2wC>%-Q4I|FgT>U-mZl-|lWY zJ~=g11^@3I3t0bJ7x4#!ztrw;E9Y!*uQ#>4v-Swu#|G&+ zNU+f*oT;<%=xFY&U&lGErgiL@0r8)XrtbI2@ZWbh{m)v^FwaaZ6mM4zJxk!cNBz^) z#Z64K5jMbjSO;ri4XlP$uo71InlG~Wm2z((t&^sG#N9TXhT$Egx5G9_%c;sP;!e<6 zqRxT$lHLQ8NNZRzJ^2iA8t8bX(s$V&EWTX5s@x%|M@# zQib~QpQ~LB&HNz0Hg3&;ip31wT&&#LJyAunCmM_i#4I8vA)ZK-e{ZcKBYq0;?h!qp zWB&mxG-Hx6CUg2csYm2$cq+uJO?VWJ#e-Cg8MAxYXMuyx75Zb$F~+22%*NIAFCBld zuT@U3HbugUgmnoo=IYlmx&x)UCf&VwEz_h=rZLJEcNrVNL_-5h|JrqQqfUQ}xy=~v zT*cIUdc238RGjxJe!f}(PyEb$O`9YUpN`3KF6YkJhyEZ0s+v&+YbMdSWnsiS# zzsmmlT?2}YF%@$7WyoHPLPlV;*+v(W#k+_RyHAiA=fd)J#7-la3t2_DsEY ze(0DXzG^cyx97KQv{YSI*#t3=y>%I>$wyM(^wt!DiqMO3de z>1%0)hpTOhc)sebF`>V$xb#b*+G?8ORE>?lV`6hE7sczBCzNA&htZ)0vL+u+j$&b+ z#v7D)MsAjF1R1mpA?;K9fBUSD)=Y8AX8z+Dqq={dr$*-+=2lcOJK*)c!n+n0Lo#L6ug!|GA{|D4!l%|q$>K0e3T zn1!dZuj<)p!`I%lA?tx7Lu!BXauD^%=5Kl^r+)oQIUhbLwCV%j*k_c*R<4y<+TScx z4*g(-)<;0fEmyy+p0bn5iqy>bSqqb524!{jH$Nz+er88GD;}sbvv;4c&hcf1(?+An zF`Jyz{7sp>#2n2hu*a1evl^h))Nz7l>K8_QU;i0 z`KVbgwhiT&-r~ZH+LhYJF>TQ>j-On02rw1M;axkxw8+QNhb{UehD*GDjN#y?<1JJ4 zrYyC`qgO}MR!qA#pXY$d*3M_40CPoi)Ax(DEQPZj9((=B`fc`*%C@#Jz@!SHbbWQ2 z6VjM$Ifh3@9;rD}ht~LYt*_$f&8T$RX>s+x=(Q=8*D;K?nEL^yjiyb+W~^h|_rBYk zKk`YJnrVwNEt^3$#$;hk@Ptj<(+)4ahcVg<*|th0F>9DMs0leZ%a1A6FHQCOGgBB( z4z`R4*MKDEhDx7Gj_l;fn`LQCSch62Jf)Y2b{k9}&ylVAyd3$lxjM8B@ zUsBVj0;TKsCsp^irj+%*@}l*f_#9e^wUe6cg=pm#NzH+3#QsUmjWmfe_!egTKhHb69ZzMPC3N!4L!o)NnW=~=I z)FGBiVV=uJr!Z&a-6>3wB1C77^HZ3hHyPfV!VH(ckiyj0@S_x_LS14&N^_&QUwS`| zv*}Zsbv00hQ_ct{R7hzac$PM$NmYoYjBpK2X|fkdsrIS@+2rc4#Txjb*WvuNDPWmW9v%NtI7vjuwRPGwTXH)x4e z=0-iHt&z%<3#U1{5;GD%NM#mA;8&zFlfsBcQ<)8+)Pt?#YASOe+%x~5NM-b-5~Vf^ z%d?Rv zboFD;rWFxZl573(+oDrM%2Z}}S&DLsj^F$Py`4>)jq#7|*lxHsbD($1^rlGWMCnc2 znts9F&fel|<<2(jY`J#PgSv2p)PXMPkfDz%f4ZZTr)r)RX{l4?OpCSIJ_&8DDsgwMp&)8zZonw!4%n9^m(F6IYlBNr_Yykld$z)a zn@}ac+VSmd3vg=r$0nXIcm6+$l%ydNYu?!P`;C#%y^_84n=S7ftyMkbj4j|TR}vX%4Sl%@gE)b z|5%5dgAIOz&jwjI@yN(_a_gO#MMDZV?f1t{n>I*t_E?F4105^=k#lMilf5cAf^&JU{l=`Ud*M~>3cKt7k;9q$(sZU5 zIsfGuOT=Hc59i#*S&sO3PTpX{ioCulIa!^(|BpkF&H3*a_J3$0owxtjm*DkdxU)od zrTqtIEPr}Sc)fV1IHxTq6mBGrXOEhbmu+Q58&$d~cGZo$kHY7?EXbL1_=j9#q zY%MlWP6o5qW`zgj^ITz$nYg*;r0Lh^W?{GB^BZTTu0IzY6hcOwLoYoYSM`*c8TH5h zqkW(@pTb`|6Z(BS_3TUDBJX zP1wc%ysyR|2Ao60Yx6bLn{te}R&Yi$>he=TGrTF059nt#oTZSd+srQ_XknrFt45W- z_;}Xs{ekPLTQQCbd{B>{FlZ$i^iI-h)s_=QkJQnX#t5z(aH90*qH5bYnJvwj>z~I3 z8t>+QUA$vMO^@ariB^TiUvBcdJH14&nd_2Kq%LD{B-$Ek7AnW6u=ooM&G-M{H}~58 z5KoS9oswS;Gqrb8|F|&oLvs#AbBdTIEm)4_OwH%^n3u_$WnDk!_By7pm#|)|O3;0B zay=pDX!`{RmZfh{+mkc?B2y9bh_bv(gqyrAiCe=>3&l^u%||V%)fpCAmm%^@xK?}W z=6Q3Nl8Y~DtKbN8h@3&6kVCb2ad6tIOPd8EOsZDo2qw46xLh%Pg$?hl zoMg*jI_BD@6-(5pxH+PnC%A&Fi*k`QPy7%uC-Y!(YRypl3&m%+X@dChmwa4!)I~Es z)aENWqaSY-@3i*I9CVDfQ)yS;8I~eCN00QB#GLv41v#H-k_w>lP&zkW^z*XT$SLk{mL zk!E%qzuDd+5}6WhIl&vwo}){Q%^SwP`#gGF7te($axt2oQBB3EMP<{j15K5tidkplbH#Wc z;S_3zYX|-9LVC8oij`(`{JXLPy;+319sk`T%w^)Bf89{=Rpvt3^r~1fMv&&UA!0X56l0AQL@5eaq*xJ&y&!^ZY(eZDu@{Ur#)dr_Vo6(+9KtqjL z@pB-oz_Rw_8HCQQX-_?aG;aD-z_AKgHXk1}_td@Zpv?zSpuHb8JbxOf=FxyN{(q=d z(rF5;$B*slAk#SCo~{M)#;Aj6D_I}VW!sNIQBn^Yvg%!FNZ!HVZ#f{Opm}cXLo40& zX92;)Flt*mP*gBRsbWV;yQHyQ7^X32-h9V^zGFvv9gP0(=qRi}mr?bWH@vv@gG3)O zb>@+LhQSo|3&GkD(}_lhpsRCyXmbb}P4*F59ISb_T>m(lPYl>}gRN8_$^wM`ARsv2 zJl6g}3-{tWJ{OQ7&Y}k4o4AyV`@=6<84^${>6ac1S|7QSrwfO^(e(SSqzeU; zXj&f%5ncF(lJTsY(M?RnE1ly0Fw4BZLv9T;We8;~bdDGUrk$|A^ur~qQuvUIX#+C< z$h9&j-3hc4>q!m}hI(TcY8r<24)!2J*nc7{@-%3IbqPI%f?e(0Zr#&4w>{7}j4n4W zOr@O~_Tah!4VCFdR>RS7pI%gVIG%Cl&=1c#M=Uiw(n+m8K1pwO{kg5Go@6y~7qT}c zGKP0=+BjSjr!Mv_9V~{!)z4Zfzi?nER;tvuLeCnE|2^^A%w&%9LAm)v2sY8%906i^ z%IkE1EC()XZg#j-X>IFHfW-2_=2JEXY+zs`ZM86SW~06(ml0@3DO20i;1L++tUjW> zv4?E4Y|E5?W0Xd2AKK0kxqx6-Wb~s|^Q(RM-Q5TwE!}SF{{6@!0)W>2g;>S~4*$zD zdUSUHHo~Z4id5}S6C*HUy9dyd2+U9A7)(BHqM?ycUgf2&AEiWs(`tUSKe8~edW=7L zM&UiqXl6!XRDSlSgD7=h4-&?wbcMhANAo;c;5;lIM5UrZapfS|JQC%mLFA2R z-Ckg@8nzwNYDxN$w&Hvi2WGBj3gp)Tl)#XE0)z~z=>DFNwDI97nKmXvKmZ+$1{X4< z`odtc;Wi3TP}wf6GU;NQT7ia8?MLHife{)a}b@wd)+DE zvq}7R{nHa|R%DD)tA4;6UOP&Kka`R{_kD=)=WH(5trk|RS6Ot9*C|X>#iIZ7%>_BC zpx-rA9Q5@~v+O-2WOAq^DCyAh1Zrxc)$lo;^||f-oG;b5@q|HyB%9X_1o^aMF~CoT zQd2H}A4&$4y7$23X_5Qm`0!=FWL#!U$vDf0&5G|(k3IxyEY%NNlh-(`5`SWWE(5gH zg9naZ=`*|=(AW#XNSGjq>BF0t*25?sxSuhb-wdO}fM9p!`Zz42zYP=1t&LUAif!MQ z>55i(A;xn1co?;c0sA9D1;o6b>r@@qsHFQ9VzN4gQDTgs1=mNgPd8&UmGqzUpiK4( z?fHaJ{qdkCI4rM$Ixh+%zwuz9qCrS7EhlrvG>g7`T86a^=e=eQ21*5l`h|h+jK@@e zXCRkYVAKj17^S1{wm(p8j}tIt-^D4MVq-Odh4vYM$iE+fy^9oczQTtZZ4Yg|%xf{E z+!zCp6G@%1W6>9jlCB=d9lIUBFl>&y77%>#1d3;mnz9(X2F>HmYrVN~NUp)yeHle5 zap+~QC@M8kV^@iPm4hwIn>36VotD|UhBHH5YJ*-5J*3Y!Q zdQ}^)R^ zh6C3&sQ+vMYGfN%Y&^wG28|u#DGjCW$MNDiRI`~YZ@N`~b3|%YQp(%o=>uBPU5ypK z-fP3ciMA!y)&vARZ*C=E0_9EvUuMzdGX;=SaJ!RRjhxZp!_GCeVgSj83u-VTj^Y5J zkBt)?Xa6>>|mRDoTAPB>1$HgMG<~wcSu7`;8aAqjSJj$4?~RsVs$wq@Ieo zt2{rPNM6&?`X3X8m(Z$9k1k)&o_7!w8acZ)M4+kIBuWOReh2!>CbHwMk6D@hvU(UH z9s-w_G3(atZdf;e#)~I#aZSxkv|_t(n#Nq$W0Kf3E-k<3Nu?Hs5;;tR zG_5BK2*0laO4gXs<2oStY6c`wXEGTeE1lyMF;#AVIGbA6qx2#`NEhZ58WqevWY`K- zUCa&un!V}T$JcgqtUT0Q@Wp*nWS@_}LJ}#uzw*4InbY(6N6O;-l_g!D&MG4A>?n&h zdCvfF!Iuemsh>Pu*p>q;4}H0C-hEGrP06Ldi5lMW1;2@jGjFkr_t~;f{BSyD&cJZK zo=$(wKx@TkkjpG_o1)?jYBv)`!*K@XrfbU6v6(nMbDcp}F95IXOKfL>8-e7e-Zp~< z&w~8_oFT^1QMJ0=*j-*PCFx4xI`f&d9S~~lLLSTlZIqqkK~C%e%G3CGO(WCj((qlK zMHk}Hz~fn>fsDJlM%{~b5*rLj#izzo)!86uKARfPhI(4hrm3^hV9*@e&!yspDgu;m zSy9sj#HUOz(XfbSv56F(0Djvhk;8nD?~+7ub5VYqM7em@1tbXpKROfO{mb)2Tz!(R zlQqG&dy(Wl2U>3c1TPu(!RGn{qu;TMhS}?ijcE*ODxhX^ir>}dH7vxPIS@#U>RBp+;v27p%#>QW)3}N#e5tT9&x!m#Vzk~6^}}^Xo%teRyEhMa-5Ht_ zkc`oiSD>ehC~=|Ykv@E}(A@OWOTXxK@=j~x_MATimULRa1#PSuvzSr|x=>gs&@#k^ z@Tmc)^4b#}l6tv)+jcLFxJirYJ#cl)0l_o)< zwX~ zdDO%W>^H|^)rHzzZkcopt7u49JX6B)NHaBkGox(M6c=0cI33Udp?mIw~14Ny2=GT%p1*OShby(XQ zOXvb1)c2OqGKS0rqyr$;_B*qy)Hr(_LkB1h4+=;(b>n4Zz692z%`)MlL}-RRc;ub< z7cQe?C(nD~&T>t<>z&&+tt?xhhMgDCz={*PL^D9W{Cmn+0xcG|Ufpz^l7--YonGgI zSKsNy(W>n33`{1^r7##m+i+uWIn7*(sLjX}Dzyy!PDl|pY~(i!AIy?HC77sdFpj|xnu0UY^m?k zlGk7**?bQvVLMyzdmJD%T}eNE51PH_3yg1OTurUoyCZw+=s*8Mn9n&GGz&|Kg~X#H zZ;g5Ri~*#wJ*U)UO=opZSNgy&l{M9AIo9oSYshCgdW3_8xaC+ERqN>7asZWBN4YCd zmS0Dit58;7M}DhOHdsf8SE9sCe%}=E(tMq8zB{*{`bWj8R^P~D3yu|DeqKk(fYjdw zB&)jDsTNzm5B$3%AbA2qR=>+NTlW7JtU7Uisf;VXOUCc0P8Mk4)H4 z0dCFpSsJ|IQPAz9SI0|B-+R|eR8t9bUS5ZWu)F?JsE(j3jzdhAevmK zlJV<1@ggmAR#fk0>FC2Y2*Xlg{Nzxp9s<{ND!Zy+m-n!f1K z*}YM4exz)(R|9?Ko&hdq6G!br8dETY5#cSFoL;+8>ol6W3z4 zWTet=lzPopA;n(O_s7bu#Ay33 zZ63eIVARYuJ1K#2XYLeynD=(;epb7Y*96`IyCPQwYM5%h1|8o2)z_9c3G#Ve&s}sA zxNNUqZvdwWJ*nPC*eqqU5VVWZHlaRd7j52%a@sC(=I6P)C~G5nw79EShR;0H^ln+_ z5KdJv&v_SVCPV68E*D(QyZp4+!6P5H@VN`$pvQOPyJ^rSw57BmW6+&VaA%h8r4O61 zfTV4rxXtL?j(uYA_iI+HHb1p)8yb@76rL)|qV#beodd4v{XEB}%|340qu!z!s#3Q} zCqpWl`8r*UP}q;FVq0WhL$nX;lnY-(=!F{I*VR9LC40+-atN_u7b`^@2c=W$HpnC_ zopN@f9Gyu1!gXg5hI2mKJz_iY!(_uj9e+2|<<0!A^Lk@=~ zI!k;?@_vXKwrxufe7VPK%r;yuWR;1o@OJ23{X?{fOL-g= z`jF-B9U8q#mys&Q<? zLo@Wa5Wv`o9j99Tx(1uT0SF#?U~!2$PN6rTBC*FQ0g&n$$Ehlwbqj#ON;Nj%$x`#K zix3dS;v$(Pv1_xX+}$|TU2&XJ7=7z;ve|LC9=ALXb5OSl1P6K0d2&bx zjeqpc)%g0+z>tG33ch1JobCmCH{mcVn;QgDMqZ?q>Cm)kfZ#3MA&1wSbEma%Q6O-U zNeYA6=@!ZmTP+RIrDj_3YRELux2G4W)&Y16CUj8tQCBz#?X0H0GoWiu4)>O$?LZ!J zisD(r{!s_j?}yTLw4zq@Cg?2H{Xw%+IfBy_9qYrnciDr$#3@p{g9xB>x=e)6tuZ-nTdMXQfuki)a++EEy!aamO77!-SI zmXLJI%QwvI{0wk;B%^^rhI+1djP?Qu24U@ z6@4xs*ihz}n{7Uk(<>DaY`Ot4HC~wA^!J;}wD4FRBy$ew|9zi6fJ1$m2jYxjl5g=E zqmxH%k|E$sEO;n_H>!>P$3o^b+<_WiWI+`p=kpVK7x+kwZP*u82W^}`s0&}omYOy5 zdQ5RYK^q?2r=2KuR!_vz;ZSvOg|8;fPmn$kSMHB-o&dFcD@S((knBvfNviTgJxCRSl1Yk9E1w*alZG%UJ(;y=>W1*HXS&r z@zKwJCR*)xy#6Em@s6D(DM|j(#o&S z?(}uqBFR0K1lR*LY$N*QE@)BQJ1Ro0YLrWpPieaAi!if@&Jb`|OS6uY|1kMl@I9WJ z?$Y_x`dqR)jj=ue2wpzFJFj-^Hc36+2ysEK=`>2!vFqOug0%ah~vYR?C{PmlsDHA)2Cw&H09OzbC6E297k=bbUdYj2i+7 zws_Bb-&$bRaaTnn#3a<{P;+AChYNil++S@jIqEQlX3JktYz8<>2L#*1F6Nc1gq1w% zFCd`6X4hVj-x-YN>lft0khU*{1#G?h-K~oUmPZ;P-Ct5FAobkz)Ca2#}=d&8Sp+CP7lXPz7 zSF2(Nxp+YhVP4n+{0%j%WRtVX-0gBzb6=`KN&!rcw<2P-sClQ?)22q_TZf^e z6&Ezss$df=nc63nim%!jIOSKKvQj7tnaNdj>w@O29QG~mfGN2g&}?X$2VEE(Gi@mL zvI7tU!+*$ct)kl(H5K*y0m5CrcdP4(kY`muMcSFTB1zE(VF~kv_~i9T_H*(A%m#BB zbP4P#H<-k2M>pLtjY{%^-nKZ|d4z7-3DD;AJBSkw^oL6jLD)&LKD0d+5OCJrBo`>YNI?>3RLn(`JcXWGqDE-gHl-gtCHk(73SE~E?LCA3rE|om!!#8aT?%U ziq>8Q>z}qJ$;6JT|DtIkcgBvQe!&iQb16#v1wBkFO_{$yChtoNsa17v=l^Kz0_4xZ zl#o`Ug;rGm8b)Znl}ZX8hwSrQ@1YHQz?Kn7HJ~5+t;i1$`V1N3$o-`CMT(hZNNdJfyj?0WS?l#mJxVo=o2)8ohd*0sv%^)Mh zKpUEP9lG#INMS=ox&X9)5xY=g6|sm_@W!+K;Q=(R{Fh=*!Xri^E-5Twr>6IkvnBee<)Yo;Sf7&SqwEX|Sh*{9gX%NF8TS3Ae!IOndUah4;#{T+-oN8V?ik z%~<{v20^o*E0Ikm&;u(|y-Y+yA}R~jIMb|MGa9!Bjv*i=wMHB;D^q+6f%BrxK+?VM zDs0e7_p6}bLXD16;e!i9yqT9y3n zgL+m~VFNF;xzg;>&;{_|l#uI_s+4;NOuw#5F~0#)jRe5#MZXx@_f@`7FwMoLs*?!*2^_`7eu8%ET~3tfY7f61Z#7{dq>@Zb2IK5A=2e`tHIZ zV5~V;jm|OkJAfzy+?!!fFJ7^UfDf-w|GgR+xcBA`q`M8s@(zO2(dN@OSpFG^0E7bR z=s>=JP)cBRYwKZAQ2+-yP%;CKb|9ArC?`2k*3*2?KRHnS`%pe* zXo?n&!rZ5n@-Wr%(Ea-%(-qy8=vG0d>EK=n9BTsi(R3ah_(V%aFN0=!Y$gM7fUs>wsFv?6m+6b&~z_YhX0aEuq%XQZv2GS2@zv6Km=FzM(> zDVSjTCXPba=7dknSlXjpZ+Ury#qmK6dwabj=6v%@Ypsn`14YEo3^-EGBZyR8muftQ zDT7H1f1FPXg;u&Los`DZ)^0GdWJaNB4_f= zf#gj3HrsME)r^i>j%Jwpl?!!$4uPv&Y2|axIbCa4VYRz`^exu1bX9yt5R1bj-etp2 zjn9QCDdNxp$q;>9=`bMl_FcqUSp7zW0geNzKSVd=kn{QWVha?Yc<~$kSq#8KjmQ#vj=(2P7^ zV~oxLg87Tu|HT+f&-!~M-H^`ku=Ndp4LKu7e2q&XQag1gPwMk0_&(uD30xj;PDi-} z{A(^1%6+^9SAloO_pUQDsR<~{`=&-MXuw|>ebZ?qS)OfLsH8i))9xIOD5i@Flem(m z*T5FE8MwL}K(KC2T=sEMV6onObp!XjSusI9i>WvC78665OaO>u7_>0odA@CId03-aOTSZ|8Kvu+MB*;_AuY**@ye)sr7 zhP?Y4(~{EiVd#dm5`i6A z-;*Zyt>DX2!I;1Y#j!^AJJ>yZq22U7v`9IG#U+mE{EQEm54;D39`ZGy?+r7aU4A|2 zIVf-x8B3P?dddZasVhwUl?m*Ui7QMpF0Ma${SDk=pw60c;s~V;uT^&psI!j@>L#uq z$+&ISQ#^1@U4N2sasBBqAUJfA_yJ}0bqieZ-C;696YN$F^}Tbx*3a1uWnmz4ggZo; z45-|sQEs{@1myDHQ_vNC2MYI?>VHIA$~`9K_{T)xM7|rPaPzObp&%&i3q-!9CiU_k zsudv=f&D*w{rR?Zqf&(pwl3!#QR+~+4$}DZl;n$Y`Nl4f_fKE{`vFlGV1&9C(+2hyqM_at!q-mD8A6R%0srNu?gpu`!K4wpbCrJbE{Pn>h? zWkD2|gFBz^I*0HL>FlbdQ;*3WZAeJf_uUBnKN2rv#1oEvb7g;q*Q$C&zBXu2#g z8n;%dUcatkE_Vz%dJ8ptLQvZM@n5kH}srK|q}N zp@x#=Ynj(dUTeBO*m~Imqs-#3?P?5P#%m>uu}BOBQz`A#9`m?mF!Q0_EC>PbBOgEHB92d^dNF0~ph!Uw{QyBhD4LZp0=apCpGA6UdHFDwa zd^uZOO#mWWTxV_&dCR=ZpoBEiz-nG8<;UYhu%7}bxfI=sOz$WXcIGFgP!PG}3OA+n zRbfqmms!#kOrs?w_?3E7AQhL%6t9h>gCnI4MP8ix%og27YTbh@XQb9W=ZuomEb@D# z)-ClVN`)t+QuO9$q}KIqfRa<|mPaX4>sBy#H&c=%!o9*2N#;r^xo!n>S2K}bm;dS` zCD>JRklLw5Ze2S$^(8}yl%#edO(hS2NIHu2yOJ^Wt_s3PH0fuLQbcEqFs3)%9wu2IXhR$Ji&fCsf?;13?DY^ zbzo%_PK@|6Pk9>jX^K@P{jE_K^4e2G{b|}%xg8UuoLF0nRAZc&mvvcbR#B}_)uE6o zQmTX2gHxsEQv^j1mC|&oRG!1i+|6rU7K1TaD$jfcN}1vL#9gpq1yqrNJb@^*CSpQl9hp zRyt~OuodV}`4HJrd4&!s||DdDb?msWWRFq!lH)3s3)EWEU0VeI+*_V@51i}#5snu}NU&OAT$Gf_@-|9-qn3A0pNWPjQ4b{wqC`dHC`iF1 zO!|fLb(74@L*H+5`=N<+GeWvo=$MLyWj4FLOw^ zxWuCKgi~qqHirZ;*qVF+p*MMnMuIST5k;yg2G5vrP2LERAO_+l2nQ`LuCS@{W8KGH zj6CBKOEz=nF5eXi^;`MzYSO-zMu-&n=gmQVzbvzd3!`4HXz@DT2=O*h9Q)TFR?*`3 zV?)~+YbxOPLKxTNO%#bUlUHP7jK$5o42-D94S`WN_B5~gnQ@{mNM z;OFjqFoYlzZulXl$d`G27aPPe#ktwz#%}js5@2frcHuxx zCHKPBHX{TVRr?D*Pd@h89G#Y#E%WKxkgE7;8UndoGrs4INnDVItxBO$Fw29jDh$*S zdyJz}E#OD*9zk_mXyZ)XvB&3994>t?!}p1?{AxgSPn?oMCLG%^(?(Ec3#dxbKb~Y0 zL1n$QJ|!A=$FFCrLEpJP+>rC$RK27fi-Mr*v_KZ>fuy0mhu&`hMc*hYc6vnGZ3> zgr>p1FZF z)fQ+bf6;c-$sR(CuBWI{D{bfn&86mGXGb;}Ct3_@|Zwv^B_YtX506E^4id;Z6&ci3eWb zZfzs+e(M$sYs-er5ZEQvB~)f^v8b$SNMTd7^`r)9z&vd!eEF=kDCxq0(T2ex0U-i* zczX*iJz1}H*ptypyQUR29jC3lho)$MD^0J$wUtS!udrv|Jnfg|>EQR;;(MGoXd9O% zo4xpR&2Ft#B|3Bgl2msCJP!q_E+Syx_X;SrxTvjZv1iydZE7S{K7|)CJ{E5pQ`S_A zl6&?~v1n7bEx2}w!2c}5pdkitXqzD_B%lGS+h{|Occ{N1C?MEB#L$5M3X1R#4-WPZ z4f~X_Za3M6*VLR(k$@C$(6Fgpf7Hz7H=n*APkJWMljO6 zD6qUt@!%9Wc$mre0l`B8hJ_CgF+_0+Zk(Lz9XzG4RUKkt9QYN^U|bwL9W?wQiwn8- z)atsJV8zKu=M%1suZ1c~49YFJa!U$PPg6v}^e5EtERku{nEN@vwJ|e^pV*}8{k2v0 zIBm7KrJ69ROGKwgU;ozOr(iAdZ?s&N@Ql`bcsVq7hzuD!WO!hG{N*1S5@Z-22n&Vi zpZw#ddu8xPd1#SC!bT2>aPB!IA~IySK`Ff)JWP^Onaz6<++c#;Y0eArW{t|~ z=8TOCdKH8yZ^Bn$9tu07W&FfEIx;)mB(AzeMT8iFoJEnZbF^2du|a4N|JZdv=vMj^ OVKhoR+BT}#y#ELCw)?UG delta 110703 zcmeFad3;pGy0+cj(9jEvf}%hqBH{o_ltJiVNGpR3Vq_2mfG9zex$s}PNfBdF+h1{M9TdsTJF_PF=i@B6*y{6+sDcRg3lRZrEb zwR#0^yryl{$A?^bY{%oe-;_RXcgOkjx>cp!pZ)B_qS1fP{CS_tk2z*~O{Z@z8a<@R zy^TZqJhXIF+sbjP8U{uvR9aS^UsfIp4aM#d3e77nEGaB5EGxepyD9c>kx+N_dySoHn#=mqiR4mcu)}ymOYO`4@SR3Ro>5( zQ>lyv05xELKq~qSDtk7n4DBdL4eCN-#oyuL8=*wa>(393$W6_xe$&KOkU=eK=!L`| zhK`>$t1Q1X6qnb>$ zq1DhYWe)d4%gRejW)_D+Q)zVz?E6TkhMk9Mq~hpNXd0^WfA<)FMbt7ksyG#+Bl;7y zXz1TYRltL&;+Hvl1L-w#mjdauolEr3Q+XHZRM8Rb?MOC4RbO)&uBn+($=nERr8df* zcjghH5NYOphHB1+9cf2kE%9oYLDi7c$*1(+(jE2aZ+NU4Tv}LMnl~vFnp`wZz8SiY zOlsh5D1$lgdelQNINFX_lg|h+8uK_wc?p&<#`hd z@~@yw)mfHbe2%<%Xaj4{joY>@AYN@eH^Y^Kt)ZCV@=dbwmGge1v6}nWdfE)FPp}Ek za(XMOMwgc!PZL6+FG;V}P>ZrP%zGx&&TX=Ruff&O8+uu%dk$L-smLoXQvNTZ)~CM9 zQn{6(c^?swbCgaSKdqd^Z;(Lie%6ULVXKquI*y_Tz<+?N0sHl~4gCaL`4di$b=nS9 zL(WFE(VT{=Bll3gR?TJT{*?sY>1(GTIlb-s*&%xnRROo5>gn{EB^48`#A|<8Fuy4hcNwawKNMBIviupNZN~@Ep!UR1DN7IhJ+E}~ z^t{rt{H|kc1KOi%@bRQO5G|TEVXAhJ7jtX}4u!YSqSz-0;H(X;v+s*)2D+VT8_)sO z!0m*~H9kc(vTvg5>Ec|QZyTx+nL+RL$s1?wmr<4X1e$^t+Qj0v{FT2%2*qT**e z9gbG2Wryb52J``F&hEul!Y(dh(ub0+b0ZZg-RcH5-)-#ZN?*nhtMiEh+wmWc)Q`CHdvWd1X^WI|^-q`DN3&uH}VhPO&2~bgC^VzieiCVNqGA zzq5;6{N()d^qHlFq2$%$0{lrMRDo(FFQDAE=rAgloz$Xfl@s&IXx%^;aiY^UXnPVi zK~+%lym0|NSIf(sva~0Z)1zI}ZI4IJuobi+UL(5`TN`4KF1@hqV{AF&oupU%yh;L{ z2$Z0zXaf61#q|8pFN~vx^b52ZT8qkg-l70yBvnx%EMum%`;uP;Cr4@|TY-Ao8`az& zhpPNG=mBVHe%Z95bMix#?PuGeX^m>Gnxd-U@mY2%lGlAK*XB#O_-5zX^k2huB%DotO}RHWP%erjP|plN6-*|9dfuHLsUc&}w=E9Q z@;2D*Su&b}C8$PbN?Cpxej552yEXQ`^X$f2g=*+OgiG(6Z%3#lwi+l~wB$bDgjivzyVNY~(-QVd*rx|XJk9NA>MYchYp{k%fuQYuUQ`GBXI|5gr;uoN* zZ+sE0rq0m#nUf~zTrquSF;#{_S5ts`KB0hp0)8L1hP-^C&6tO34x2Bs=}OgoK2_M_ z+{Og<71+VP!i6+FZ+ziRu7UH>zz5LEpvMH1a6D(f!jj2l-(6;V5^_EJo^`Gkf9BL% zY~yuRRoz=0H%sgkzUwptm2Z@y>iI)g*r`p!)?uyj68f(p{)7V6!|+mD(Yh;bgLc99 zg@28zfi14G-dy9-zveW#ye1Tt;l80zgmn9p{$A&HvMKtA9TBegRkh@s$3KKV_HeZ>oi=lFeqqUsnT4hKrQh5f%v9yPGu=h2^{sa5 zwi2PKe+<=^Or*EOE=sBkkI=$8DGN&Eyunj4<4Xw$~m;A7v#^LFs*1>5dV;dhB>&Gz`j(RyomgHvhrt7=fYJMdStC#9jj4|&htCp**jgGiMohA`|II zsD+FF>0$rA1CGu4>0vvfr@HcHmP{|?;vG84+1*`o&uMAitn~5ICRXSY&uJj^$rHBz zKPX2tRr;hYukcC#gciqE<~?n9r_)h&YXGWlWIFAPs`*Ev%HGE5{!RpeD-lb2Tv-D(bdR|%CpC3k~l1?6ZBX!nP9|^Isq|2d=qsptzWa4MrIYj6 z6dAcyZ`u*4M)kC9p8uvl<)9-Yqu%nbI;clw@}?;H*ke8Y(ahiXj_ps%7W=g5ADiu! z_wT5-{|C@R(Pd~`bQXFDIs$Ev#?dr14NXP=pghH|rhIiXqc#|)%6aAa#nU;Uh3*Gv zrXug#1j%hTsY<7DxM{fUXSywbdlvkVPcq$6AKLz>p!-tZ!Ojk$Du3=)8()rk+9HxS zFW-D%C*qlp>{;S&R4q*&if+PI0n1U1P_iKdKCw4Zcx`Z{ZS|@3fDb576Z0afz3(4z z*^fAWm^x4ic=9vbqU23cMc&LgMWImWyw5E!Lp8J9-v(PovH`4&3EE6|Z?hGCfgV7* zt!R*5H?Qf%Wp80?k@x??b|AUNHo_|v@fZR1Y*OLmne2w4i@vlyUkTT#YCl@4g0GC& z192G_oas~?{l=caKmFSJ!t-cb(yc-@*OxjiM$@o|q4J&XP7nT?@t1Qn0JK8C+F^bA zZS)}QC!OAbY6!1!dI74bDRG+PbP%ewbjgp_d6Soe#&BI3AOFc-c9x>DFaC+~*P1vF zpgH9X#L^0d9@uH;>K3P0JDrbeB&MUP=q#rxs2Vr`ZG|3>D&1k|{^<0gymDO#w|r&G zS2F`{6|xds5~?r4wC7? zM_%Ec2Q|$|w=e0^BH^G@$xS+W=l18#I=RI)AYTgkk`I1(P?=v^I4$%2YQ~>;`he4$oL=cPosMcGIh7UcJEbfXN?x#UZsC8_ z=GZ0+4zeRP=O8~d?a0bkTH0|)p0$&Y0+Y`ei(1)!6_(|dmgZH2&c@b;FgN!nPKSJgt)7nOqN0a~gIvW|xCXVu*39$FXmWn~j8JlK-Vd${ z&p6y_e^eeeySS*UDoRd3SsuQLhlGA3fePw|s%Pz7#=~4izdL=;=>}A;_8_YCH=@cv z7gfcDF20|O?}ln8`iJY#wBpH=3ny{%Dx5T{vXon;8aI@QqwSC;N2DFDq!B2~FPfNN znx7vm=A!(HtB$ehig*x3`$Nga+YqkJy9N0)l8v1vPio1d`gdWw6_)1DIBurC4ZZqU z+mnk>ZC|rc&0Sep!StzAuzzPe6<%lmi?)YEDv$G<9C~Es{#|V|k}f%gT&gzL>9B4# zK6!ilJhm<+$=h2V-f5mgLtXmh_XPd1<%!AX{8`w#SWdwEintSSPnZ3>4{aX#HQj%j zrhJob8@P?0DeDKQvTVq(oQ}xnLM3@6lF-RLEq@AC`m*Uoh2`lJ@*X0+rtpaqtk0~* zR+mO(+9_X#t*L*5^2NvW3Wtu+KHG(Wz@jXhU^c2b-v$pxGGSNKc(_*8a8yot)`>P< zA7>wj%BK?K({=q~D$;d%Evm80=xrN(Gq!xL7;UX1Qt~cipFVaO+OL23s*wb0NOE-~ z?`)H|+R0n%9o%#Z;3wzsKVr}bv6x#|7p-z5bp8R6HK_h#VN`7yi{JMGT;r8fM?@QdufBF_T`N}}@)qrG=E^TLr zbn8&N4h|j|4(2x5ljIlcf9^oC$H@^$etn&M#o*h07=L-~zj~G6U%f(*>|t^Qk|UJt zadL!`Bbc0uKff99O(konB@IZv0^l>$nv(z9Z~Bu%{ojAHZ%?z8$#3?PZ*BbfZH(kM z@&Da7{x1y+htg^I9q6IxpWgsTI&Jc_;tmCs^OC2BEhUl_L`AA zMFhtcDoh@ClBbsBaVUBGNuElQrx|}F$#YZk*pocAT)?iV zo$#=0?9Rz97u+CB)r}vYSEkxcIC;`cer^3Yyjdn0_hT#44p@k`M$bZ3;7F&*o4<+q zMI2)|zb`9ja{Cdxy4>I4sCiz@o7U_3FNRe;djG1vYUT`Qz`8_36+kw)D81#YaAv)${(&13NVI&p!1~fBC8N`e<|4?F>4ogHn3Hdq5ferjBfxD@ zzRmp9GZK-foB26N+va}N842%vHsImOQoYx(`X{aELF^R6{pvF^qt_A|6%_7q$=TD2 zQ3v>`qZ8grplxVgc0BU!0e;o!MD%3*g8q%jj9k;gPaTtpeAOao@?dt>kwKGhBxF;3 zd!V11lkhrny*oQuePq!=epOB)vi%^xhPV;z8l#hO(L1s7{j@VOBh6d+Rbvxge>Rbv zy679Rh6T~TxAJq&Ohk{x&nEb_IhoO=glzSn5$YQ>q$AhMv3}a=nb8G=a)Z!TLPLU3 zXSV!Ig(8a&_H)K1B5xk-S0Rnt_%-7a(IK3p@`8l-5IQRe?Z<_9S`a#)(8wV4CLtT! z75}3#_(0#bp-@>6`w*c*g(7Val`lo-9jZiX)5nB@3L^d5`89coXjMDDHS%loG9z!d z^K-^0yjF+V@sIdh^Wt6smZr#B54pIg->xzv+}_Wbkcb+d>Ex(@=(mIh1hr&vtvV}c z)E|U$gR!dQz%p5($R9`eH4_uj@kjFQZIJOsLS@119&nUjm7j>5bCh3`pYV?A5Yjhs za=vkK??tTXNh@+fN55)P!Yk>>oer?Ezm+6UV-3U#`*~-^V@-~x0xUD^frg#^E3;#f zfk*pQlM~)jA_fG>Rt}GQ|G?^n6;dXz(=nk?KN~kG9+`fOUsaHZtUAW8DM)x95_f!E zT#HVAPGQ39*C`Yl0c@ZaMDFV3*AylqyF2-*QxaaU^ib%8AOow%I|s{F)NV}N+l_fy7*Nk32#Z4P^c$yP5hO#?R~7eUPKP*>gP;Lc)9G7s=QH2DF8#p^aM$c=$n9ne)YIa?_f%h zJ4KZ(lH1F#nw{|00nZF_uVm#Mn3Zgl#{KjxKc^xQxiHJGsz`VZX{~Avo4hGFMZ!;= zlkk=Som1lW8xwxjoJ8cx6a589rkO7Cmwa>@0t4(9^9M&nsHTG3)>)y6|SUCDf zEG=KGNpY_lORdJ4$HpTc^!BUHOL&JuGzDS5-8u2-SSIdXkDoI);e7$vQ&+FP zw&9HQu8bIle3R)thh^T+T8v#@JW|xpuR1>wdm2aqdo~QO;mLM4u-o52EX_Fm!guGL z>{nGLB6pwc*C0Di_EYC2yezJGl%htn9_C|d;u{77|6+f?W*%Gp06%qpB9a*3=gd#U zuA;fh;N0;sF9uL0toFiqWZ!{)>IDgJ6vLv%dw$-p84U+%GdW=6}Eiu60D(t z#T-W8QJh~}nCYc4-Wpbx96VoEz}FCRxyQ$&-(wx?r%lO>bQPea2J%m&< z`w{DN|I_NmjA=ik&eCG3!qQ@)?F-`GHY^-fV?*2#_?T8XV@=#xXW2z|J(i}De4HXa z91>hCS};273^XT?`5QFUPhFJo&IQV4NJ%%J9_m*uN<@Ae>enEBhWV+NvJQs%IhQ74 z?+>#BvZsIh47Vf_tj-g#v?Op}=Dx&Pw1PR7=~su*b!r$Pq$qRJixrx zChWx^cD5PT$RnrwRhK6skr93ka@Ghxb#Wqc{Rlq?**wCpLi&#MYmn-Ze(DmAlOz2c zXSip5f@0-ChEaIY94+e{7Vxma?XpnK70 zu(JF#Hff!m+&Wkik7SJYYpzU0&j)e>x-v8J)M!6vX~G*m#!gQ#1>Qm|n@1P8C$Z!J zT(-;OUZWgaD+9+B=_D)$$St9(u#}JH7sS1{u;dOjzbx(@FgAHqY*(ET9_v^6iOB6^ z{Te^veMJ--oIK^yxR-^?$_iZBtH4qrc7;8BW{~gqGyT+M2`@W0IrMp>GGZ943QZ_i z1Q){v_>nwTu?RzY`?&aBY8T;UrxOX8I!>>V_6py`&#llN&DcLda zsPXnnVOQ-aEbSA)9vZoAykD~-5&3ewpIXH%PN3m_?zqgzw-fxTszhwyL^}p`mrL&| zM<{G*Jo+A1Kfii$rguz!vM2H#Js+0u*t?IXu{4tQ3bfB8Kj*qcWauQn>bgX9(WFqQ zw_iInGxFjjzvjAxmowQG#L8h5)?z7ZOb!r<6!=xu3Gb8wJ53FPL+YhinqDusro84X z1_N)}r!d)dEy`Y4*6%bEYp}G=8vE_8%ZzF(u`_h+6x)EHwcZ_AiVHSzZ=b2j71Hjq zj2MP0#*-@I-ZfaZ5Y67pE{;N2X|WP2}{$4OVPI0 z#kL-)3G>YUzZtKQ|wpWl<>9zw6iu<;z;`vKlSE>H>Skqv19H#D;T55rV_vA z=0r4onig^Od705Egg6~8&Wzq;LqjqnKTY#%Zb^90PY;DSht1nx*STnPhMb#=Y-}8% z6X10lV01Yo%dfp9)7!5!6k=~-zE>`ZdwLZ^DcNaD=)@rV%JVqmV`KF#!OB#lqYn}qtR_aro#W@M=8oqa+UDo}(yK86t%E(?Ih>Z9s?qVL6XIf{jpmn( z@GQUT_C&1DY<{~$>67;p-YSUOSIXj%PiFf$cW~obVZA4~3`9(YUvozywgLFhLl>Dt zUfuq9a|y}AS&wWMFJQ4i<%(y-y^iPBZGQ}F5tiM#SYnae&-JU;B)rt~l8xXD6*=QP zKlQGJ_ZU#F9qjY51Ls<+uBYBeNS~liZO1oasdY>qi=+mN!;-FuIAYrQ$?mi}EgmU3 z->dBdrg86<8(JuhBDp|4Y94Qyr#;__+i$}*}jSk9xl~Avs{H7PWI=#V!baiOz zx5Lja#2ReNVd!4L%EICZKRh07x*%|TKQl6LfuHk0B6=~PpPzeMruQNtPIg*`m2t1_ zMRwzAY__%zXT-2Hj+_&Ti(Q=D$Te#Hu{8U^;V^bBmQq^pcx{RozSz%sDB-1DV(*?9 z&D9w(3|$G>6ll|2tj@tWt+~X{c{t&H>!O35**jvPE#GcD^RfDn)$ZZXV97rl1t*WT zi|h$1n7`-*tWJI!j|A2bI?Ydet59C~}#d8v4kFbsm=d&svXQY4Dl0#qn6=a$8K@>WG|jxnK2YB688?e$Asy zGVyAEa2$xXUQFuXvXMuqD?GS=_IxZ&8XM$9{BnuiDuRtD^2riEXFU&_uJEgnbFc7g zkQc7-Qy))w`&`MBDVHxJhA|?jigTX#ES8GgFYtqXmj+%sIx{kKsgAjkCCC%p+rhQ1 z*or$`Wj)DSWmxfKT;%qv{HiAt-bX-X2-@Zy?Ayx>tCky?!B_*58N92olrnHc?Vn?eJ@#$&8dP_p6>wMDASf*F2l>nyje1L~_%+WZyibVgL{xAdj5MqAbDmE`$5jQ3eR8IEB_VkSdk(jmuT=S| zFC@IfueFXETv=nKSizPXY@y9w@)`m%g1eDl2&vwvzjaDR>^kcdrKz zv@OHmysxpeXK_Er`FeP@^**dI@#sTXBZD2L>Ggii#zb`F^&Hpyv==hHDniP}%yR4T z8ZN;&-ZyTPw{G2xZpU>7M@n5A)V6_&i*9)dr_>fz_E%k&Pq(YA(JEssZr-{_~l zobWCMW|Ek!x@Wr4uL6cv+BL+L>Ct$k|4Kh~6VFP4$J=(WuB#66#G#Tl+^? z{ex0;-tBOkt&eShdxsgf`KfOtygPv^I@lY$FRrstILnstWu4V- zZAR=4+r41#jV!#wPklS#Jqc8Mf&+Qvmpl9_;E+3QLjtGvuE6R+5~hJC8P8$$^3(o) zVpQ4ez-6wn6U>E>i^Wu|48PjX^lnzj7S84JU1w4Mri|EKHj0~++u~j+R=>L99d z<5f-X) zRb@29=;2qNlj$9CzdcbfSC3{i#ONAqo2v<(9HicQZ#?=nRxeX~BKNfqB#)3=N5o@= zSQ@~>#(}`wJS2cF9^BT()ObtO|B6(IIjT9c_Jm;SQn>B{Q}G8(}r~PV>YFI zzC9kRGj-X~y9&!rv0UyotP_HE==9lSeR5*>#vz8GDWLg}#-pWJolROFW>=vgix$co zSQ){=uF2y`4^@NuVY!Z+5sxjv(*9ewn?=_uK6qZblTackPZzQtPxz_Z6W+`xl0DEa zzUB$P3iu6BDcSG2MNfay&J&&F7X4f-*Ab@qL1!_st1@C3@*YN>C3nPAb=MnaWs0+y zG3vSgDZlE=gjWmfPKK1=YmV7Z+rt61lHnCBO)=|*3EKY|+sj~;d&8X-On>w$EWU9m z&h%a*)QdbgB-g2Zp7pDCB)mb-)-|6Svx~4aKz8}Aa~9t5aNOI0rHPWVW;<3F^70U!!`X=E?NN<#&x}V`VGT63XEUXQG_chEN=EF3 z2!52`+fthU6lZ^W@c8N>_94OwEPK(C_kQ5wsALE0=0)28rgALn221&PKB2p%m#k$swo%R^jtlQnEDbvK zVQq4j{aVC(*-o3?ghyfZBW3V(+PfA@W8nom#1>~YGAkQ#hTr7Z{FsRJ+vKPIl<+Rw zWRI;lMoHXz8%z0uH5VK8itSOI!+WbBiszz6dp>jV!Ay9aUbVBtjTJ+li)Bj+CIBmw zeD-UQx3ScJe1ZOVc+KuZw0vSbx&&*GpLS8E_m1Os`)~KU9SQDU9?6JdxEZ7w%dq5j z3=8hD(OEWI=Qph12fMU)G1fp*2AfFi9V|6tPxqR?nOq4pIyww1xF_`jDYLd zaVd^e)fzgV33T zCIz9V3E8}D-eZLZY&xMJo%b@KzP5FX<6hrdJB0Wy6F47Bdjnq~9>>86t8THz4toF3 zPh2KJco@UC6gLu*S8=t)dqxNdN$Tz z;`Rw{!rsRkg~cM^E0*pb(@lLr6T66zYTh&H8zFrlv0%e%`U(E#=boAAokd7>*;cK< z8iEzvM|j(?4XL zVz4ymr4`fi)B>xJ<^jJIgie0x$Me@-U>6?i{Ra z60`ktC_89}scOb(9Q6$^G(hbVU4k{C&iWQBug)6&4_=3;v+n&TtJ$}_AW;`rj5RiC zMK{ROi6q+oI~K61ZWhjro=b3q4ZccnxDB@Zp8nY2j6K1p2%ctY4+!@P|6o#Egimbv z0}nWDvekQnKkf)L)uTSH=*FgMt<5)BX~>Ful{Is z+t+%|ukhz(x9adYFkgj`=D=i1^fj0G@Uu>M?e%Xv%~s;bsXv>lgBaPXezvD|cHvU) z4zTQHGmqopvpbW!@Kz2JKVT`&dSvHa^{t{k7MJ%`SaKbk@(V22H(j)Tsk3mKNm#n{ zlahRQVx5}I7u|`)?I#E86Mn7RDM&R3ORh+s%j1#zel#&sHTHj)I$Kq+gh`4v;?qo{2aSoPR7wi+!8?mxYZfZEw+d=R|B7!@I z2AzHnnRnZSvl>(oI5;hw6&)O5Nt@a>Bz@+0TOvuh!#d;-yVjcrk2~gKokB4z4EDSi zuv8lsqn#282e$|ZDlU2&7LRU9d&LN7!3SF!zkV1_UMBgTY?~4h7n}{fuDlg@k}d9y zj2MO+0lpylTiE0r%9w3|_6w5a{g@GpgoEj&vz$mLV5uIqtSjQtWms&oJS+Q@kg~8% zFXoAP16!lr?DMcR(JWmy^c%3O6X>DARxC9jriU)E0~?0z^*Q-;KlTblo!_$?wTOm; ziQ!?%195KPeq4d2(y(|KvI&d(VZIiN@~bYBEXTQ~V)epeYPnB)5Q}Hf+=TBU zq;`5{<$i3={Mw6k2km3iuEwb34bhhnMpke*3-*J0UwD&-3- zm1+0C!}x_6+YZG|#yWwxVA5kNv6QmzDAnLoFYI4?T9((2-3Z2=#ZZ+P^M1 zbWiY_J;C<~_OodZJ)kZ)(FRr49{5#V(Cgg7&N3s#@v;O<%Y0w6wPiRX(tZ-MF z$5O?1SE|9Xd$sPl>VQ_+|-1BV-d^=%VbY z@IkCS*}lb6!n z43TFx(-W@fyI8EN-i#N&;$$aI7w-qKYz=v=hUP~k-B7#u$yoB+ruMLkC1+q2knbL> z;nw1rLF7p0M$fvULkXQ4JoUPcP+e=IAIdV-)E_>|)btLY7(2=?F*{cGVeRSYFIcXL zbhLkmdcz;R9E%+&PDcps$#Y1@dewR3vG&Zwby!;DVY6}=8#`7Uiz_edDaJ2e^)R^^ zlt;*J$L%i3kfH0GJ@Y<`r3K=dtz9YL80+K|z)NvsjxnkIaO>-!%5E>{o3Z3;Tp{Q} ztdsRF`+TB5)+n2DY&=?x)yGd8p6Pv{5S(RtRYoj5x#@87i;PP*sr{*>8meIrzHf*$ zI@VN)-gc~A8k}mL$%tXdTZ2=zmw8;>u<#uJZ7gji4Em28Iyxtpy{;tVI-Asi6t)5? zzo8!-s$R#k{m`}&?vixdcHBtBv9!tT*+^zW-15IW?%joD^S1jy@1wjQQNG#pQkv+C}NrIEv5*f>k;;@FTQ zx5rJ*5OTZ^wd0b<1M)*MOwLf~*bLjU;I`NMJC@RLwqcWQ(bHZ?IK*?)G_0q|8AgtI z(B5@*y@X}^sT_?@Nbb41U7d}kTUjnkkH@`Nv9#d0DsotCnQ3ZAF-z9rp(#oGzIr5I1x*74Al zuL>7oX=6Ajc#{4W*5IH7`N5$l+Wnkohgj3GG_$-Djo;qq;#hxJ-(sCioPDIwg~DbxKooG>eiVVF^myGLhTV7 zvCgQ=);2p?lZq_Ha$EJ+8L>KpY|-YYQJcvR?el@`MiJZ~s5bjp|>hZl| z1cD;W%6+)(VA*NY5#?7bx0T-=j~+XeOSQ=@;VMQ*OOCel#rdsRn%uzeBEJqbsrd~5 z&|xMAjqV(Vd+S$;yuri6p|fqeVR}*4E)a5E#P4QcX@OYlgBkG4*KlJS=XoH)cj3AT-3U&d-cC$O(t?O?3g?EFd^62sT)k z!@Wa(me*!%{o$H{)wiyW2gcfg-|tL@%??x%!67#ID8bAi=>0^{Znb)qB9R*o<=Heh z5IoBUeQOGo`;Z&Z+BKWG$ELR=mLTiz-&Z6B{Tz}u6upF?ov!FB z1Phg*SHrxzT+0bkmS*->OBFnGd^mKjE%qIPwuV^71Uo}@x9qX=A@ah2m}afQUU-73 zDa8|io?ueT@Wj3ogLPS^rV#9J(iGf8aG(tym|vG*3_(X%66D5JX?GBG*}6?);w_y^ zkoB$vPZ4z4yvcRhMiO+in&4?R?U#EJ#0%=molDTAeU6|j*DI`}!w90H7GP-^*&C17u(Ufj4!$*PQ*5ug*17;oS3AywJl1;;OVh+_IqYApO6=*M#Z(%P zj4Ux#b6Fi%Lc0cOUO%-P->WyQjD+~7X87Bfzxqhq^Y>`}^7uSd!QU8v=kr$|sh&h$ zz+dHE;Phgr3(-dWUBcfE{C&vj`>4`?==39$aw<}U+K|8h z;IA6Tqs%~mN7b-Kl%fVT=7-8@f~rINIeUMUKcNHop>hv&+7gZGUy*3zz#*s#JQ7tw z9UVW$X}XK&xEK`3u`sBJLsFn8InIe9u=}I>NEIBw4-aKe4?fZc)E{Eo4O+(b8T6E$ zDi}hRdeGBJj^k(g_enxCQT~L^(GRC;`1#lxsS8j|!9r(Wj;cdfINL|}!M*|2zi%G8 zm4NgPGzDFYHbI|8HIy%)D&R$@n@|nqt4?1>`4f7BADW^q&aQF#E_x(9Or~`7SXAY8 zi7@^O91l>-^-s;n&P4eW%5wHes2XxIs)p)8taKPk*`eXi9*yc#Ull(FuBfptevfMW zU4-ItT>_~xjzd-P1XK;1s-9k{{IA2K($No?^NlocNN}%M$DQE!fnl0tHRB+!a}#I472Hi@KKc-6#cVk z`uvruP4^J51+*4b(d(Q(g7PQyn6uYA`w6E{p(_7b7yle8w|ogzxo;%>`z^qJfKO1l z$u?9Use)fP`>#|D`jU9*SEwrd#-*3a{?5gJ@3>Uye~66bXAt51^YVt zuT)X}`JsFR8n}5G;4(;6;UH&AmGBg&gHc7D=IkLd`23ZIP5Q+Qu(A(#*+!x&ew4Fw zT=x1Zl3L4) zqWs|w!Rm#mR@SAcI&`@r|5DAOPK-OjGB%J;BKzs|*@`v(O*=76-J$yyk0X--`jjs=Z-N{r0Up-Q$vKmH%9I=j)8 zD^+7(*9g?;`%4 zD#=g$Xkgad9d6lE_5XsYa{qAI>#GK~fqwi+!={$(?Svb9fvq9RjG$MTdGF4LzV7u$ED&&ph6w_K_4#-x79x( z8On0e2^ZZ5RqX>%eWc1h5LK~*QB|AmbO@?XeO0>Qj!TvQbZ1Ky9Mw=a3pVgyR2fFQ z4F9Ai_ug>J)=EFdm6Pj|NgJ5l%h;XvC%RN7IuliC=Qy2(s`(YDKJ`_bMI~JME^zTu zrC;D|sfO)JRKv6kmCskBs^|J-w+I9useJx6ROk-JrOI$8+Q2Nn-0iCOxM*n`qF+`t z`l{nnWqZxpQaQ~#&i*S^`pqt0Dtn8wrLt?(Zn5`W#9yfre&FJz5tDvD?bi5w;jmQp zS5Ci1br{&`;-!lJ#o6^${5Qv?s&2QlrLuoVHSP`c!>Ya9MjfcH%Ii7)?^F}moOG&S ze^d=_gKFU0I({gsk5mrO$=RKv?E_v9*n-ksfKBHI~|Iu{lidwq_T%Q8$Bh65KsjpT!d5!N22niGaZ*|U?w`dzJ|@> z2VH+AyJ)G3DR8z_)l6}Gs#E>vF-ljA>Lb+_JsVZO^q)-xK#Ecr}~eIRNmz-UMhRBvlmCHzb)WS7qP}g{3ogzy_fX5BYxcF zld6IzoGn%GS!e$jt^8LJ{|8(%{*p`oS1MP3hj=ykT~s4f>(XZ_An<_$|B1?_J}13r z)-MeoXI@?!ZpEYKQ0QBj^gCDP56=D()u+D7FMf4gsy6IKHO+DwZUdHb5bAXm2O*&d zOlcY_QTP^ziSa<)_%PIPvC zRe=K?udga^khs~jj!i(Jq5KdY=5)9qAE}BT;q1Rs#h>Bgr7C9>s!cf0@qeRsfd5Sb ziuvb)C zbQcHX?|>@4#6{Fs@r91pSM~gIxZ)Q(U4p6t{hNvUNEN@-*;3h8q1qhMu6GgjRS9ko zHz|*WTgs6_D+6=KGLD@xZ*sY$YR2EtgV4tu|No<^eLdw!A9wnM(2pq>M>RehQ2vBo(T{(j8lM^$zelad{zXJkPQX>cdoJUDqDuch>6PUZ zm#@Am{xi5b_IW>-;ByDIIlI0p;daOCtETchcw@8Mu*2@NJRA#tRBHSC&1I0PfZfiP zss(>Iu49Jmh#cOj@<*L5RsKfKmdbAI?E0#;w}0c{8-*Z%X;m2xa2Z>;jM9kN^f>tjN7a*6 zE?%l0+<^++=lH+T%3x$3b{QW*Rl%dqe%uuxRl!d=TdE;>&e>8m=q1NrMb+@vQI+=w zs*h9+e$UzOHO7^c@O^;vLl^O%s2cRK%lE0%&r$I&P*wb;v%f~=0^g%*=q^*8@Sp*)D-p8HYK$ zzN&)Zj!V^`5zdyXqEXKN*Xph~^%JO|F)m|$RfRcl=~x#pW%fejQ8jdu(Z=+y&*hiOo{uX3MW`Bb396B~6xF9v0VTZ5 zC0OhdTRlwD#oNk4)t5M~<9@R&xE6!@iZ%5_r_c;4rR3E8)>Je*K1_2fP1V9x% z<3g0`~y|F5n2(J|1}_>0z6a+ z^<9>RYJXG>I>_0roTfT$gQ}pm&Ti+lz0)I5wILl<2fLz5-yKy0dr0MfahISMs*3q{ zH-d)fe@0h^flddbYS0j84@dQpD&GiH1&?&`qn$klZ4RG;DqRt(2F*Z&(@D9DI0sb) zbDVu1s*$+>?SS5nszGZ|RiyvMTLs?Z`2DCx@DZm^p&EgWs49E~RsPpe<$F{ASCIm5 zxdb&X;yqLuKXLYF&i)!zLEk&wiSj2DW@A^u4N;ZX2vtX#pz1&~R1ItC_`#@r;m9V8 zzbZP`MRY}#A;a0dP!)Wlv-_etx(-2=ZxpKZxo8LUBJ@b~4#)3Bg9jNXe?lAhp$=?v z`i4#e9Ra_hs_1v8VVb8F$51`gZKvk`4`}88RKfqQT=~vnbO@~swI`q<>EL=O)f^t} z?E0z^N{4ICd!Q;P?$Z4$B}q`8%2YiXRehxGwf>JL@W1fN&0oK9qxHX?zv|gn{FT@K z&%AQ;*Kgbe>;He{l^Z(t7jN8D2FvFxCQ|e9Kl#dymg#?ezS70@#JAAjY>)$^w}ZYuxRUb&e|1LR}> z{KgIQU;kAb4T)_2{J(zX=C9wl=}bk{s_kE>re^OeH}=&Vt&hF0+yonD8e<`^X^U!D z_P%oC24e3kH+aL|S8f=Dy|3JGmfZWwjolyjzH-Bg;IsFYo8Y*=_m!KyuiON8J$qld z(JMK6=&<*do4v2x@Q6fDN!sy4_nn8y_>&5C;D>HL_P%nX(fOx0X!JPmpTK`>>nZZy zS8f*KQrd;~zH(!i-riSk_P%n%!^()+`^rsrr*zx!L>5&42jHP0s(^D>r7$i{Y0|_G{t6;Ra^KYvEC5!%N{5vs)l) z2E7iL{W4(9>wv~)mq3S2fZR6#o>~0{V6#BVn}DWf%$tCPuK?Byq!{n-fQ(lO75^Qu zpIIlc?bYx;rp;U7Q+czw@GZdd*GRGHEm9m{TE7h#_&Q+j+kgYjMuD9I>F)qqnu>P- ztKIk$30S-taIo1T5c@kIYYQOFEZPECE3iYLt?5|4)XCV_6I^;W>Z_W*OZ0=k=x0y_oL zKLW%}#YccuwSZcIo~Gl+fYI**7Jm%LG+P8>9{{pG0c4p)p8(bh><~E7^!yZ1@FAf3 zQ$TOCU7*!gK=x;VzGlT|fDK#2`Wp8o(8dzy^Wc0{LdpcYxVD0BgPjOg6g& zI(!Yt{T@(gR(}uJERga8V5%AO17P7dfb{~!#`_VF@ee@pkAP`roxnDMw4VSoOyN&} z<=+A}36z=EKLZAS2blXaV5Zq9uu~v?Ct#MT*a=wmJ)l;g!gSmP82tla@h-r*W{W`V zM?lsufVpPTFMzcII|M3C&tCxrKLM(L1s*p;_@8V1vMJfs4$b-GJFU z0c&;xE-||VI_v`E{tj4VR{svzERgaC;4(Aj55U4-0P6)7FY_V{$FJd(WyO)f;VYJ{ z!`y~x(!$tFO<@?Y{5QZR0pGNa00!;`%#8q+nT-NF1=1S;jHze9}c32YNc+Xry3DclFJyfI*t!2PCm3SgkRGB*YApxG#}Qy_g`z{93uU%)C4P%E&` zbleXxx(Q(Met<{K7J*n(Kvpxrdb6k*V6DIofhSDQ=755I0M*R_Pnqoktx^El`vaaa zEA|I$5ZEp7oEdZgVD`R%H3tA*FuMdg><7qg0oZ6(w*YJwNI4Mjk{NR#U|}=BdVx*G zI|z``98i1^;8n9uV4FZ%OTg=;!y!M1%$&m^tJ*?pMRtYE(MLc=9|~D~1mxF{sS$~_gJc~E*&Q;M9tl}1 zvP0yLkU8O~2>+0!S$b4tR5)z5Bc@e*;pUM0GgUH#{d={30NodElpbpqQ2($WFVO<_7< zc?ZBIfdfqIV*vv@0_GkIIM8eq*eQ^H9H6DCI1aGtXh5w%YtykaVDvG7#hn2Mn=Jyd zPJpZ~fHbqH3t+9l4uQ6&XIDT$I-t5Mpq<$+(CSz~b~iwKv!WYdgTQWqBg~-V0ke+- ztT`TVl-VWFp)(-2JD{Uk-5s!5Af*T37&E2^U||=)dVzG~#Q_;z0mX5^ab}&sHi5JZ zrm0KVT=i-gC+P;63E=?pR0c@~9uGL8C!o8T(G##!;4Oi;X?Fr(Rd>KeCjfey*9AuR z0CeZSX667gKNAp(13neVGF^HB)(R}^1vt@c6)4C6oSX&dZI)&MTJ;3{DA3pRP5?Ft z+?oKKY`ztkeF9+QiGTrS<%xg}nSkg?fI(*1Nr24)4+;!6;og9Sy#V>W0omqWfs8D` zfqei&OkN+rHi72^hMDGl0m~DBnSBALo2LW@o(MRiA7G@J(GRdw;4OhsrrpVaRVM*1 zIvFs=ye=@hH=uiez*sZCKOoiz@F^gY8#Y~EVc6G-WDOw6S!U4yk`(j>>=4K^JqH3> z^#fE71WYj71vUs|4+7+y6@vh?PX_E3m}~}}0_e~mu;vs%q1h#{Ss-^XV5(U?7_e{v zAmvm*u^DqJAY&k4y}&f%WdpVe6lViwm~{fn2LaMf1C*J<(*Ofc0c;YOX<82f>=c+g z1Tf2N6j(JFkUkVpVJe0KMxP3(6*$*)90rJG0~QYh%r#pC)(T_|2UMCx!vO`S0d@$? zH$6`Wv>F1aJ{@qO*)Fg_AbSMhBC}!yVD?bJZh=e8ppk$M!vJeW0v4HF0-FVL&j4Iz zR-XY_I2@2N3b5FW83o8V9k5>D3ge9iY!fIR4OnW{2`nE0NE-w2P2m{8z>$DW0?SP6 z9KcS2xj6u1HVUjd1CTxzu)-@bUYIf8x2@|CZO7E5m+mbl?%AREXoBG zi~;NrSZR8W1GLHkRF4DPY_=M{4 zkedg%!>rB&EX)O@j0dbSW5xqA#sSs~+->;Zau^SR;t7Cz%{qbQX93bC0`51369EIy z25b^|(6r76>=c-r4|v#Y6j+r9NS_2)XDTKEMvn*73Os5$P6os#02WUMtT$T()(T`5 z0G=?53IGKY0XqbqGCd0ct?~iYg@9+wc7Y87*;4?|nH5t2vnK&|3%pJ_V3A4e+KZ zoCX*;6|hO*Ez^2BV5h*`>4104MuAmDfbu@8Z_PS^*7=Y>!sgQRAq8_FJ0KiHdREe$R_6k$D*+A6c7Y87+4BHV zvtk}#_IZHa0*%d}`G5{{0c++1JhMw+vq0_zfTm{k1%QR;15z#oq?j=m0x~KA>jm~R z-U7fjf#L;#=4PG1@_B%?ivS0h!ixX{=L0qg9B5i!4A?0!_hLXxvr%Bx1%UKR0If~M zC4kWv0%`>gHXRoNVhaF^7Xs4E7J;<_S&IN|&7wtsf{Oq<1lpONmjYT{45+>o(B5np z*dUO78Q=)B;xfSOO8~nCjxvKT2Xt5nSaUg`quC{}Ss-^Y;25)dF<{{$K*|z8x*4+s zkZ~zsy})tCyMkk3XOk!CV%8yM`DH|>T}gB|Q+Op{;N^f#0^LpPrGT9RbC&|*W~0EW z#enpy06k5`Re;e;0JQ>{rlSvtT>)6^1G3B(fwclzR|8Hoi>?L~TnX4A(A)G}257Yu zP`wP$*K8NqAdr0x;AFGn8o=zU0J{YSm_Y{6!3V4{fI()Lz-EEm<$%Fv^>V<%s{tu1 z0NG~D3P8p(z9j^z(ssM|x2jrS90&4}bZUCHR7To|SxE8QOAkXx? z5zy*7K=qA)31+*%27&CAfPAxJC17?nV7I_zGw3EjhwA}rZUPjVT>_g0a&HDqHLGt1 zEW81batol?jJXAnaU)>8z%=9C3fLx4d@EpvStqc3B_Qo@fHG6~H^9J~0GkA6n%1`g zb_&eB4KT}W6j*gLAbk~}!c?pRjJ^d>D{!vqxEc_<6|i_UV6NFBuvQ@Jc0i?BbUUEn zZ-5;F^G(k?0IhBVRNn!(&}G%X7_9$TS z6M*$*i@;ietS13am_<*rdp&8kN}e)3pF*BCOC`^k?UH9r@28RH%nHf#=3B`NX3#Up z2D4JK(d{XrDEYg2O7fOzy#aaK%#gfeHX>%#vlN@Ykz%))ij9EL&jD%$-ZdRx1jL>PEPfGC zYqkii707xC@PS$M5}@D(zz%_}rsvCmRvQ4-F9SX{+XXfVWN!j|YF2Cl%-#stE%3P+ z^a`NEi-0w+0JfW50-FVLUj=+=R=)~Z_!1!HHNXxt<~2aZ%YgL)-x%+8z&3&6*8$&} zbpp#b0n*;!%Kv@DOnHMV|G-xun?!z$nAA5RJ4NQc3Hdo+8kEv+J&BhuW#CtM+uQK8cd|E0h;*Gvq6j#-~s&OZm-ha-Bnoa~fsp zIh2=f^No}pQc9dhdF?in&ZBfXgYpnXR~cVZoRG5!OTI?%H}??y0!*0;m_V~YCYE_3 z6Wdg|h>2sC%fvM=Wa61R-(cdKH8Kf|-?x|`(?lkr*(8(5#Jz+`Y+B0%o1HRAOz>q) zQqx%`nb|Ls+@!jKNnv`+q%=omLQKZ1m{ex4OloslCXLB?4HIfc%A_?HWzw1O>zMRr zqD%&JT_&R`@*O6VnJJUm+{2h7S2*ArH#p#|X2A`FL01u8O2}@i+(gK64Po6)gq-Gu zgbNay-$KZ3*4#pva2+A&HbP$0W?@`#o<|xLjzJ*iX`@||@2H!_$d>i4igkmP= z1B5tt5T-srC}A#2*dd|B_XwrT#P1P0-9>mPp^Pc=5FzBAJAqmJ&|O{E4ib*s!=uI{ zJSvz4j}QjkM|dfrlBx0oLXHOr>wZ9}VqQqNAffqVglcBZV}uFcBLqD`s9~BsL5O;Y zut!2I6Zc1iyArzph)~DulraAhLfW4Y>Y2_zAyobW;e><+Ce>4f=MsiLMQCJ>N?83E zA@4JUCT8$6gvL)0E=y=?a{i1E=SPI8KO;0Z7bWbFP~sQrxuw53bDTRGoqj@@i^9dj z^yuFim87noTmjOx%~4-lnxoAG1@YuL*vI>1R62^f&uu2AEW@F#}C+nL*~L z%;32h{TulWnLC*Oht56C|HDj9Kg@75Qf7p?DC05VZcMb9C^OPrml_+v(!nKEO{ zJ(;nlOaNw_Ss*jsJdv4Tssv&tn&lXC!Ox#NSF!wc4NxZ*!UQ+MRtZy$Uu=XZe}wk2 z5vH3>67EV!9tUBjX&nb)egMK@3A0UbT!hMj2>s(C%r*NZJeQC)9)dBw;~}h$g>X*7 z0+TU5LgUy7W8)(%GN&cPiGxrm0m2e9G6BL43AZFHHQ_-Bo#GYy~u_+KfF{dTONs3S?CBhyvG9|(e3AZHdHQ^x$osuEU z4MEs%u1g3>j!+>L!a*}L6~Yk-&mPMS>;?n+3W4&k(Eoep7sYJ|fQ&YIx#2$j=3 zB;1m4)r4n8=#(B|Zf1n*=DLKC3N z=0W+5iBC$LoG69zqP+Asqw=EckaA1PYkw0FhSDh)%G@wA_cPbS$UG!BLWO(?{$^%A zgd-B3NeDD$@*@n&gRm+;LTvLyLXNx$4Z;!Pn&sgL7bFBmAjCIyA`m8oA#9ZpWc&&s zMCC(hUjQMI*(BkvgyaPgf=%m!2=ntJ9F~yO1Q$Z69FEYx5JGaZU&3<nb5sGcP1eD38#*GC~crrZPfQ1%#j~2(?U;DhPKa?2%B%#I1@jzam2S zstEPWP6?GOA*8K_(7<%AhVWd%2?>o%s_F=uI7b=3AGTK*F)%T*3?6Ys*Mm-AEBpdQXk>2 zggp{^o45@S=GQ^!-TNAmF5T+B&=(WFxkA2FyS49<}DDWnl&vD zqM9NEwM3Y1nzZBsW`@}$Gtu`Oni87#BdoR(Q)a<;>~Yevc}H5X-;neg_Q$gD9{I$=K4tNN<@z6x-K(HZF@vqpx?i!PY;risi3v$HE^qY3VY zVV#A{X0u<0MHbzuk;TB`5f)i=_n)kn#syDd!8gBl6@3z$9IKbt=G(rpr+*%Q z?Kjb%`p0oU2{Etw_`mD+q}l#%U;lZ5fmwLrWg;_jjepZOo#q8~@87py>$aWRzveC2 zde4sw;MU!{xym=;2l=*N-|Igxz>nA5ZcA$7Oz=;(J^uv%>VA~YjF{+O zG4Mq%GTu(%Hh41$>eIe&&u#zTL{sI0OeC50}-G7XK&;jGCs}tA+Dn%l19R+1y!H?e(p(xf{y1lWz zM_2n@|7L#fCi~6$r5w`P{Tz~xJ&mte9lP~xL$0oihsjQ*7^+C|k{|K@d{lJ$BipAf z_y5r^(6@i&ME`ObbA0Lj)xGG%r@X&$8%-s-`Vi*lFfK0Om9o8GN*fw)t%|` z_7Q9RQwIk2`JIFQBW_Ti&fWX8?(pW(WE|A3?;suIYToh3FDZIUJfMBsetlZ=K0&k~ zRbys<6FR{^hl*;JZKhm3dGnvQ>*V%oiN8Rr8Q+iAqxydFR$sjCt^0LSAFKN2zK`U6{34DajJpv2OFKKdaR{&^E)RC_+eTyJr3L5*__upgz~FmQ=^z&ZoJ)v!Z@mmr2n3(F>Y% zbo5qNOP}PrX*K=2dwZ+hvRX>E>s#%%)tGwq;!*GCj@9(zkgdS`OQL$IlQL0z@Qz;Z z=N_7BK|ktT!Y8>NSUfPyw^~}Zi(2iW)zp-wtoF!i>DexAwI9&D@72nHVEQ;Md{j##n3s=3LXJ|S&I<&{N zQeBbHFV-D@_X^zOrHx>sS!&5gMDWq*g0L_($ufcWUW~)kL?gmcnXk4(A7cL#!5sw$%Ei zwptN1&oV29T2Y;7xz*BHO?_j9)iPL3ZTX(nGFeR>b*0txmM#^rB&@PpHmj*qzVFjK zt{he@jrf6e%w@GQXmhQW2Tj#l7Ft*>uhq(-wX|B8)ykudw9{igt5rZ7ZMFPfjrOmI zIL3o>FpEkY(^@?_v-kqyYJ2VYvogdt2DtAX4w>ZZv|1OmgjSnmwXSH1tTx$do^FVVtvJPs z-O+-rHWf`lot~3eZMxNZq9wK3OdD6%0Ljo))w8VDn{W#2H`~VTgO<`a|N34!r>fC~ zL5OvnXC3>YrLx+5o1iW#Qd?~S8vk4aAdS_Wm)8wM3$>blL`!)Lg0xm!8bJF?91NMP zxXd~ZLCcJ$BUx^>p@g$pzZGZ-4ukAgTZyI)HymMu-bIObFFsJYBSL0S?!S3W}=No)1}v8tIg8! z>*7+M `aC57DZnZgR?Fs91#A_iSXn8d0^i2xeIAG@8n=7@k}0E9^ZBwOE}2- zok#P&>u@PzBE|b-O|MDIjJ;{K_Xyu2tdFb;xDsw# z?JiaavP#F_+a`F=itn>ypw;eM?E|#S>fU@Fps8D|hS^qoX#Lip&9&Mit9^*Jz-m8O zZ7teluSWepw&F*KeXZjYtF1#Th?X1sqt(_E4!3?kS#1MaKC3;o+D0_J$4qgbq3M`5 zfnR*zwWi(_>An8njHq9d*XK7x9o@&EHvs6PS4C#QZh?2u@?kTQn%Z?MG__hOG&SKi zXlAt*XgWDwte10C+80)wfv4f4QR~D);`yd=GKXxjbGT9Gt&~zz1 z&Bi@IIM8ad(R6eNL2r%FXP%9Fi11RCfRFKNwEtl?^g4>d*!kA+Gs1dRMHF^{)jlVz z*H{$6F0|Sa!e`O+S!A`Ng!S4BT}f+%~0!yl=Iy2tlroZvlfkJ z^0+Rr@e?J~XT5d2NceM#+5)@5YTpo^4lQA$)xIUX)@u4GJRRL7P;YMqo2_=4unI2i zW2;>uJV)cN4S_9)l*V-xN>F@V?QFM>*9eE9^}_D3+I7NJlpCL&R{M@{HmmKj+6}a_ zXhX4|SnVd^r!Wk5d#reijaLv2d#rYw@FgOT!aDELyhHdGtL?RZchM$LKz;UE?H=Jt zR@-m2`)F}>lza|Y&GUebr#R{qe9(&D6RvC{>m{8!sE42?(JA<_)gBT4lCaKZpIPk( z!iu94*XLGyOn58dMc5-&dqOyt-d(59QA8E&M@UV0DfYN^{E2W1tDUf#sxPJ0Q~(w5 z8EAgj=cLtsChWX6^_10qLA!4I+iAV>RFR*9e#K0k>5O%JL0GR*)aR_#ekEMYYF}CH zH#FyUl;^DWJ6auTa0B+d)m{>=W#fKrwO2a+nur^*7p(Z2u-+)5^TI_mZ%a_hvuHXm zd}}p7wDVTGjHViNqkV0)YgY3|`_5`N(AabZ@ZSwIj}p9T#X!WH*726rbl?7t)oxoY zHridQ>D8wyU>vjuR=a1lxM<&7?Sa*F-T26A4+Cj`wq4wKc0IP@Bb$jXCZAaC2df34 zJ+<0nt0hExW;N%XtBKH_TTSm@Wz&_I|Hh$hA^a1X3LUKRKg){GtYZ=!XIt%Ot0hI7 zW3^wbmJH2UO_yG5x{~wXe5<`cQzqOscP+A-UhXQtl>E0?n%e(&>llLgu62B69aEt# zv)XH`rAAwBHC^P5Lz8HU3xV`W7EY0 z7S~8>>r=wb(K28Qqj~hUD2c;uE)Zcz?g0|op$}L=DhQ@9GXsI-{9wa?q492duS`)%bP_yJ3tGz>532LVM&}vNyD?Mpzt=5dN z($nnsk=2?L-W!+pXBKj;vtkSDm;<{WP5rSY;ZKOHNn(`pFCLhfs zJJD1#Z3t`fk@g81#?_YpH2Fx|t@c-f?buLcO*nh4V|&7iEN!3FIuO1<#+rooTdgBu z{gRX>oC9dexD#O&+B*rMY2xaPrt^X3o1@mx(}fM45F{S633er{^MSPER_jJs=L2ac ztk#{d=6-2k+5~$L);urml+}6?)-*5ejE&oiFw?xpE1tDtZ$!=Wa{S6_eF$rwmv+u- zeF>|!G)taG(-HS0tZJ2}Z#=5i{)F|?H_e>iqNPI{Kv=V*v=^~xf2?aD|0zLDr@z_+ z2N70+()0#kB{-OHGc--HuWf=u2&-B(#inJ#QDKG>9%r@mRvU(u4?2uH~(xA*{%)uobK}pRgiJt7s!HAgtL;6Ha9`O;QU9YrJc6 zsg9t&BBiG_=|> z!pcNryph$GTR#oc#%RiT1z{CX!?YQiYV|!`|0%M>7S?ekVO^(d?6$Fvs|f2dU0ORd zjO%^=(`CA}_E!6VurAZ3b+FoM!n!1v*3qW7hVWvqM*DZR;)jU3{FY-^8+k2ZU4Bc` zTb(hkkN9u7)w)}49hxq`<)=F#@>|b;nkxoid!nUB+dx<~I1sBxdV2og+Q^2gMiY*n z%c*KM5mwDenM~9w4lm)+Dq6 zP3uow2iZ_$iJPtCA;PuMG%;;MQ^to0M-k9OvI7m{`pjxGusf}$BkQRMe4N)~>%hDv z!01)k+C0jC`#of$@x0rLUl7)Km$nB@=^P`hF{?4Y*ZLhNthqvCe4o`$5LR4i`)%AW zt)GVELF;$Y`bqN~vW}7)b+X5&Jb26(vH};XSE+Rbic5EUunP9 zj#=#-+iE%u=i@%j<2uiVs$awJgmwIyuzI?N(3fbcg$sn$)1{rVeisR=r%Q9*9R3Yq z^>k@^dpO4RE&r*bOFL`RyF|FZ-XtsWoE0wISUp|ZMXOyS zte!6I8>?L>tQyp~|JG{X5mpUKyW~OC(cNG})vviguQtcHZt|ZZYc9BIwOfQ0S=u!l z_cmcwzvhSUtlu5Ns(xuVtag{Ms$X-)O{;nCv7zeM7{6u3`-GLThR|)RJs_-%rQJbO zp}!}rLTgyvvwjZ=E3QV>eXBhpthmx1*tkCsrqK0WYU_vA@iAeQTG}J4Jt3@8tNnkl z+K+@)Xf@Yks~yoJGd@#(2rw;Q2V^w8wg&`wPj7lxZ5GH1*&sWp_&P@_4%cz6JZQN= zzsj4F?M#pvvOreI2H7D8kfHaXFa_{FDkGZr^}<2egpddlLomb3yYMa<8_6LBB!QF= z0;wQ1q=8V-<*CjR89^`9%?bK>P`yq#F2sZQkN|=pAtZvt5DZBmDI|mBkRm>Zn9|g^ z7LeVOkL@rBhk_6R`Jn&|B)>t>8~T9mboYb)&=-1w?ud7WZqOYDKx?Q6Eub;ff_BgZ zT0(oM5AUcVIuU39O`#3chTKpE!l5D5fsPOXC7=dWf^tw5@44Ok* z2!m2k2ued4&GW?wREDxp7^0v$)PxF<4~jrVXaxD8IOGC-(|r&0?N;ArTSFVrqO^9< z9y&lr=mZTxw`1x<8VJ?*Jl#M_4;es<%Cv~=IcVY7ub{r@ry`I2h_z8Xh zy%+sH+=M&u0PeyqxB>S->%p$W6}SrDf#(|kX;IixSO!|-r8Qkz!=*J_TBD^kSz3an zx5jJP)jXI2dds}tC_fAOL4Rlp&7e7GIaW((1t}p8#D#be9}>i&1&1(fhQcry4kJLb zUo?z_Q7{_Dz*rau<3UTQCc>oHrtXb^T&DDmfMk9x%!?az>YC`fvaJnupf2dDRu{3l zXw^lkE=p@a1n6s=))jpZ58(-Dt&l%x*^id_XjzYz@o3qOmg#6!j#lAl)s0r!XjP3? z(XePHo_CduR>dSW&2I)|4$=~mERYqlnFTik(s%~bdxpYr7y;|q^#QDg_u(vzhEXsA zMuHy7M}uB|8;>b20faD=wU#0^q=9qn`x-97H*guQz*V>g*Wo*@uem{>3K8-_ekj9s zS(r_D4$Oyzum~1IBWMiOpgL%strqlZ0WS-7U0=fmxCmN0aSXIvqBm1%7w7H4-SfmYBOw1%P$bcS!?5?qFSpapp?L2D{>(_S~}_4v9Ow1U>q9NIujSc~s9(6R_E zgE$LX`kT%7gzQV(PG*l`Z5foY%zxq2Ww9rS#3Ht1Qb9$D(C@lw!3 zVLj^9171Ca)+5sypvR;e?2(Rg94A9D*Ot1LJ$NAAu(tjMSO?{ zap4LD4aCNRWhAl!-h)-}K70UL2%xnXT2rC56nCII{=GoUDEdG@=nn&6pq{T>qK|9s zgl_KWX3i1N-JeaM+g`d=wGFnwcGv;BrKQ_dyFmBVHo!*E{j`rkx50D|PPfQ(KTS9D zbe~SQPj$Ogw@2r~Jl$W>{Z8G=)UC@!uo!fEaxzQ;ElEENT7}+|?OxCu`aoak4+CHz z41zAu4O&7AXbkT_GiVO2pb0dEMw)lSAuohMKB!H#)q#wJweCXeEVMR4OCeflgi25b%0oGL&6GBc!cKunFd4L};Cpnv;hYH}ih>TLU*Vmx+nx&vL=)rynag#wh-CxPTyqAQH zAkg=q^`P%Qn?Miz^#$NH=#pk1R^K}GRc0&bJC`nlb=j-STwT_lghu#gf%K3G@`xr^Q}_j*!;kPY=$nYXP>h9WsG=Zlqfgbp4Wr3a^Ux9XHehC|!s*D8zkdy5UkP$Ype=}@_58*Xw`JuZ(>#g+s z{b$fxE^1w2n>VaFcN}@c!h+o!wonDpTjHm=@I90!ed|==#j;Amn4b zFcP9+C=7${Pz8!XaVP>sHU4WsbK2rHV_lD|mJ`-1xNDGEEyzNL8c7H31f8J+bcC85 zg`P;2hlFe=f=l>bRtF@F>TE|q0VoKA(0f52=nKukla>FnL3YRlbBQ<`W`f>XpPPat zfnZ1kchT-aTWAOE;S72L3K1Xl6iI(SQIBwaXb9mPL|52AxIOziKu74L`x|jN`uGq8 zfv}$)2VgtwfVJ=uj3a?b;KFAHjDr$T3MxQZC<6^CP(9H7+S>Sc;mAvZzO~lI)_@A2 z`?Q5M{)-ccf})TQr#VFK2%Vq{=w53FNJ{CGKw=1ngpdx>!><(ZH_#t-yo8@Ye=zbK zv`Vcfwm0;JuF{}8q*VLwB(MuUfyp@cBeTBH4RoU>78#^~ln?^3Ar82}58Tj?xPxFY z?1nw?4sp}4FD;~kxX_Adk&p+{lDFq6N3B2PNC5>ndhU6<9(fDsbpe{6ltnAPl z*yh+4(3aXbgPnzK0EwU``|o38!&O+xb`NY{I6;Bu!$jx@gP}8Yg@TX=GD8-~3V!i9 zgqI9EEn92~T9()v+CqEi2%SKS{7Qiq_QeJ*=5s*`GM@p{p){0*3)JK{p!Ip@L2L5P zzzO&gzJO!!IULbxRqN>v!Cu%0yI?nb2p_=`XbTr8vF@Mz3cBg{9Dal^L3b#0i$k|V zbniqrb54QoHtLqw5-`x1bh1J^$O)bd{MUmWO(6jULm?;$m7o+YwRC=XFk0ZKp-cu4+Tw$HH3Ol8|pwNs0>x18q|W^5DJe-J3BTulvM`h;0fYW zcn0_34%~!S;9|cYxZw($x-+QTVn4xCcm}_~WcH1LQJ{`FhQdvSX^@=#i69GlQh17X z2Ry3oq%a5+=@PVskqo=q*srl#^!p{l>nxlBX@{^|VJB<>f0|M8a}mxAS|%3)Ng){| zf#i?|Qb7txsq6n>0(m45`7sIq1i!!o7>Yg^u9En7@RIOY>{6Hlb@7SBMuC>IRmIkT znotd@gVKG)5ZB+hYlYfZa1OLG?dy2VgBJ)~gm2(mxCEEs3S5P2a2>vjXGZ)KP|_Uw zDIi&LJpq~k6JZiehAHOBZvjb@>p_qn{OCc?T$l&O1V0T(8MK7pyP!ul%S{QS5_&Q_ z2FAk#mdRI=if5nQF8r4pOc{t31cY#)*h#caOSv*JpksL*NC=I{kqZKo^ z&{g;zP!h^P1JbFDtt+UJdZ0XYf7+9ds#d$Jz4d^q8mMh_qxw9=CVUn9E4T;`zz&3? za18cBZ_ttdgxv-of|J4DrDN0Z{7WMLg~)G>dz;LasWQ+LvfZFUzP+Q<{yK7Jr)t9K z{W^LrP;rh_3sal~4-q~L&Y08+iT``!QVT&eOq^1`ZR|E<|9_)&vHly=hH742q9!DR zbWjwEL1p@BRnSwQS`4aK*g#M}7pb8j{Z(jNf9ITnewz$}VIAA+^<_Zo6&mAI2T_jW z=$=l!sAYts|K0X}eDpNOY0b-o)z`1XoBRISt>`vRztRpJu?B#`_dy9=0VlEV2)}JW zID^XRVlfAk#(|Tm)9tk1dp=1_>;897D0S3D-j+iP^w!V@+Cn>M4;`TsbcQa_74*zf z&nSC9PgCP1Cz$~Rz0cUOL(K4(oMfD1*97xVlZ%}c{!8P!7ImTr+;u?bgDUi@DRd6C zhaPf+$JL!c57oEwcQxT@K+r`cxS|Lb zhJugwk6|m^fi18a zR)U_AM}wZC=|Qrd+cGJ69}?@93*SF646o& zCv(}fAYTzv*LF;Q`5%EV;s{QrD zR_dM3P{~F(W@6Hnkb1ci*S36|Ba^SzWW+33VYcO~^&9G2PI_uu6)yOnDLx&%zfqYEeBB>Wer&i|1~$@8|U(_1nMq-oP>f>Qs*Le|H>9@K&iz+C^f0(<^jbA8OQ zUYiV@rm7PoT-S!x^HuFmlPIi5zg{tB!)v4SlfH8^_R_5N->t zp%rM|Ra1BennO!y0d3X(Z7c(^%BVd!8TTXH2|7SW=mWj%c28_)=n6fcJ9L3=AWi?76JRWifzdF^+VR+NFc~Jo zB$xry!HF}CF!4OzBb~*Df%&iibo7g`3t=g|3(MgHcpp}Q+HVtVgbna9Y=$-P=Dzi4 zAHiDq(C(MdIvu*IT&%NJI~*q^?1ZH|nK=o)Ewh;WZV~4iYy~y%O}GKyfoinBs{T4$ zgY$3>zJkwTKkR{Rup2&s9k3mC!A_9&DSQU|U@shogP`~a;1HaIFX03nhhy*sc#iVl z5l{zFo1BJIa2C$ku(p+`5>&!h;9K|_Ex)g?sR3=F)NWo?@?IzX$abwWst)@B^p`ol)}>;U7V9e}h=?E4+Z1edZUnzdFuZ zcm`@~wdv0mHN$gw1ux-uYl-Il+N7r;QwYY!#sYo82!yzxMQNkiC-j{_4DXDWzw_7@^t7$TtvL_uY6_LnE@ zq*08p;+BBodh}L~Kq)8*Wuc4>m&U5&RKivSb+8K9Vc4NC1fpOBT058q&7di~1NshF z59&h$aQs>m{=-k-|C&G}kaJ^eTVY#53s7Rs?RHzctvGEU8kDf(uY@~8C+G+rpgqV} zem$TIbcb%>>B@iVG{a#q^oCy069zy(=nH+IKMVpL%|I9mLtq%_KqkUSP)$v>+mo?V zU=%1lZOd;wj8XfKCNK`h!UUh_4NoGh%;YQ-Q350=6_mbp%FZReBx8OxO%nU=thywf{jl0Q=z+*b8dYPhl7Agl(pGa9~o8 zy3!Wd3hIAOKip1ON$mhd-2>XML?tCWAFu>@H3;51orTpBzy)=!zmm7 z273{{hVyU^)YxBPFM!UMm#}rKe zJR$rT@`IDW_k^89?h}^33ZmNIPr^T7<^L1pg=e7C*i)>|w@z>SO**^)<)tMu>2zyL z>tptw{=6r5z0VtwSx}RzHmyU+EC$^Hh5m(y;Z487(In5 z3YtXDs0lSdkC&^d{i{M1 zPy{8WM3lG+prdgL)QoMXFz*mn=1m}GrplxqC{8QlDiitX8MNX$>8pUs!=s(8!8vk` zeK|@~CLN$Xs9!iorX!M{d>nm0nRR5l3v`Bm>MI(41MwN4_U})iAM}Mjpb4)xwii?* zEN6|3p`hh!6JZKWg7FXys>P8I7skRE7zLwY94O8Nm<%l`=rrt9n638LkekVd#_A00 zbWn!QP@G42Hppj|wR5p^K!ww10pa&x1-uJOK&Q$@*u|g%EQe*V6r4g=_28tPDw#^P z1vbNKXsnXL`-JCX*W$a9u%^>h)_#Cp2Oq(Qum;wGM#d(r4r(KI1H>b&gIZ5mv!{GL z5^PVN6G7Wz4$OwBFa>5oEBt3-XTWrr z2D5&-xe}ioDTo>*!+^X0$yTr*PWdf{*N0tP*#sRW&NVPhk)2fbB3E z-`&`q@CoeFNRFAH!lQADX;mmki|MNjV-`|A(vsC3j#V4*_aVe zu>B>RgW)8uQTY{|g41vo&Okk=3mSN}ZCE}R;R1}K=W9{E3tqDQJA4bj!LMrn7jTXJ z&#}7Q_zU)D*iZNwR@ZA!vHC9j6ZRo|4_DwI`z~WI!7aE8SK*G`zKy*Jnk{Z%ufun6 z&4xV^wNsIW6TVM4F&W;o`U9-AAK(%E2>M?31p63t@6)+2dYG^Ze-K`??-h`Rcc|-c zB=nad`WvbMt@aOPr@rZr!9k};T~X-o5&}U-p_1zF8}v61`WpvX{aHy`bj2+UN-PNU zM;KZYp}%p^A7vy1X{kYf?~oGocN5Zmf4o8aC%1zBkiyxizv_^atRgvKCFUe5tH1V; z=EQTh+ipmSP0>l-t^;(8QOq7rlxbGDU1%>92CeluRmzlj&K zfHn@_%W3a_zAgOcUEx9$(zz=fNmy5_`T~%hBg_r@UY-wf!BqB7hMMeeBny?G0@Q$F zP*i{ItG`F9j8i4hHH|}2^opPe<)JuepY*a&21-LoC;`qs$CmmV-P!N8YX5R?iToEQ z_N#DCL94M{Ra%UA+NXk6j-getVWs7yC!gvu{5(1u?TifxAu%L{w2%s%h_$Sr{A5(aDhPb4q_#=|&>hOsab^cO!$pb6+t37v!; z+bo9u4q;``^eujhtG^&};yHG(+Fu#OOk5?aNN8F_ zrj6;V^kVGucuS&cQ7N4^QcdWHV>o)N&MByBNc&Y_r%=w3=d$}0SIz1ibsn3s{FIJr zu)W$}C3mV`#TxSSKraqUz~oSYL1zfbfu#vm47|8znqka zN-O6f;FMYgD~zL@H8h>X)EwHUDt8LxB<>t(%)-U273oeo-X$kaL~n^=?9_J5p*fa) zZyT0Qv&mm$TQx8Wl&%gc=KeP{kN3zl%$y#CoyLZa5|+^ZO$Cw_-Vg-wAx;CyVJgo z<}|CC*hybgysbgc|Lk;1!cIZ|v)MGtSMn)DjK>k^?4=`c&RDv*&;^AqEOddP3kzLr z%;$Hs^8^+RUV!g>Ffb41n((YV@tHwzI;?@Lu)$ic{JekJzLxFvunrX72)ayEcq=4r2f60u z3k>laWm@J9Ol2bS1*UdSahaO=0wY2*lO8ij^zD|7PITL|@H@9(i~M2X5n=gx2x}G- zE3^h4Om@-T$B%a1th!|$9tFc9ao_=vIfX}Lcbi6+g~>K#seV5W9^qjH!Xh|}vxj*p zdg+45XDiR;*sVR<70Hu5lP*7T^`MCpL3D8WwGBhREm91RBEGnKL=?oHn-}MfJ^Sv` zYwU>#56e%oSN%*k;)d$E3{4eXBwnMH=gKU3?aLP*)(M+sN?n(&O5=2#63uRbGCm$Js^p#hbCr^>s8ZuICdL>5(LP zwJJIaRYiX9mk{mA``hY^zvQW|nkYokA~~!0n=cDdfUY*~h_>VN=1Lbd0*``W-n#0? z9u@v_yO|%i84;lR%}?Jb#N`n$ZH=UjCg7pMpUqmO<27@mHy#Cig`e$jYRg04zU47J z+wx%(->tLDn?`{`RPY*q^XU{0VvE0d7thFjcqYJeZO@PQKfHBrEuK`NDp7ZI)Xtwz zZ8*E@fiCCVe))X`y>E+)cZb9$i^F7*RD2#`TQN{T)dfD*| zA9nAsk&%#J4Z)a77%*=V#Rv^BJ#dW7WgVY9%k$y5faNbpicYP@jIw*a@C*K?*4n$j zY7d>6zELs2>?W?eL4ZlT8rv?wJXWTCiJ`$&W?zl@J$r?9^raO}6^+8e9t3cKqtdrX&Zv<-{q{^_)HGr{j_YZ~bEW%M!kdBr3o8V-gl2mkfa>x?Zf1 z(1Of6$?+^+Zp*yn1=dWrY2aEV&@?L&7~!V>&LBqQn-fT4RlT>_^y>#Y`X66^p0rHT zb=lcNyQ`!_1I-o1)lVMiSn{PmJn`yh8@72pyn|0ae57M&d2#To1KDQfU{8^-!ruA_ zGt-H(Z$COw^b842@CVw$J^h*mWd%IaB z+?QT9zvc5#BUXuR9@n8A8pSrP!eb>5EW%ff*ydDmq-n9|6%ULspH^Ug_l4gu|2D3> zLR^!s1o^LLM$oj}XTi~u%VvF?&FyC!#&sm_ytd?J3+lcc*K91q_N%yN84=xSd#WU&JvAsE-i7tyh6VLQ2iTxp-xt1$dihu}LtoUYM zU6ds8&BmtKJn_wpR@f5p&6N^(gesx<$1<&2V}FTn@>j+tNMNFC1tt$H$n9cPUx+(n0+YBjwm<^Ys~Waq0+YWK zQ+bC3rgS;%Xtvv+uS#Hcm&YDTU_O%nHwnyRZ9hq1u4$XMsV}a=Fh~|;!l;RVU!~Oj zFjd+AtJ?pxYBvVWs}dMuda1*QBs9|^V}+Pqbplg+hd}57X7eoc;md=QJUIMO$QfoR z@2Mxhucae=gTom%Zl{OXk>eX*>Sn&-l_DVAiT7t8U6I)IYE19pdzlmc&v?GB^+)=? z{_O2(zV7M`{@FvF9%;K_f?#uvE^LNX=HQ$$;PhVW<8)D9J-FKkn=kXwLv7FVO$2tI z(;GV_F{h}rKl*=k5>q>`cZAsEwn_h(#6+j3I#1<|<*Uv&rV^*LZ^UdS0wZKnjYz9wzqc-ehXDb1^zRA`Js7qpYJI?rD^L5TUHL0~~&yEw_%g8oBq z{c93VM$SBAw$%Drl;|5CjX zf6VGOL#D)L^_cpc*iI}brx@oh=kU97w$+8lffg$_9M8KmEzMkzO98I3|8<6T8j(w* zA@u{RJ464kl@RjBaB$phmv-9xkJ9-H?QNPrG^eEYfZo!`ssHf(r@HvF4*u#DI+tsQ z3>@$92kv>d7oFJj=Ow__bf(2Sbg1*`%%etJX#9+)rm=XZjzq@Y*S^f3p8BOLrI9Vo zs_3w`)!P1fk&rsQDc+bgoCfgCQ~z+$@GlJ>qltX|A~YFSPTq^go9PbukGXo%cUhyW zmNz>~jJSWjG;wnI_ecMK>8S0w*(ui__4Vd_8{>$acKp|F`Ii~{AL_(cpYBN+&9F|s zHmcp6iGF=2#vKi&4fWA3%^5)(gUq|KoZZeer>h@{YcjOpVj@;%R!q?J(?6~{WA4?( zX&5f{0_}}tL$l(kE7?^i?o~W)<`=Q^C)e0E5ASs3J7fOGSAGBQYR{Qe-niQPkFWCn zWjOsgc%82Ezkg|MvY2IDgh%dRe#uE6Ia8(S(xAMP9{hQZz0Mwe%gOv%vvRHdS9W#w zMDTmv|Np!!f8)&WZkE-&(lE5M-0iHsuY{4?K0eZC{H*%k0}c=4Tb6aGlg)R}B}wZ8 zdtUyM>e8RzjJytioOVnrjpsK;qi>Mg3E;0eo2s34agp7;+lA6R$!?-MGtTuRSBa_r z>3g2#$^28XJ<0rX@m*Y>kQ}CV7jED!$>F=PQ~vzH1vmGGY@opQ#Ob8NfX?f9n}y0=fova=)9?^yo^$AJBJn2Pg2(+{hmD*C(I|x>3gzvpJ_p_ydPCDwo-f zr~5)KQ}Y=1b}sX{EBDyu=P`}DF}fN9q=Fe36W`N`wbkl_hi zXY7`oJam@}k5lZ??Ta#jWzBri7W=quG1x-!G z9fF6d=V;{XVxlTk%GwEQux%R~;Zc!Zp31S==jdq3(x9_2y>k zP;L$C7G9Hj%ZL5mdQvCvy(w=ZxgyQ7-sDo4162dBzWURhCp#X8lNPsl=i0L@ zds7WP?!8y$>t@3Xn@7ZT*Y-DY`jFeuC^O{|+oy_{Py1j~6*bpR@->YDwJd6W?8Aw4 zRZ&yAFWKcHQPt@O6CbwE);dQe4d+4L0d}yMZ|F_oJyq)c>2j!g*-pJa`A=Dn|t0<@R?^3kLx2E8&mcY`! z%h0VwllPvwufiJJEF7LKT@h`^Llvi_sIkO|9CmGPcgnOXTBL6SUoaxd0)!!Mz*cB=}^ah z-trdGv~z}Tpzieh*HzsW>VK(mMJY8FJ}7UR4Iz!K<;{R0v{w3x=FtdWDXvJ*SJ6Bl zLTNs!Xz~nY`#?EUb2v@iVkjq>F_p}aq3kr3&3bl5zR#MM#AMSc@VBLr_xkI;x^9$E zfNgfq+Mvm!#$Ruw`}?|eOW*sfviY63q37^OM%-nmclA1*u*Wp(!Kk`d+2kKa*3T=O zs>7(LjMe5*0{8rC=D6g|)l7nDtd)JnL=2~Vwy;j&O|-N23FNvB%MSj|L@paL$`G|Siy zomtB_37o4I{nT~k*2mt1(4^?H9%^0HYiPcTzO<+93c9oKy=B2RZ9JV8h^%AMUBq)J z&lA;O8r5CwdiBGvUwA#eqk|(a?jiRxbxbeMzpEHiGMY2(in=DxZVK*9WL%Cgm@h?> zO4fQN@kn;{sAqDGWShJ0E!d9CLi1^+pIP?x{ZER0^TVH44wdWsde!(-XOrgn{n$!M z#$2r`tY6=JG%_&Sow9)mV`6aTl+d?MU*0DQ&McFmfk~Kx*@sDMBQYcYew5~K;2Xc0 zKgw_>_50PaFEW>yW+4t|bdjuIDd| z3AI*0BeO*w0gZfhKj`jzbJD;1slcBeoMhc&sHNVGO(Zrna}!@J4eikLdGY>(>f>3M zzCztaG%;hw&^lkdW4<552(u4??86q*Z7hA#r-kNd=9?@Y|2A-G)YzU4NrW+?0u^Xx zc8~p+$nL4lP04Y{O9IW5ag^q6bF&W{+Pa0WWr9*Xf9LU(Yr{!M=TQdJx)vtkc+$vpGZw_T73EEdsf?v`t$joPTr zc>Wi9ndqA8nyh~CdHLnX2fF=EqiBB4(B1@0ru{ax_g#J^KAR(b_biQ)P+*-`=m>WH zaB~Ja9!6S`b$l`7_ALI{{W=Rjar=#k42zJf{e~YIucPnDSJRDg8n^E}rknTRy<;wv zJ(S&6~R_Q*+YeL&JM5 z{`&Y?#q?gN*+;G3vp-h>x#kTHjAO4HLL#4XJ`E<;%62V>uc+R$9j9PVJ zE$Hgs#cagGU9qdVIi1m8yQ_(qL5#uOd@+Lh->9_Pe|uhH*sGCI-Awch=AbveOqkR& z8ApYB`A$VCUS+DVcf(nod8zy;+NE4CQ+p(fRYSdb#~7pd=>Ae_K-bx!$J7EKOVgX}Lmgkalv? z9u#%?QR*$p<8cIb&VAn7Jf20RUG8gUa0H?E`}#^TXJP5(8;+*X!)`s;&(D(kzGlko zKabUXI-6?!d-tgRrt}AYy1Q@mHaX_do~{9=nKJtO!?Z<-{QI>3{=h>Am@A|nnQwrv z$sXKYxUgQngZkoYSCEupkLIOm%QrW8Is9Y;_Som^4F;Gzb15-Bt>RpI+S^MQ!I1iN zpqYb5WPHB+=-TPME(7`xe$`aB;hF2zXHv08*R!KHwm+GxNUfdT{PTzLaJe*4!c7B{T*o>G*8YPFA z&DhXdLwpN|icMN^DI(*G{oZnTyKc83^9-4^9_l;i{@i2UsATcp&y0gEjl=nq1omVi zliRh2_}6H#U^{yXheZ_P7EXiSrl#U1=BFZ5jJ^{qzuK}Y%P>4N3(_NgXOGS}Ycn=p z@$1;vS^nG;ceq(h+)y*z*UKLy$dD@jsH_oqP%Oo5I>MZiM@o`(tpW17b-n~z6HDkvC_s#{-QyVC5M z8r|mNOCwn<&L{lXw0R`&Yow>|kc*OUzn^;SZr#RX0@qafi^pVIK!q=i_Ib3b(l&mk zi4DHNLrWnzu1(RV*8*y7^GM%_yZ-9L`Wyv==HsF7|J3*|q@Ie@2S3?*;oDNXwLVCx zM-;SiQ$*!=RT|~HY|nc5{d(EcbP2%6miO=5%PIZ8udlzajr)B~zlC(Hzh1t%S&wr` z@?WnROxXgQ5Z=&cEJ8~()_k;xitISn*X=sJ81{eK`|`jVkM95E%Du59vNQ-TLhVaL z64xHFFSW$>T1yZiN~EE*me`jnu{3g&Ac&oaH7QC^J84jA7kdzq>f2C__3J=oHH|L&di)SbDooFHqH0(VO-jtp|dFk2;KDA^mZjUN6aSoD7>$m zP3@zw9POS>aZ&jF&}?!n1S>-xcuKAUcVInNp{(f~3dGYmV~$Y6YSuArC+_okrHPui zRjWmFXfGpi)=6Cju6X*bMlJAoj9d-XvPh{7S`37#ArKsZcwm^zrHT$2+2G|3(;N|U zp(tV7txSn3PSZc`ao)wcm&78@>kepjV{Is$*ZZ(=a$cveSy`16aBM|Qa&7W9Xl~Cy z#~jL=;pC64P;H5{bR7m)?vJ|Aa5}vXV%)!ovH-HY7$foyAH^*ukM%(O5h9wX`{na# z)WWltR0GUOh$>(`mh1dY@o84i#L<}r(^@Z~^Ptt$4~dNVzl;kAg!FYwDLDqRby+I* zogG~#o*3*K&daDAr++HjnnjgN^XP!8%f%8WI?p=LE1Vv0&^P{oUP*mYyjbud8}+UQ z^E9f~SgbX9qux#FXbw+lxag#9VEVv5p2v{F-+_ef&68T_S?JF~Ft4PXb+HOD;2jbPp zE=%3!K1ehp@`g>i!1WC40sjU?Qm3tGSukiFK|8)@ZGDxb+2M@fI8G0%qQhw#5T-C7 z*wks$ru~A+E;b_sf_*znQNs4%v_S(F*{)Bn!X;QQ@o!TkB{A(GiCFh0*u&;@nbGE! zT|^0=NcF=zes;H5t$R!hQyBlAMv`$GT4qgRhns)od&ir%9?Ui)$`JVhVe$gvBk-vD zk86F`8D zk3tKHE^WhHeYTto+cDoWmy1O-RR7uIRNuvKaBSpwTO2<)KOfsP2kYIx=h(7vbCj@6 z10Ha81#j06)OA}yN!y{qBCyoc_-=)e<@I@0vwix{D}q|3738#%e0E@~=meeOCGy=U z>$s3gt=T5vt0k;IF;TQ&2OLG!S5fg;^q}4HgKRw+b%7>IDjKE zwpv6Tds^WTU3(|o{AsJ{^iFJg)=LDB?q6SxE#Idjp9NSV_y!nAeNg`c=(n6V38*|VOKQEoi6UNp4UqLo%V zDlI#X>ZKr0t*4ZI;Ba|8#qG!Q-g=rA4~hZSLR?W(E8E?U-{}AfEZMxjzg$nFb_1!J zH7ACm@oricBc_JWndUoJ1->f=3ZCAe*dR-G9Jo8e`qWQz%q9C`D4l6fNW|zE|8-rC zU*#JWwpl=XMV6G>^Ji?oNv*uiw2xw_=^hpw5Kb6`e(7mldz^7BZbsN{pb$os-XP8; zjc!n}1)D$N-CDM+pxzfOuL>K<4vU(x`bIHjdR`1E;$;ydK<|dqhs_%t-SmM&RO!T?C(E(A$x*a{Wg*#kE0wNHLAlMgk zSG(a+P0gb~s>wRlu!73-{{G+cE2zG_^+=KCReW8IZRF;HsKTfO>~LY*C?Ns!DSjKJ zB|r?Vwu|NF5Bo~{O87=+=&T#aU-Gc$3#$?pHEHJ8ga6FQN0ko1&Hhm=EjWOdl#dmg zSZjy4P2(0O&)1eSt-ji^lz0Gbej7{w#?y3Wrx?1TtM1*HW&1#Qnzg%zc5zaN{nOsR zT|77wI)ZREo^|cwXuv_#Qd`zC+3@MgW(zh1oAoU-jur!9YPw6b!={gC&kKgFyfN^3 z89c&K!kbFXy6v;x^mpMC0{i5ktA%&d9nk8qM87$RmWr!`PU@s!EWKN7lyB3rgEO}s zWzR5Q5re1uZi?kghDN)|;|Dxj@22~Qz(L%rl+a@}mqo^yDABNQFF!AI_~`o`d=<>$ z>(~SLP{0pZlMAj!@}P%5KnFVSi#)8KW*mYUz;?xu&nq|cE#@Gc%=iun-*D}xsKXZL zh+1TK?Wbf$So8>J9ow}z-sXsYq_r+HoQ9_-QMB`6;4&nhLC+xa?;5@$1gsnx3M;6LTapYdpF;o=+Gec-`X;z znHUAhM)WICC)-A0KVr!59HbRLLapRrs7jPTCZ4*OuW~a}AfSyg=xREeE zu&?JG03qHIwCbe3!9O4qCP9e`VD<2b80;Z^H%*Uwya-yyZVT4pphWV)m4GQUQFQsq zwnsgJcYo)?!W7>G{eN3{s-A{SoR3jj8Wg~Ij0T*>v+6Mleu1aQFfyn3jL5^nM4ud>H@MVD4lO<- z5pUj38gZ;o#0H)9Zv0XTG}zdaf$&SmJ4-*H@9|@+9isI*>+AT1&n6bk8rZYk7sqp= zMfHmQ`n+aa7kJ0AK;r_Me{4|j{e^`X9zKzy1kH~=4-v>l8Y7m8>DA9V>So*5Yk2Ua z1u7AybrE7{(gOPRy4^IfH4u#;O$>a8^P+=&Pnx-dK-*){7dk8!WNrK1oS`$m@} z(V5BKbsmoJZNx57w2Hkj)sraZ0u-_l5bW?g;+DBRV{UT~g+K_I<~Kv^4l-IKkzEox zu_}qGCSminpquRY2GW9V@&z{}0o@D-kH6PVUAN(M3$<|Unx;La&r;2w^n2B{;0IiR zxSDrK1|_bV+9$(F_wFLaC1W)ya!F{{@Jn^~Kb-Bv2By^I(kNjaTC{1Z_bkszsap57 zflInX*`Sr1uq%07)H@fQd08+Lwxp}^Tf7$qx&5b^)yD-~93sgvR;w=4w2SEO*?wX) z4|fkbuFJl>7zpVeP!5I7mnjKIop2Aix?60LHu3Tw3qSvv+%MrP)81F;(j^=Vam(KG zG6rb(FJe?bzJ6=%*E#qxDUTLAl^7qeX>wSAjkb@Oa40T!jSgK#iyK@M zp1TE)D}1`8zT0#ZTuO-Tj@64_!;NG zI=89%6}&gRO#`l=92VDjyqheX60lhF6xwrJO!rH@uiU@;YH@^lG<0|94tQ9i)n*Jb zW!;rZ)YzxX&ttRNgO-;}DE-;HRQoC9xQ+xL7V+pC;V}v?SvA4=ebp4mrk685}s1fB&!sP1+C6Lg*<*iEoD>0Ry6qP zy-SA4_xN^JPQGd>l*R3^(0}aU9OJEy;VpR7$9jdnOu0t^zhGTh zeqU&I^*U_MlHY??+xkr;mdb z2g1+vD^lsp)f2W!0QReP4~757dh6ihL5u3|K?xfhs02gV1++%jM`HSnu2Fu-)`%fp zIaph3g;mBQnsE(-zx+P!$J3bjSct`~d_c(#Gb6&G@}9zEP)B+dAT;)g=zQxX<$kEy zbUD7O*G_$C@Z=}d{W=tDZ7M}0lt`Cxk`7!Kb)@6nbSPD*&xXj=X?iz*d=aAUU!XjL z5;iei%eU-bX?l%)S|7D_MD^r~M2zq4S#IIvE*zG`3qNS@rBcWZ)FzL~#%DmXl7#g7 zsn3(%p;I+p8uDE#9ln9~wS7i*HzA$b&&Bfo`NrE;~PX9?)t;bB=6fan|+cwcg`0->8zvi z3vU_rZzv;0k3#^&@~v0=Oqn+ zDKqE|xurn7AwaN-zW?p<{CU5(dLf$t9@A06lPI;}(6Kd^zGCMua|dn28wzIH7$6*h z=(J*fV_*MFHgF|kuPiC{S#Zp;IrDCsOR$t2N`bIMH(ZSc*K#)tlt_q`?@%Mvfeqqx1ziE z^%r!~W@yk2P+o4D4Nnf3Ja;5cw49;?|5<&C5+0PDLEEmJ|LAZ@E)n`Y3QXQT(3i60 zzR!*NpLXi?21io#NgK<) zHkAAx6LPo>9e#o++oVUh68#)-9@y}WQ(Q*3YQz#2#}On>BAdr(?E)Zp-bVI0*LZ7i z=es~i32d{W?m*~{*wCEEm<5V)+G89RHyP+wDr!?tRminc@Dm_Zd-5Q1Qw)5Hb{0)V zJM*8k(N4`d{--VZq9XVF2<1J`@3LD^nC7J7mLa7uZB9iG@-%^pKZRo*Ek^yGx`9P# z=~HxXD?a+iyD<~_qFH3+z1j{=ow%$L1j4H#WWTr=xj(~fS%>^L&Oiix-*mILVf15O zP!ZOJjbyJZc@jD9)!OEn2hAlXi_v7z8m~!&snhxWYnSewXhuB4w@l3a9S}TQ*KG+K znO?ZcB{Ra&PL#~E**;>BQ)7I#q3ZqEj;`;V&z3yjC z!^|ZE?Wogpv@BF2Zq5vBTQBm)Q8Qu=(h~q-S|JfbN@f*tsNj-mM#RdJZ=0ljJaXZR zdFGO1c9g`lSApOyZgp9Y1DBr;?Po?jM@dPPboWWFWi02k$y{P>PewQ-jHT=aVq4pw zPeYqmi!vkX*pnY4T1kYb)0BVRJJ5ZI8PV6CW~E`2bGs(iyI5;m=H(Hi_5}R;;3P(v zt;U8}gY&pRq|3wP0cQrg2-+nMq)8=ei5aW;Q3s=hx8I;i17nUpa#*WPFoeJ%O{Q?4 ze864O;~1@bfuk9YYDLqbf&EHSpLDbpcRl!W#8Wq-Bqj3i>I0^UC28?X%(+=5spU)j zuHNO7j=j`-o7Q#~i{7~x`aUhH9x-WdMNW2Pl~l@FTPT-r+A*p7_%e5-V&k~u?@F~Z z;Aa`-D%9s(leSH0(gs+VVbX@G_=yle#hY~pRvTFH2}-1qoY|RTGcdq5UBsfc&g*KI zH5>jwYM3ydHV{Msw3txU%1{<)jrl_;HCn8g$z{poS8%^kR;;PXt*PH0t$+my8zsB~R6TL6kw$Jg;qF=x#uV_yjDVY(sB#&F8 zpI^M<7>dJ!LcB0i$iLBrY$KKb4ef9!CtCWY&D<@8UkAdcp^z0(!ZUK|u!>`^UaIb4nT1K2OGWYM;K~iBU7{k%2719>q5)Xv^RK8DMte{bG;{)Blp+PU^#ro zg5{;!n~T%xKXOqPJiPySSU*s^>}lS9P~z{{z+~f9Ar;TWMm48`*nfl0?5(mAC%bZtbI)q7VYzqYM<9$LGb^oQ6!BIm%fsswG zGG)All(Q;R^+8iX)PhnJ$}JYT%N7xBZG`}&SQryTW#=GR^_rZ!wB8WI`l7VLnqyz zbtuN#kYsG;ZmnJR^my-AsD*ubUknT`$k-Hv%^j{o0HeA{K?Gl0fO!=6_v%~fw`LAM zXkabG8aGO}05<;8N}LoXcTNkAwEg225PV$^b}}B)CcANi650HXd&ac(OP50{AxizP-LVY+O1wrww zo#38qhcT+#jItQnvYA-=9KZa0*Tyy#+5pLSOHjq`&B&t|kVBe9GC^un>cY=2n^72k zHhm33K0g#WzAyIXfQKAYA`gROeS{6Z)Vgk`kr_|RqXe-otlpA`aZqz%*PN`LRL!aP zOqRC1?huukEVrN4uYhVX$clNv2-Ty%L89+cN(IUhFGaIG z)JI6l{NhkCe7}7d={rrfGPr3~@YgRcXAXG@4t!jJ8b6YOQRlpGy7#|i7>^RUC@qU2 zI|sCUgAA_96__Py5!B@iglV5doH|NzV=7nw3Ov|M0e1^QRgyL{hQgWlgrvm%95uW z6_llXJ{ImsW$2fxyP!6za@8h8d ztWg!MrM|gT-(t#7Gu4-x^3zNc76a`7_c+CEpUo5MptE*vFYJ`lh)m%l)o){;M(!N; zl&{oS>#_EHj)a}~tkYB$NcN|v_YL2_H+AnyZMJ!NV@0@EIbV_+)=os#AjwS@XpOJ2 zK{NLj&i+l;)-FE7JX7(hrH3oH+hGr5L{{(by`FB_$m>4u@9;v0+X{c`_0XYhtGw=( ztd;QhfL2J~7Y16Hs1Y(7Vq|(DYi*oJtkah zva{xkIXo3wlB4=P?~`$+Lf8uU06*Vut9|FY1L5g_L^SuU7y8Ar3Y?OVlI%U>nz=-z&~i2A zP4=oGG!qng6CKN;6&UTB<#P3_V4hO`x@pc7SKdsaLyEb#<;)|<8R@if8sRL)X-EIj zgGY2D_Vmh;%*BCwY_y;)NFdC5Tu93&ifJbjUCKOwCG@a^Rc1Sx08*qLQX`KvL#Y*V zwefKkGP#-GjrkKA@kW9Qt)yIx^DBxg3a=Jty#klIzenpOM5Zg_v_>D%J2!(Z>ziXu zgG@rJvYFlUqu`3zZnt%#LlvR6mh#^=&@OY3kSzlUPRQoi8pw0_!$Ng1tPPx=hi@)b z29XV3?gF{2JWXo^B+})jF!Czyb=-h__l14p*8?4J)1r{bqt&GkaV;*||XR_5B30m@6P zh(u02PH~$TA$y(EB1NHakk0uk=x(Dy_9pT>CyC^D=2mXinMdTLToxD;vhCe373roKyKCiJPwpPm#op zGrWpP=2>7iPR;?FTP0L0JabyB%9TKJX_e}b8rHvdM9Y<`$xg{e2|{&Tbr>nk7DG_v zQQM%UhSdbEq@+Mf7M63v>O>w`Eq%0NkEIByV9h;JoN}jv&8O6siF2oc72;BQp$1vW zBJX6#J)ClQ=x|;1Q^{2^P!+3Isxen%DutAj?Ne2#@VQcYvJQw!ERT#UEpC9Lzv3Wk z{(z4Bbzt-98AW&+OgZYTI`-EmTLqCF;MbKJnKL2PL{zPjWI1VDdD+Z2Tb1xqkdG)RDH5I&H!j-rtH%4jkELql|gy8sBwu_GGdnT(b3Xt`ogyum?d=8o8r@?AhX zP)4R4vr2DQ^{LL+jIbERqj3$jqfwwWT8zZe5T)!Xnz{Ey+zC4}F0OSf_ha>^UCrF* z$a-r!SNF31=D}KX31U{#nbu-7jmF(#6p>cq9zadIqGc8%fiy%bdkO)&uFtBTmeXi>e$WTTKWhA(l}}_ZGDW#s?J&Ka}N4+ zue+hF&S5mgbvI129N6u}mxH}VQz!o8K!Zk$3qiM@D}HR7@kw8wxo<6hW4Hzfp9$F-|Mi4DgK*E4bvAAzK7w{>pj_$p5>9H6H(JgTg@6d zp``y7eIeS~(@=hD*hqmpJ%4xBaldXG!|~2nk`Kns2yzVQaC14{S+E;E>;Fw)yB5ZK zviz$HJF{kd`K11Hyt8L%(&($LQ-*sM`vUJcL{CdduX6g^Uke9i;oTAM4uiUts=mDK zrEy~sDUW}Nf4Xc4jaW?WdKxNDy|Gf2=#k1$*YOg4Wz6tBo{M(O#!#iIi zy^l(Af4R8yuj^#_kzsKa4d)(aY?tK^QU-^A?-RJ|0N(j-?7=TR5BUWy76o95>&6Bp(?c>VKCB#G((a2A&G_t_T)b>q7a!WLnrhp(rMOu?>C_?UqY#rl`QMRV)rF;hu r9~L|=XlUKB!v=?b89aQ%;E<57R6W^0+P;nNf6DfbHEkJFXz~98e8hGd diff --git a/killport.js b/killport.js new file mode 100644 index 0000000..9f7a859 --- /dev/null +++ b/killport.js @@ -0,0 +1,51 @@ +#!/usr/bin/env node + +import * as child_process from "node:child_process"; + +const args = process.argv.slice(2); +const port = args.length > 0 ? parseInt(args[0], 10) : null; + +if (!port || isNaN(port)) { + console.error('Please provide a valid port number'); + process.exit(1); +} + + +export const killProcessOnPort = (port) => { + return new Promise((resolve, reject) => { + // Find the PID of the process using the specified port + child_process.exec(`lsof -t -i :${port}`.trim(), (err, stdout) => { + if (err) { + // Handle command error (such as permission denied) + if (err.code !== 1) { + console.error(`Error finding process on port ${port}:`, err); + return reject(err); + } else { + // If code is 1, it generally means no process is using the port + console.log(`No process found on port ${port}`); + return resolve(); + } + } + + // If stdout is empty, no process is using the port + const pid = stdout.trim(); + if (!pid) { + console.log(`No process is currently running on port ${port}`); + return resolve(); + } + + // Kill the process using the specified PID + child_process.exec(`kill -9 ${pid}`.trim(), (killErr) => { + if (killErr) { + console.error(`Failed to kill process ${pid} on port ${port}`, killErr); + return reject(killErr); + } + + console.log(`Successfully killed process ${pid} on port ${port}`); + resolve(); + }); + }); + }); +}; + +await killProcessOnPort(port); diff --git a/package.json b/package.json index 934ab12..593ad6c 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ ], "private": true, "scripts": { - "dev": "bunx kill-port 3006 && bun run build && cargo watch -x 'run src/main.rs'", + "dev": "./killport.js 3006 && bun run build && cargo watch -x 'run src/main.rs'", "start": "docker compose up --build", "ai:search": "genaiscript run packages/genaiscript/genaisrc/web-search.genai.mts --vars USER_INPUT='who won the 2024 election?'", "shim:ai:search": "pnpm build && ./packages/genaiscript-rust-shim/dist/genaiscript-rust-shim.js --file=packages/genaiscript/genaisrc/web-search.genai.mts USER_INPUT=\"Who won the 2024 presidential election?\"\n", @@ -14,7 +14,7 @@ "ai:url:read": "genaiscript run packages/genaiscript/genaisrc/web-scrape.genai.mts --vars USER_INPUT='{\"url\":\"https://geoff.seemueller.io/about\",\"query\":\"Describe the details of the page.\", \"action\": \"read\"}'", "ai:url:scrape": "npx genaiscript run packages/genaiscript/genaisrc/web-scrape.genai.mts --vars USER_INPUT='{\"url\":\"https://www.time4learning.com/homeschool-curriculum/high-school/eleventh-grade/math.html\",\"query\":\"What is on this page?\", \"action\": \"scrape\"}'", "prod:logs": "fly logs", - "test-http": "./test-search.ts", + "test-http": "test/test-search.ts", "build": "(cd packages/genaiscript-rust-shim && bun run buildShim && bun run setupDev && cargo build)" } } diff --git a/packages/genaiscript-rust-shim/README.md b/packages/genaiscript-rust-shim/README.md index 040c853..e69de29 100644 --- a/packages/genaiscript-rust-shim/README.md +++ b/packages/genaiscript-rust-shim/README.md @@ -1,3 +0,0 @@ -# genaiscript-rust-shim - -simple package that wraps genaiscript for binding to `tokio::process::Command` \ No newline at end of file diff --git a/packages/genaiscript-rust-shim/bun.lockb b/packages/genaiscript-rust-shim/bun.lockb index 9feb5b8e53081caf595802ded237f0477e8b3080..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100755 GIT binary patch literal 0 HcmV?d00001 literal 3144 zcmd5;eN0+nF(t!7N_p)b^aI~}<-=gAPl!q7w}Wg#d#7TAH%RvfnEo6J+}{RopvD!9pPm~(l2_}gmvtal>SjXuJ5mW)V{fj*mpRz z_1T!UW@Xo%@Dq#vbC}9P+?5JP#D8;o7s%mWOlrI3Uq~DS(fMxp+OP1!Ff8KOd|w zv5|a-q_>IiJrp#1=<<*@$Iw~0<#t8)r7^!#XAr^4Qc`-==~goALedj^s-}9OoUi*HjM{ zZ&=qCrF%X9>?bu@o!^kJUJVE^=pEIXurv=|&pZh-j@)x-`>zC!V!D{!T|TXE&4hME z*@S27y8CJyeZ3#=WZs=R6>``+QnBOodp}Qq8h9`xc+AlvEXzE3?0!qpc@JIzau#So z6mHXNwe3dYd`eZ&-JAF2raSzSk-H8_Pj>scY`?03+c|zouLVz!*lNE@Q4^v48LJXY z?Fk1y{BpKoZ|^$_4_;UoNCd{=A^+Czk^@wI7bZ>z|CGAvNc%XmXZVDfP5aoMuC@-R z*>k39_Wd=`qR?KHsY+)*W5Szprsqay<vu&w!rRq4Td`LtO{&sA%a(j_ob^!3M zl%TjHy&OMQ(Ea7OyHc1l++Fk|r-e#}*5Z_jVKoK=j$T|mg(k^(kyIjLs3Ov=+a{8U zGzLmaP*-vs@!%ncB2=bH6>3W~IF(}Fr-%nnh2C}aPH*6)%W(-V!7$VrpqJi@Z_uzL z!(tff70}zy=SARB2*K*XfL#Q7{rS9-Xk3m*NHEk_pgw`m3x_TOL7fKb8~{dvOQ8!3 zV=B25UYtLvXG$5;m`Bq1^93wPn>2Sh* z(xjmnEluUJV%oy6VrD;OWD9di*It5iN`O{yKg;Gau>?VrdWvD`Lfn*V%w}*ittZ?@ zgczENo#Dq>eGyzZ85Tj$+i+l~y_^Dg_CLf50J&DT~rl zOZwz#253B&VplOhvZdX~X8<~%5j%@c=8T9lpROD(f_G;C5V#j&IUa>aLLO(4{15;A E4G|wzqyPW_ diff --git a/packages/genaiscript/genaisrc/deep-research.genai.mts b/packages/genaiscript/genaisrc/deep-research.genai.mts index 1a15d84..44456cd 100644 --- a/packages/genaiscript/genaisrc/deep-research.genai.mts +++ b/packages/genaiscript/genaisrc/deep-research.genai.mts @@ -1,7 +1,7 @@ -import {task, entrypoint, interrupt, MemorySaver} from "@langchain/langgraph" +import {entrypoint, InMemoryStore, MemorySaver, task} from "@langchain/langgraph" import "./tools/searxng.genai.mjs" import {SearxngClient} from "@agentic/searxng"; - +import ky from "ky"; script({ title: "Deep Research Program", @@ -15,6 +15,7 @@ const {output, vars} = env const breakdownResearch = task( "breakdown_research", async (question: string) => { + output.log("Breaking down question:", question); const result = await runPrompt( async (ctx) => { ctx.$`You are an expert research strategist. @@ -51,39 +52,44 @@ Output the breakdown as a JSON object.` }, } ) - + output.fence(result.json, "json"); return result.json } ) -const globalCtx = this; - const researchSubQuestion = task( "research_subquestion", async (subQuestion: { id: string; question: string }) => { + output.log(`Researching sub-question: ${subQuestion.question}`); + const kyWithHeaders = ky.create({ + referrerPolicy: "unsafe-url", - const searxng = new SearxngClient({apiBaseUrl: "https://search-engine-gsio.fly.dev"}); + headers: { + 'Authorization': 'Basic ' + btoa(`admin:${process.env.SEARXNG_PASSWORD}`), + } + }); - const {text} = await runPrompt( + const searxng = new SearxngClient({ky: kyWithHeaders}); + + const {json} = await runPrompt( (_) => { _.defTool(searxng) _.$`You are an expert researcher with access to comprehensive information. -Task: Thoroughly research the following question and provide a detailed answer. +Task: Thoroughly research the following question and create a JSON formatted response. Question ID: ${subQuestion.id} Question: ${subQuestion.question} -Provide your findings in a structured format that includes: -- Your answer to the sub-question -- Relevant sources that support your answer -- Your confidence level in the answer (0-1)` +Respond with the specified JSON format. +` }, { model: "small", label: `research subquestion ${subQuestion.id}`, maxDataRepairs: 2, + responseType: "json_object", responseSchema: { type: "object", properties: { @@ -105,19 +111,20 @@ Provide your findings in a structured format that includes: }, } ) - return text + output.fence(json, "json"); + return json } ) - const synthesizeFindings = task( "synthesize_findings", async (mainQuestion: string, findings: any[]) => { + output.log(`Synthesizing Findings: ${JSON.stringify(findings, null, 2)}`); const result = await runPrompt( async (ctx) => { ctx.$`You are an expert research synthesizer. -Task: Synthesize the following research findings into a coherent response to the main research question. +Task: Synthesize the following research findings into a JSON object to answer the main research question. Main Research Question: ${mainQuestion} @@ -128,11 +135,14 @@ Provide a synthesis that: 1. Directly answers the main research question 2. Integrates the findings from all sub-questions 3. Identifies limitations in the current research -4. Suggests next steps for further investigation` +4. Suggests next steps for further investigation + +Respond in the specified JSON format.` }, { label: "synthesize findings", - responseType: "markdown", + responseType: "json_object", + maxDataRepairs: 2, responseSchema: { type: "object", properties: { @@ -147,15 +157,15 @@ Provide a synthesis that: }, } ) - + output.fence(result.json, "json"); return result.json } ) - const summarizeAndIdentifyGaps = task( - "summarize_and_identify_gaps", + {name: "summarize_and_identify_gaps"}, async (synthesis: any, findings: any[]) => { + output.log(`Summarizing and identifying gaps: ${JSON.stringify(findings, null, 2)}`); const result = await runPrompt( async (ctx) => { ctx.$`You are an expert research evaluator. @@ -171,10 +181,13 @@ ${JSON.stringify(findings, null, 2)} Please provide: 1. A concise summary of current findings 2. Identify 2-3 specific knowledge gaps -3. Formulate follow-up questions to address these gaps` +3. Formulate follow-up questions to address these gaps + +Respond using the specified JSON schema.` }, { label: "identify research gaps", + maxDataRepairs: 2, responseSchema: { type: "object", properties: { @@ -197,27 +210,28 @@ Please provide: }, } ) + output.fence(result.json, "json"); return result.json } ) - +// Research Workflow const researchWorkflow = entrypoint( - {checkpointer: new MemorySaver(), name: "research_workflow"}, + {checkpointer: new MemorySaver(), name: "research_workflow", store: new InMemoryStore() }, async (input: { question: string; context?: string }) => { - + output.log(`Deep research initiated`); + // Step 1: Break down the research question const breakdown = await breakdownResearch(input.question) + // Step 2: Research each sub-question in parallel const subQuestionFindings = [] + // handle both subQuestions and sub_questions, since the API returns one or the other + const subquestions = breakdown?.sub_questions ? breakdown.sub_questions : breakdown.subQuestions; + const forSq = await Promise.all(subquestions.map(async (q) => await researchSubQuestion(q))); + forSq.map(subQuestionFindings.push) - for (const sq of breakdown.subQuestions) { - const analysis = await researchSubQuestion(sq); - console.log(analysis); - subQuestionFindings.push(analysis); - } - - + // Step 3: Synthesize the findings let synthesis = await synthesizeFindings( input.question, subQuestionFindings @@ -228,22 +242,21 @@ const researchWorkflow = entrypoint( subQuestionFindings ) - + // Step 5: Conduct follow-up research on identified gaps const followUpFindings = []; for (const fq of gapAnalysis.followUpQuestions) { const anwser = await researchSubQuestion(fq); - console.log(anwser); followUpFindings.push(anwser); } + // Step 6: Final synthesis with deep research const allFindings = [...subQuestionFindings, ...followUpFindings] const finalSynthesis = await synthesizeFindings( input.question, allFindings ) - return { question: input.question, breakdown: breakdown, @@ -255,27 +268,26 @@ const researchWorkflow = entrypoint( } ) - -const researchQuestion = - env.vars.question || - "What are the most promising approaches to climate change mitigation?" - - +// An arbitrary ID locked to this workflow run const threadId = `research-${Date.now()}` +const options = { + configurable: {thread_id: threadId}, +}; -const config = { - configurable: { - thread_id: threadId, - }, -} +const researchQuestion = env.vars.user_input; +const inputs = { + question: researchQuestion, + context: vars.context || "", +}; +// Execute workflow. Checkpoints are manually sent across the wire in the tasks. const results = await researchWorkflow.invoke( + inputs, { - question: researchQuestion, - context: vars.context || "", - }, - config + ...options, + } ) -output.fence(results, "json") \ No newline at end of file + +env.output.fence(results) \ No newline at end of file diff --git a/packages/genaiscript/package.json b/packages/genaiscript/package.json index a0acc39..d67a74a 100644 --- a/packages/genaiscript/package.json +++ b/packages/genaiscript/package.json @@ -9,13 +9,16 @@ "shim:ai:search": "pnpm build && ./dist/shim.js --file=genaisrc/search.genai.mts USER_INPUT=\"Who won the 2024 presidential election?\"\n", "ai:news": "genaiscript run genaisrc/news-search.genai.mts --vars USER_INPUT='What are the latest updates and developments in the Ukraine war?'", "ai:url:read": "genaiscript run genaisrc/web-scrape.genai.mts --vars USER_INPUT='{\"url\":\"https://geoff.seemueller.io/about\",\"query\":\"Describe the details of the page.\", \"action\": \"read\"}'", - "ai:url:scrape": "npx genaiscript run genaisrc/web-scrape.genai.mts --vars USER_INPUT='{\"url\":\"https://www.time4learning.com/homeschool-curriculum/high-school/eleventh-grade/math.html\",\"query\":\"What is on this page?\", \"action\": \"scrape\"}'" + "ai:url:scrape": "npx genaiscript run genaisrc/web-scrape.genai.mts --vars USER_INPUT='{\"url\":\"https://www.time4learning.com/homeschool-curriculum/high-school/eleventh-grade/math.html\",\"query\":\"What is on this page?\", \"action\": \"scrape\"}'", + "typegen": " genaiscript scripts compile" }, "dependencies": { "@agentic/searxng": "7.5.3", "@types/node": "^22.10.2", "genaiscript": "^1.95.1", "happy-dom": "^16.0.1", - "ky": "^1.8.0" + "ky": "^1.8.0", + "md-front-matter": "^1.0.4", + "@langchain/langgraph":"0.2.57" } } diff --git a/smoke-tests/test-deep-research.ts b/smoke-tests/test-deep-research.ts new file mode 100644 index 0000000..f17c0f9 --- /dev/null +++ b/smoke-tests/test-deep-research.ts @@ -0,0 +1,43 @@ +#!/usr/bin/env deno -A + +const API_ROOT = "http://localhost:3006"; + +const sid = crypto.randomUUID(); +// -------------------- 1. Create the agent -------------------- +const createAgentBody = { + id: sid, + resource: "deep-research", + parent: sid, + payload: { input: "Research unexplored cures for cancer." }, +}; + +const createRes = await fetch(`${API_ROOT}/api/agents`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(createAgentBody), +}); + + +const raw = await createRes.text(); +console.log({raw}); +const {stream_url: streamId} = JSON.parse(raw); + +console.log("Agent created with streamId:", streamId); + +// -------------------- 2. Listen to the SSE stream -------------------- +const streamUrl = `${API_ROOT}${streamId}`; +const es = new EventSource(streamUrl); + + +es.onopen = (e) => { + console.log("connected", e); +}; + +es.onmessage = (e) => { + console.log("⟶", e.data); +}; + +es.onerror = (e) => { + console.error("SSE error:", e); + es.close(); +}; \ No newline at end of file diff --git a/smoke-tests/test-search.ts b/smoke-tests/test-search.ts new file mode 100644 index 0000000..d742aeb --- /dev/null +++ b/smoke-tests/test-search.ts @@ -0,0 +1,43 @@ +#!/usr/bin/env deno -A + +const API_ROOT = "http://localhost:3006"; + +const sid = crypto.randomUUID(); +// -------------------- 1. Create the agent -------------------- +const createAgentBody = { + id: sid, + resource: "web-search", + parent: sid, + payload: { input: "What is the capital of France?" }, +}; + +const createRes = await fetch(`${API_ROOT}/api/agents`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(createAgentBody), +}); + + +const raw = await createRes.text(); +console.log({raw}); +const {stream_url: streamId} = JSON.parse(raw); + +console.log("Agent created with streamId:", streamId); + +// -------------------- 2. Listen to the SSE stream -------------------- +const streamUrl = `${API_ROOT}${streamId}`; +const es = new EventSource(streamUrl); + + +es.onopen = (e) => { + console.log("connected", e); +}; + +es.onmessage = (e) => { + console.log("⟶", e.data); +}; + +es.onerror = (e) => { + console.error("SSE error:", e); + es.close(); +}; \ No newline at end of file diff --git a/src/agents/deep_research.rs b/src/agents/deep_research.rs new file mode 100644 index 0000000..299742c --- /dev/null +++ b/src/agents/deep_research.rs @@ -0,0 +1,32 @@ +use crate::utils::utils::run_agent; +use tokio::process::Child; +use tracing; + +pub async fn agent(stream_id: &str, input: &str) -> Result { + run_agent(stream_id, input, "./packages/genaiscript/genaisrc/deep-research.genai.mts", 60).await +} + + +#[cfg(test)] +mod tests { + use crate::agents::deep_research::agent; + use std::fmt::Debug; + + #[tokio::test] + async fn test_deepresearch() { + // a really provocative question for research that generally yields infinite complexity with each run + let input = "What is a life of meaning?"; + + let mut command = agent("test-deepresearch-agent", input).await.unwrap(); + + // let mut stdout = String::new(); + + // command.stdout.take().unwrap().read_to_string(&mut stdout).await.unwrap(); + + // println!("stdout: {}", stdout); + // // Optionally, you can capture and inspect stdout if needed: + let _output = command.wait_with_output().await.expect("Failed to wait for output"); + // println!("Stdout: {}", String::from_utf8_lossy(&output.stdout)); + // println!("Stderr: {}", String::from_utf8_lossy(&output.stderr)); + } +} diff --git a/src/agents/mod.rs b/src/agents/mod.rs index 3cf8f91..fecb0c6 100644 --- a/src/agents/mod.rs +++ b/src/agents/mod.rs @@ -1,4 +1,5 @@ pub(crate) mod news; pub(crate) mod scrape; pub(crate) mod search; -pub(crate) mod image_generator; \ No newline at end of file +pub(crate) mod image_generator; +pub(crate) mod deep_research; \ No newline at end of file diff --git a/src/handlers/agents.rs b/src/handlers/agents.rs index 2cb6554..a1cc2bc 100644 --- a/src/handlers/agents.rs +++ b/src/handlers/agents.rs @@ -97,6 +97,9 @@ pub async fn use_agent(Path(agent_id): Path) -> impl IntoResponse { "image-generator" => { crate::agents::image_generator::agent(agent_id.as_str(), &*input).await } + "deep-research" => { + crate::agents::deep_research::agent(agent_id.as_str(), &*input).await + } "web-scrape" => crate::agents::scrape::agent(agent_id.as_str(), &*input).await, _ => { tracing::error!("Unsupported resource type: {}", resource); diff --git a/src/routes.rs b/src/routes.rs index 3a99fd9..000a700 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -18,6 +18,7 @@ pub fn create_router() -> Router { .make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO)) .on_response(trace::DefaultOnResponse::new().level(Level::INFO)), ) + .layer(tower_http::cors::CorsLayer::very_permissive()) .fallback(handle_not_found) }