From 2a35dcfa3f4c1e9db9942dee46e05183d9f74fa1 Mon Sep 17 00:00:00 2001 From: wullie Date: Mon, 3 Nov 2025 22:49:06 +0000 Subject: [PATCH] Upload files to "lib/wren" --- lib/wren/libwren.so | Bin 0 -> 165528 bytes lib/wren/wren.h | 554 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 554 insertions(+) create mode 100644 lib/wren/libwren.so create mode 100644 lib/wren/wren.h diff --git a/lib/wren/libwren.so b/lib/wren/libwren.so new file mode 100644 index 0000000000000000000000000000000000000000..74c264e7994f25861a6543e77074aa94f2a0f997 GIT binary patch literal 165528 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

c!lW^saYmxOdbdZCkQh^}T21@9EMtV?(AfKF zw#DDO#9!DB&80u7Wux=eexu9jM}gXJX#f?Y-x&b&>4ytH3WAF>F7+py2JNjH!;I18 znsLsv=$F_B4Pbjq0UKh=`2P9APK_1@F5pLH zbxzz2>j(kziSp#k+?+Q5pD;Mq4wzU+0bn;|J#&7X2-rl{p?}%*!S-&9OEVjTi}OeL zd(%OV|3c0MbZp%i#&~RAjq!lPbzBa4zsi_XZZ2mXfBRbU^~^G~o@S)Z`4Pw0Oq{_a zP3qfUrTg)FgNEa9yke0&gwC0LkMc8fiIdpkVCylqdS+W37s0k2YIkJmCiuK!Cy(vA zVAU)3bfl1wyx;Oo^PxFrfuki%CljBZlVHL;b(mZCZH(TE%C99a%$VaaC!qgQ<$(ov z#ZT40zdF)_=9B8rl*hMtXi|Vtwu-#yFhwp!kv*(Gn*q9sYT#jytXL)N`%ObL-o99Al*wzl8j1igC?*|&3CvT(R z@5nSvS!U;cD(WT&J0rPaJqUfrTJm*}1wp)I{_q3qeiYL)$Fe9NHV|SVP#k}!aQ8;@ zaoi3+7V$5faANyl$t)g7xLh(HO-_g%sfD)KPVBW-JV43>(`|%q7fZf#j z%xUeBeYoE|fDMhd!?DgJ}8u(jbQcwysfIAkjIMtbSo=5LdUOr$bSOye+p+p*@Vsb)9KBR*nTm#Y>ghy z71P=A(qTDe<(0hW2Qxw{7>EiSVl}gGDEcB^KT8}3W!*TE0 zm@qc$IrlKPz8<@EEmo5l$=f|ffy3+%9~Ya?StD^Ij#lcxO?saNt~hBDZzeKDaqD@p zt^Q;f4zagRTfANN66AdZdD5sm3?n5byWMD39_H4~Ye)trzK4#WZKo-t?mbpNegyDX zc=4DxkVJC_4kO%!)LGb%3uhgFcAUcIeLAo)?2G8WD)K^QKjDEh^FyE*znbyNGNHVU zxEqmlA<-(OCEtk!IE@N+ZKU8p-SaUtUR3nVd@&?E+LfWlx9Yc|B<7Bq*; zMpjl0JppSi`u}$Gv^`yJxgdJW5&RbTOzZ)K@4zzHF`VyGU{J{Mg>Y()8zqr*OH%yC z%r*IPnmBFK(9)eE8Zj^qrHB+Pi2kG^sxfI=inxI$(3m2w8DuFU<3C8?E<)y>sjsqb z9!^a{t*?&sM;grwJuxlG=CgDjh544ylYb-WsCwst&dwfiQA5qY!-~!Xr$_^S{a60v znOqLm#MP%jfVOpl&jj?}G3m5A-fspzvvu8UB$y|Dj(#3}{ybV6HFN^HO0XkI4L#1= zb}dCh&9CycZn=*5`EVlIsloojx$yWWSy=R}v z+q>oyTYGCrFb5;7a*+1+PYQM<_|J>#Jb{)du~C$UTe&&e39gpT2awJqJSUq@Nay25 zK<7Whoc3@$si6vJ*t`noSR%#v#pi2Un6sn1s9EZ9U`@NG`l!C}kZMo{z<#W{+u62{ zc{5?me|q8H>=zT7#M(C;VqJ~oF7Z8VrNK=RZz(XY%*O+#iCEK-z26AWIi&~fFH36ll()LfAs{B!6GwL^8ehq+Us8(^nK62;R~+0Rm?5njo~3 zxrZJu*YoN}ECElvVZJ~E|^kn?_u~Uzu)Mgwi!5{55F2*)8 zo2cRGp|vp{HT`3ZoC6n=OU$!xV2eWBs2LacOj|2=pdhxYr*j@{5B6{z_>;`Zj02fC z;=tmr|HZtJWFF1ET21&lY3BK4Ninr84d7lpXj2vJ za4pW!^OCjZyuNJFjev?i1~bG-YN#H0unBz`8WXLDUYvCg(857Wy%Vl3B9kNxgF*qB^Vt zULBc&>BO>^Jt-&2TuX;R#ME_r4&;A`#rbIJVsW<~t)KkIl6X+j9B{Sd;SdFb_;_%m zfs%fJ11c6Gw3_d7016M0!Tn2gvL`FPiJ1qS7^V3d>c&Fdti~Zu8iB$#)DDPKD1Mk? z`bbMW5~YS7LH@kZuF8vXXiBW}w|jKTR>@-V9%*H-R=+{qqlei<{7M*`$~8SxZ1HwF zLbWLlQq%4t;={l7^H1Og15?ZboReb5Xlf8u?4?#uLr4CT1(7Ij+U_+Io@f2Ei&c$H4CI=e}fAHo*>gP0IVy5&ARKr|`)GnqJ_573CVL{p? z^ILeo7}iicm1!PN$I@7*i1VK-hSOIRyWq|LQ@hMgS^bI&3llthSuU3KlG|6irc_2!e0UNk#s~y4Xp&>8^(lFL+>N6dkt+= zyI-gON$-o{&ho&u`O>TOvlXiT6cHk8`JA|<%Ypi?!B>7H@46SL?c~)ZDkh!|!BHyn zwP&ri9f66FDW47%T5)U|UzO&cY{l5^ktZNJ>18c#9lKwr|05S*&_PcpSbAdmF|Wn) zH}Vm4SBADk39V{O0T!l|D+_MAD;>-qDI5b79C9Yey`BGKf}F-HnH8W)BlmB zD2C5BP`}(7=FjkQ*#mcLX=~p7I{hChqW(%5V=Tkzp!E~T#E zKNB}%D4F{|j_O|xeF3gqiI)C*R^M}BmZS9@_bo|hYB*WQjufs3a~vtOqE>9@G8*&d zJ6;WR)WXcJBa!4T6MLG7y3DetDV+sRj4ns{qH%~LUO^7@C9wp@c>cMb_XlpT)Be1@ z=IV${gj(4+6FU|(mq{_V>gNtE@`wMTbpC`0f8;1ORv_euI2M86f3`W|P<&vRkPoL1 zmx7xxJ^cM;;sjkfvrZ3SSmT9eZ3Ci4P_j>BjCpus5D&@Dr(D4`WSJCy1jlysj5T!B z5K9Iefcl-C|8~=E`?6Q5syJSg;xXz1`0X za~#k<4gvmvhuk(qA99PNv#>-6yh*S;2=EcHF{+Z;!%8}IsBd6%SzA3l#qxuBA;xe6 zD$I`Rv%}}qc6iMh?$0*2JVR&oU(RsQb0GxTPahxu6ubd`($~wM`NGbCJ9^ZYJv)Z< z{$NnuSe0#8R-`|h?E@&EIVi9(zhsbO&rSofSEWV1evM>6;o*ujHVR0v^A0E2qJPp| ztU~TT9H*y>|NbI+3O&8@gSi_&MPByco~(f;jHp9uAQc4(4Ulh)cM7ma->~oIF`lQ2 z`HaGX_&4Kq1J3U=i9U1ZN`!lHT6T-<={Y*G6V^uKllGMS%|RmNQRA}viI2jBgq zSbvY#rTy@}L8m#G%j8k(@#48F^L;!78{Bsio;%++!e2@c1?@q}knGB+WZz(VjTHWQ zt3>mQ8afR(m<=B=9k`j`Mv0G1hE_wHRJW=v>yw z%spkLC(!I;4C4aClz^#EGw!Fgwi@aUi$Dsgrg*X?^}n$AvF-!+KK>HY&b@?&Q!ha& z(fRFB3Jg61Thy~TvJdKmw*M<_?66)L!DJOF?jawpo3&eQy4kgzq)*_wsmjNx*H$!X zB!_ni_&3hCm%a|wtv`eV_DCbE*&!$SxEXwrJ| zex@$#efMPA5Z1c9^&uM}HEX>|%HOgdN8%bQe-NXTL5l@D2KlQDgT{UJ8;j0| zPJ2aldM~DXwtvswtwy$V0&F-KG&4JayA_J(beye*`k)sCJF?W!dx2zd<;xj!_SCV-g?d*h8M-M^waiVOh)eIK?=~~?ASaGbIQJJ5@ zCyK>KdsgnlEmY~QWqgHTiKr5G9Znh_U>?z}7^gNh>* zu(x98#f6UEa2cvk-hy!8Bp=HC54xdyx9`r!4!8Y+n$md-dfFxtQzv;5M4NkK4r6rc zW4$BWeEaW*F7)I-6dFBhA|Am)r-GeG_n%=`^o`V?(06EN`!DtT#XFD=6*vxiBGB(E zD)dVWaKZ*MGnjw|bCqjFH35Q+a#}XhOYtaB93YGchxzj3jFF}{nGIM|LS||M$UOv) zO<(|MSbS2v*X)ZnLK2>b;(M!?6WgelZa(w`-Q0Z}?W*lT8x@cnYqik?5XRlih1yzm z0#_=I`8`SIs~P`^`NNWnoym^Lm2?=nCPA))E*a2eDBM9^<~>*l@qpHLa}zTcTnF^* zfuw^6NSBAuLF5s;4x}yv&j_}dc}8TDdvbmPaoBg>M$zHa=Z=#4!HL@u3n!y)=A&h) z?IM@P^wqQRTuS_zgXFV{FdM$0>JB4Dc)ud=Su6<4dKS76!V1`>N9SYOf>XylZBm$7 ziqUf@Rjqy4t}6R08KNC?{!6TK$wrX%kw#Tt{u?ppO=Rm1dmcS>xuZ~Sciq9VARAUm zz4K)dR#~?0aQk7(`t%`t9lLagCQNSB9oFL7v&LHgCS*dh|N61C=>Gg8F<#6Kf201z zd~LSmPx7Bax!*!=asnyd!$(K{Uq z{kWIahq>kGo$*$qfg= za)nc`!X4%hpCR0duF75=7{XOy=P1mNFEb&MHR zFEX8U!Tc1wd!p?g+V3E_spp!XvcBKF+=KrhceKC8Viu7fp)x90ia%f<^w$6Da8sio zk_nG4QJn7!IZdFMjVykG2J84S>d)at9ZeqRk>rdSS7yMY!{#)m&CFfFj!ZQ)mS#{R zE4dl2vSCoDf{vK7E{7jYu4N@&pD`!pPn`YTcPXrA4R+92?1LUt^BL#6joSjy$QWZ5 zZ6>KJ0w@mlQ-hkREP9Ed59jC$eAseu`NH&{UVu}(NiX+`!@L@D29S%cHMr6%F?^(a zuW<>5LvXw}>6NSFl%|lg7RhkD*J((mB+SuCPaw$$Jr&Ta<>xeqoaKnU(Cx?{zy%pY zPQL@s3WS_b;6fksJPc`i8z71>?qPROu2l{s{ft&a5QN^80Eh%~cYYYW+38EdzUVS8 z10Lz}wfz@+axyA+BQLDM<7f^a zMCKdTN#pvVyM(hI#GaC-=3zYJ`2Bi3apFJ(;FhOo6eY006P}FCHixgoGdwq=2ddTY zDWr|myKvuHCEkH$;vHl)GAJhK7T zoKAY1K~{BkUJ5U_ct+_GC>O4yhn~I0A@ln0)%s2J=zp{6!)=^FE`IR_44s8-GWYA$ zJLqkwG?=6%$|_nj+`5Sd9s=~SkP^&-hi-uOEy1b6|9Sv|Q|PzJtb@x%@Af~)nXs21 zr0R8VB$Dor8MlL<3B$W0Q4IN2H(-K99kDC8-JHiJOAop|v^hsJpyV1F7VK|j@%U;2 z-m6XVs$2+)tC#v^lNn+Zb94RzUys~2(QLb+7WUe|=fNk~*b7ZK7Jf4J=#3_V0v#vk?}yn=WA<9#k0NfX1?fVr?zkrH%EqS-m)J^&&@0{H#ss zaMqHOPzk8)%_r#v73Z_v=*ZP9E83NfW7;1LHe&NS_5MUw;qypZ+6$%I{Hl z4^Ohw@YRe847?3y{9UZQ%&YE(2hwKA8EjM`UPl5GZyzqKL8e9LCnP=!SCde@6EiXr z2@rMdDXi`g^KC2&*&lkc{Qq#)>%@#jPM)L0$ZweIqUXh!B|_hV`T344GHL`nyT=T{ z3u9x!M@DM5FN_z0GvT8aX&~$J$CA~D4Q_YgM)vAu{J<;)tG_OeTm4obID?LHmPn1cekg`?|%vKKrPiCBrI|IN7?zhTiEv!lko1qi!qlZz$&j0=6t-1|sk zx-I1Fa8WrGSTtV@!%ugc2`rhn0Ih?NiwhQF6;tak!#tK9T%W7I3A1f}&9cALCC?uN z-RGk1jJ{6I;2B}K!b$=vgyN}QxWvxNE@$PSZ_(@B(t?fHzsSMcD$&8rg{&~V+S);4 zb6&>nA%&;~`J}sGQ?mZ1xei^%K!=PKSKV!KyjoNgUIj>o>=;%E-iZyV$Sm^0?C+bI zh9W4Ha_RJjV2Eku%{Je;mr@VMBTeGb06wrSUD+)CQ*7S5GbRdJk!e%B{01-d3uirm zNEE%`@KuUZi>bw&_Bxzu5ztPXKNzV8^tim!(pI_upAZ!KhY|C%$fM@W$UtY)zDcqg@?0_zqx(>#uS2O}?;VuR-p}GT?oR_p>8(ywqXn33#5=XF!%vYn8jGXyFrrK*h*sy@yYq3N*!bERT_i=lU@3S202{-dtc6?vGt zEv?Y03KI9u!!Z3aOocLT#whyxIhf?qg}Bi4viq=v!agFcE;8_Jtj_8|@$y83(5s*$ z=49vNZ;s%79hi=xNLpFJNyZIs{R>)gxFCySj>h=b!nAVH@gye#d*&}_d_txOB*i?I ztPhYm0!cIDfQ-?fq&b}VyTm`7`r2`EiuZM5OFhDT9T6dF!F#ZF;{7$rKhihg8(_ZP zaOu7`_x(t#Ie&qbdIp$03?^(HPq*G6Sd5FY=;?8+k6wlFaE9q!FmJ}Q!P2^)50+sF z^pds2A0ENe$YHK0GZlNlKD zkLt(%s0&tT2vFdSYni)hG(DoN{}S)n8w0DE>DAxy<$TK@f~KlogD~U4Ur;v_4I+){ zKWs6-WJrDcej560i}@h$gEI$V;uC}ERQyD_>`gRitpvq;`hsLL?OD{1&Zb*$ghPw` z+<_{tdz#d^8E-|Km!>Ys#2xg)Mfy`;Ltafre&l;#U+gw>1?8t#n2A3+L_Is%pkthA9{8@D}i6=C1O1@t#HvFA-12Oa0%)COwH+izvq#%*4az%|p*%|eL)+0w2&nyM$O|)tWIQZ(N23NLL;Zdh^DX;z< zU#Lu^;1iuEw?&|6UMYtNhYUqMfsR0KBktxAC@KXj6cLv)XR`ERScPxEd`T?HiACW) zrz`Ufx`{-??!mEYh{Vw~OkO{j^LB!*Sewy$6TvB*M#4x3gCWF#YrCGNH`s)e$?`*l zA23Rjp1%xdYVd~D4Qjtc{9#DdEJvI0_N%@ObL|=|=kZ5ES>TfC_s=RF1$=Byco9Xy zmo^%y;t4@)u2;@L2VqSJ!&&kR3@0kW9QE7SG3;Z5H|8hu=ZAzC8!;-Vhh2|>&f~L~ zmfoOf1+8b9faa%IZATtt!w0?#XODP|r2xF$+Z>G;0u1*M4~|S{v@M}=#`3j2-^2Z+ zMK6%L{Z1EDhywCS!=_H$VQbmZNeG6@9iX@Zy~*U6O;mf{c*v6+@i29|aPDhUTx2Mu zHZKdw>+wnYkK(vbHqMyAdyhTzovwfAGh9_hAb?U?0QOz{pug`$f2%T$YJ4&&H1r0Y zT4V=Uah`|d!5dGZg?B{YF@j{vzdnyZ?I4^C$w1e&1SlpX5sJ?@P0jg+o8@sUlcq4Oj^kz^BCNe%tD(D zX(%RU4kPr2S}UGL@B2;Gx6&~cwPEJ~veDtHbZ^mz<_k21^FIqSl*gfvMAzJ^4= zNpc*WBxy(<_WnfikfZeuMV!xEMIHNp17Z3)d#wABP$Z2tJ5f;0Lezj zBvV5-qLoM@9*>sxi}1&GVGm9gn?(2nyYwWTc+M&@*fDhBu_OmJMev-}5-qNUJ!cg) zu|Lt0KwYezer9hq2nHg8&7?F5c``5KdFn@9dJzFz_%67 z>DzyBPSuZC9`>h@{tLNE$>BGG4w8V@L8Vwl80B<80i+)Y9n<&Lw5viDDW!VBVgSdP84<(FFz-39U% zv4S#)N0%eyd`pI+H5=f9+G~3UXcUSVV0jREt##i6|<>PEt7EaWsD3TWfFjrnR-za#J7|NC2${ zR76k-cspa%L{Nx;#|POGaqtZg0=0u@>7=uSuLZg1a}+}+{};hgPl>kS^t742yD9iKXG6qfA*2xz$Z zqYIbBAFilGO$I;~x)3q@&@5X@Y~5Z0f5I1!!DOi|BzQKE0TC=-h{7YC6;c{L(FfdM z%?v>|m1-E1$3HJRdIdZ0bSl_wrQdV^DXgF(iFHTLMyDNv;GaMcD%Oro^kC^qVM*A^XiwoR%_YJ|Qw^e_EM% zu*3ZEF=(#D0CA+F5o`vU0}NObk*Z5h$AeoLqtB~9a_1;V=uT*PM6(>7+P^j^?EIOQOHWw&6Id5 zPP-=ysqun)yiLJ9z7*pspE5X>t3RT(O05d{be(--c zK3$8Y5e^gBAg>0dXBkjZbDtgN9LzEBw!Q~ODf`*I1W+AthxyuL0Kf(Z>}yEhOTDDC zdbX$f0%^}gN8&@#^M;Ok`9{&Ojcx7xEbDeVRReht`Q?Zn7?vyZ+_)&I?Nj%8( zA_8H>c6R7v(yeY_@k6zTrt|)9P&eQCC8oP?;fJMPjBjq+&!1{O!x-Heovz<_&&;Or z_xQad={+a*?)S3~IKPuUGUgk$bVhFb#GXVrC^^p^JS@8(0p})gw zyouo@h}0X=>;qr2*+mnKZpT|a_r3RxisABxUbd^%8u6tpYhbRNPZ1tjY1Yki4Bmqr zHMu;b4hF&}x^Lee72Rydr-~E(H+tXG{3BfN)t6dz3q34Nh0X;J(42s2G;2I>H#tn~ zgMWvvAg~#mFAY!yeB>aVmJV=z3nPW*-!NcF&@bBa^*!*!(rYc{NZQ@xxo;tKfNg)9 z=mO$H(Wx#vvm83c(dqmax34*_EH+uM(gR=>O(b z-C4W_db?-Hz}%`!+i{)1g47p1)i1*~^Eo#0O~!(v^b;Nvo8`H=4iP#3Whhy8eq*%Z zJ}x_KC{bs;lgD!yvn}JJTKf^^7?P5B2a&HAC?(5 zcr8B7H-5#Qz!DP+N-V=gTgY;81xa72?+=0iGwWdpm$3PHIOQFVK4o34jtxIPwEItd zC?hwQL{lI*MAWnJfsoyw7^Bv}44et{`JP`PDJw5tZ^2Kn+X@eYoNN4!PyTTe5kHCb zflt5&kQn~VSqKmcGqTSEF>?|ipcfEk9^T4EO2vig#VirW_&qh_XzXy`B}>I%hAn0P zMyUWb|Fuz2%+GL66Gx@C5gm(pJ7DN8XMtbQ{#%#{`!5*GWmUOtKLkk5q0ME&-o4ff zb^UzztDI7AMW=y8e8hf1fZ--lMtFjKLZ18QgF6;Leq~1G=NF8rQ~#p^esc?%R{TLm zLe|(Do$x0Pc7R5Q}OaH{-XEvjMHD86pi^m}Es4;~xuoluHx4wI=b zSiz#I7HP~VywSHPYTpZd0Z!AiZDNnG8V}h^Ljxq><*E5I%1l@ql6~C&g`M|Q^PGpd z@)u6i#?HqRiTiLIz6U?57W7!-sW}e@9XnvtVrPnF4_clNxqAkCWJE`xFIT*)IBu3O zkZRJ{NET9gvqhKrmvND-m>0S98k4Mr-nI+u@p{xr^Mj*KxDDGEAQi*!O9`Hgi~cI} zG~;fszRg^Pagq0OY2~lueC)}i0u|TZ_R6Smr3QnDv>R6D2k;j$hm6XapO5VjC#QLq zPCgl4NM&AqYet_IXAfei-()DkW7u2Q)b{&$oVPNs?Gab|ucia8Zm0t*B-I1eR+Nk> zc|ae0QG8+M&p1EI zsl?jWKW-x0^94S%JAVF7{nV_V52~Me{8_WNVw7zA0azRCJDd!8Zp_KzJDj|1H_HXy zevX75duiv|%?a{+Iv#AV{F#!f>pG!YZ6)kG{?K6xPts&5Lw<0hwBAb&M>M+kXK5=% zeArr`4Fu1JTXy7#La~V^jNtjC2tp(fO(V=idqQmkyKv^uu1o?)k=f zsVOcI#`iy~_tSc=J;M8VPh6z2=ip$(zD-)qriya}5u@VzS)O6_3%pvq9V!w2x4MM% zC#vF6`s+$nfAolB(6{L%(?5FqLwANk0PS`AT9VaB#y!Wr*^+wtT&y6)4IOIN)6XZK zagM=r_n&wdCw>B6o#q+u;8^xumD0Y!wlf`<&+=SQKmTO>yIw>Qf3ZgMjCG@{@x>`2 zF6E^DkZe!w#<1+4yT8KTqGKP;e%V6zEcNGMNzDyx@guF~Zf{rls{eYE1@G=ZmdT6j zqlVqFu#wmUu!keT0B5V3Hh3QLwKVyzl$Aa%QMV)!m8Kmk`s0gg0@zrwDwHu$)Z-T`q1;0q56_!eYhig-sJ zc3^Tyb($k&%*o*8%$3+j0EapI9h@xXCJq=EoIAL8rtA(4Yer@+&uC?UU z%AYZR;%?71Jy#)TD!a`5i6|nq0(+Z=sqW+XWgT1-Old9x`0>i*q4LapK0c52b|ddLg0a9aYY#?ql{AR zNQ|9~lJhsSY}`9qin1|bY7pnkE=F&WD@gq|z1B@fqt|?`P48svW5`nVfm>g%=~Ge^ zUFf^eTt_7ME^&!`aQ3DBvU%fU@BG zJ3<(I1}e+OF;7APto}qz&H~daK?wD&xVOB>rxj*#KZYOou3~c!9YjuStb9V6F{5l{ zHlCqRZpXZsF1uGccTvgo{5k=2+f$pLp9A*D{QP{z(fGkBJDixzPGl!OKXLe(VDYmA zMn=;Q&rhjTn06&PVmbC}nbQT>wjs6d_s4^tIWqBmvVAcE1G&-QO-jVE@U$e5Gt5fm zwZ>1q`E`XIp2%+jqc`9pQb-w>46aDWZ%V%HB$s_h1OgM?tilf1qr$!wSYc`3%weGg zGya7wumVzuWkG1~qS@!68r+m6iD1p`&~0pIf0sM6fV@FjDX~q1Wf2b4hSq_p!j5?- zpft(a|=J8(Wk|PVq;ClfK>=->y&~OqOfAUh< zJEuHNPjx?6#`ua?sbVm_G{|Nb)E0G{NMkH@gK^K0s^y7o<}((BU^My(Ji!a<=N(6j zdPa^6rKxTGyO$@jjE|rHaec7Q{{K*)MgMl!=Yk{GM_NfLg*FO|^n2%Jqjt(eK>tr| z!w{p!OQ(I5{Ek!~42JRcsZVU5GXutzP|}*sm3d1u8C`{cDsv+ZsfD}e zA{Vb+Rhu=ts^|w0j`Wkw(ofpnwc|PBxUKGzKgIwqH2bncJL>6np+HCcvBjvD%h}+R z-!>3J&zPFw_5&|8ADM1BaIT3V{5Fh7PP9oQmfIL>`g`UKAi^fZ*@^7$;vVVu7}@#( zw1eZ3yc82G^kCetd70y{3SuRYltC8u{o*o`#nCd58(@(;;V|T|jxZVYGHrS;hjB0x z)$TEhF=*eGfyHI>{b?Xs50YPZRUidfX_g$U_}JWz8o&X@PfJ8H1jPO4Zt`bb$UOV% zBeX%S#!GAAMI?!MxS$OJ4IR%W>ywxE1;72LkJ0bVfJm-YBpBP){N`QR-TQg7*zUUvD55DpMXTx zGzudP?TNkx845CjsSP3HqAxUkPN!DbS^0@Q2}G^?tdC8C2+hH03+N-|k2K2vV!4ic z?(Q)Fa`kWKM_;|3M$isRDvu-=1h}@zs4`s8BAE4dY!ie>eK#%1diWVQRp!xO6|a1( zR5LSIrDsDVtB`SWeFJtqY_xm6t5DZh_-0ucV4)R=9~JJdOgIwGeomVb)a%6kK{ z$7?mM@ZE0av2?U9L6NZ0hOPpX>Q9e1AF+R`+CDP5d;k0y1e)C4(Lbj`V9$V_%aB;! zh1m)%!^~m;`N-d{Z>;9~5$tAtrD@v31p1KdzwmW5W> zokMg8o0ws=b6z!@^pc z+Wzw}6cfGcL?lo>IkF2^T~<{LGv;}RG?{Cm!B&aN|4nqOE+ZoSG z7RDDgjyr6359PpXx4Zk5hwJWlxx4$oo#@dgOVhEtCwJiAKnQ3aU;JJ}jd} z7#uZyRIa)BD%AjM)Nv4FR4(!n%$-7gP`0b>PqtR$_!|1Zr{;FFRDgG3x{SamxJe)> zhTtJ$gAm%)Q+)$~RbLOoARwa%4xN~1Lg=91_M};cZ#I4Q&k0~IxqnuJUUgkX7^_V4 zGHUkTJ`IaAsN14JR>w4dPa;bvGp(ZZA(@-tzA^Tn97-WN!rMx^?WQR;Q~d|04LQ|v z+RxSB)~{9Y%Psh}SLObw><#if(SCdY9Zu%2E6c^-gGb@-JjGufmK({Rb}atRQ1Ejs zc(02;4kcMIV7(HQ3(dSo!;n4+4UM@bTy<=Jghv}cX(i_#veZc5Xf|INUw=6|y+Z)x z8>Z@i^;>h%9zp4a@#0J2hqgD8QWcCB6{?|6_NT zyxlebQow9oFwhlS#jqcbwN*hXu1KZp4eY46gLKknd8Vw#4@_u0dD~`rroP?ww0k}g zk8ho5kM(x&LD`e|`v^uMk=GI4KaXl3?fo7!#bMqn`EckNwthb54p-LMK)o6zK*Ymb zW)oYSy(s>YHkkfioWIwhkoH?~1(Wz6e0cs@KK{>sVE|_=S*PEOPe=-LnaLZ$)7!UQ zXiIVfUY}Jguct^X88CTo@AfooWq|!1M5S={GY_|(Pi=sRtX8Ux^Y{Cb!}4dBf00%G zrzakve5wUzm*AmZKr9|m{@YghWk)Ul2=b5fcLe#w-@lIjd^GvKe#K$mOTLEbbr?^l zaw*up7ootl$K>YRJj72WPO?y}il-U@Ih?1q2giwnXJ+W@kX$4elfcT+j`tp7kP468 zhq$mEha*6NZmQ+sz_o$vTK{IBTtsKZYMMs3!&|dB^y-+2Lwk7nh^FNF2KLqzM zeIjufKXc6~#BsTMZ--6f?jNI+RInIX4 zTY?xIkxMA^DlIy|kAv`O2*;$E(_kx9mLZIo@a%>M^`cP{7-9ZFgrG4Ch-RO)8bkd- zbX$xw$oEhRqkf`FUgwf8$IpYSD3`?XX|2M$!98!Bm%*`ktT%GImbwVjt#-7j$J{^O z9!Q<3MxXWWQB~$K94F-{1!CiGv%Ge*7G>CesWq>u%1%a1) z0&oSCptPG41*`&QIjbL(l+&6E>Tf#%J8>Z%J!=Ki-Su@{ML6 z2b$(VSOn-_f54~h_FPwl^$1xZviqkC{yn68G+$BhX9E62{67H<$+*s z0^Fmr!tRNhXUrzmr|kYpdvh-FGY^L^YLs>?{7+y%%vaDSQU7C=KlU)?KTZ654~O5q z{KMh@nD}9ZZ|Uo`N7L6!2|q9a{_3N__a*$N=(bLOC_5VbHW&c&r3CnEy1_fXt@NbA zUKOXW>EjgbX4Q z*l>>v7n-*faSUMQdAOCF9>wEn-RPaC=$$VE5`!BmP?AXRY|sNhmZGVjXpx1#+Kt}! zAme-xDe{4Hh&v2-kD-k`OT*4oZ@pvxL~57?mW;F0DU zsV3))@x>6>a3{{I6~3xPLtR)^#+;l6GYgYNTw?7SZxhNJWS56j4u>o6igcd}^U_BP=239cX_gEP; zUmZhdlz~L(uv*`9Lb5sQ4P4JuxluDNG)IgEpz~_*gbX{su(f4%5aw`|yPeStyp8akV#Gc&euc`1{;XF+Rla^p>Y7Gx!}B&4=5PW1XE11#G3R_s|Qnkv2*df)^5IZER3oJ_`cB8 z#5#~)>wwjWKR#!}?ee?eVmmQumU>}T3F}{2R*;Rdj=>E_`~Ql#gTH5%0T!WV%pV$S zxe5jN?!a>tu)0>sJj+2rWnK2v!Uy#r5RlnuHEM;wv=p$w!rH!x7v|y*@B@7lay&|?0BUaK;uj=v-O~Y3{SB$c z$tZ3`3}%7QDJpaCr!Fa}?2UcMP)H2T(h1`B)uLCDKrdb!Me;))KroI)lH=EZx!?T% z7$5n=<-(60AF1VX!2cmcGOPAKijQ0ZRXsv{ z|Ewhbmwc!EFGFeHF8?z}C(6I}JLP{LO8a*C|HG(6{vZ2J`M=~_=l{cziTwZOJLP{q zr1kB}|Ewhb|NNcuzYL{)yZq0*G*SM~eW(2ILuubG|9>b<%UX}m!Y(8m;afUB+9?#JLP{LO8a*C|HH+J{BQkE`M=~_=l{bI ziTt;Ir~J={w7y;WpOwVF`JM8=45fX${Lj27QT`p@DgXOW+7b80aI{~ zGztSAGSJ7(z*&S|k_7#jg5G&va^>DZ8W>_S72szBJk(+0{kd|LGd$3>Hol%Kz2Aw=~aoZONm8U=00+W%Z0iIGso5Mo@Agt5rMs3t~2J-VI*#y9ziHIF(NR}sSz8S1fx7%vOPytu5Ue11874&6<&T>P4MJ-&G1bwoC&LVU|Ew>U{Pl7H~(7Vn7 zbV4nkBlPqnXiMHN02)p55J0RB-H_N`O2s>#pvo6{%>hED)N8BwMeoKH_9hmbz-E92 z@47%l5Xbmuoiy~wZfveW8RiQXwADvx1do455c(1!L02CpLZmx_zf%z2J{t%L-C-FK zuIi3(#Xdp!GZ7Nnu$Blp-4U+cD+u$6AgL#9^_xwE4vv-BUhJyFPred_u|)8=+g&5V zn(hd9eJKdpL^$4!a1Igf>yBXT5rhx0scOZEZiEaX%;=8ri`|0oJQ3vJon42vUjkuh zcZ9!uAqd>SwL&rr+XyX0IBHJl-8) z%jbg7o(qK2-3SH|ZtRZm;b(%dnh1m32$Qz~;gaqMUw$eGQ6l8H5sHY=t2;uPLb!$q zgWU+165&mZA4#flLYtIu9udxRBjgj|sqP3lp9sSK!9Yl`#0MV(!aNJX?x2xofqn(h z=;sgoBHqupQOc?D0#!d>ijyJSsAdjTWQN;h?!v%~VXUTGp^I7QA-VVjJ@Foe7MRO~Olg5l=1*HlR>sfFZUz7KHz-*A5yQdw>ZLfwwlh%_ zH<`t~&1W75Mrl$R?>iWOCI*+b;}~}nBPR)ClY?oybMvxc@R?J6? zRY@4nIv6JqBcYx5QshPw#xEU=)*N6+wpqJ}{+k$ACt>Ig#^1VOJWY&qk}&2w7+EgkF&Zy`e=o zIf2j#GMPbWBMJIW1^vP4$*nVv&@+;tKYLARFD0}y24H~rQ!St`NP=FoT%eb9qy5E0 zfKE+<{;8tq?i`ger>LlShcf<815v=e;uI|)5M3Hs4D zgmw#|6C~&(bSMe>@mB@B6m&&5+8Z7O^k*2&-L-u8-$HwAH|W<1 zy(S6zeg*CA#>rm@{Xi0QKtX?UT5>I`2wk28z2_C-4Z)gKc6P_ z-AT|h6!ex;lWA8I`idmzc4cG#Oz4D>b_StylA!B13MUH)ouGpSgx-VU+Fi@YQh^Q= zI$<)BP3Uz=(9BnfG3^XOCrI#%2LSzO67-K0?T%9bozRvW2z^r$^i2x7fzS!HT+6l` znFQUY+VY`p&~r(&b*TlWV*{Oql2`quDD+!qA%I7*S#* zi1=6c1EZH>HD1Qqa9GiN*AY6w;FOd8R*c~gLmYbfI)Tn7bb=xk68h;R=u=k;bXqs) zlL&oR67)6y66iNi2JM6i=N|GsDGB;-YX$mGgiesln}qfyL6^KG(06o$exA^~F^0Qq z*+a=>0-+OX`2eBUCP7yy=+g2}3$A@n0j&=)rfC+#OC(=O2gePa?dj|`!8>Iv;} z(;h_HmnK1ve@UPpBy^S=x@!rbGn1gNX%Og{gm&gP(AU?g((hpmcgy5jH85R5=!C9V zXaM@TBVnf=ssqeHf#?7}^Clrv>a#n*+jV3@I>72|ASU$F zH)~MvB}o|b9gKU4k)YDGQDF2`tj5duYPGO>Euj;v^hbn#3xhnw5QpBkRG^0wI$;E; zBlKUApl?#Ndl1^GG$fKs-tSC;?x&#N7?8}#Y|@^X1pVwP;pC5mPLNA6p$8>F5Bi%x z-%jWRPEIHE7Z|qPwfsUU(s)8Abbx2jl4fHPblM7`J&@1|YPW>Y4<|v-{Fgv~equ5w zzrGjHKT3i=S#eTF=!CK8ZbBC(K|lVY(EeXSC-A+MO4=_8dZdEBp&RYN$uEPJ$l% z521ZmH|R$R{S_=SsvqZM-E#sxiO>m_;wOY|PJ;fC;>1VjzHVXNLv?#R3HqkL3+>$= zKqpv=YY9C&37YpoWAIx`=!7AsiH$ru3A+E^1o{y`qaj|wh-Wp#Q*1~_0YgY)6U}~} zBjSDx*&*crup424DzKCVIxPoigV3)eK@U~XXAwGKZ2lpkpL9bbcSyA7OMk^-;C;tY z+L0=X3TdVd1{a_x(@kguoGAvpLQMXQ2XPJ#j^dJ zN!Xae-Z@js6QfK~$P5agbZc4IC@u-x31dCgPlFpUxNp9d-*Yg~^{~_;(&h~nzEkTU+nXrIJfFg*x$Vz)x;n2+3NcxUr|HlNJmJxyHVTM zqSdrijE#KUJJQv|Q;i^R%A(tAx+-qaqN5+K;(qDaEHt;;x6cFF&FToytvsM2<{P&`Y9o+F@Nb_`;#kVO419lpFcYKA-oDk?@UGR zu?O(VU-eDcvv^(mxg&#$*R0x{a0i$iX();M>BK2@QAO7BMpJ)-1 zkud*MV^6sb82RbTw}a2gJrCjEU{5e}KXmb+8%f7TLTU6mwnaw47o%*b{l$}>JKRJVZMI@@7s1E z-wm3czt{5jX8ApxzhB_*2Kjv%e?P_F|CHZD`1>LL{+;|jk-w|?`+w#4A$V101%Lkx z{i87rXJ)qGkyhS_8ee0}wf_B#K8-j_5gpxtm#9|xcJuH3XzG!V0-1oenm@oVyndGC z&H}j@hA%$Y27$q?hMo5C=`Rks`?D(VPn2nN^o>$1n-gt^ebB^MFk0A2Z3oOrw( zCA8fqa#VOfkhVA+pRrODh<>2p?m(46e?C8?T5)xecFV7eW}ay7BzM<>)vnjQ3hzfp#oN>ecwq}KRE~=# zN9=}2f%2}whZF`qFrNmPW1m;`fPTl89<=pW;r(6V<+}0a0P?7%uNbrT>NI5X~QNjOsLhgkNiXsJJ=AE5A3XzY+IBwms~WlFMoh*}lsOz_hCIdl^6NslCEUCk)QSsd20iz6 z^+-u6!U5M=Y4~^Ytn|pb9usRmsAvSv*Y~g!^3tg#u)=2pg?aWoOEYuZo|1D^(b0t< zYd!&nVt+aim#fm7EW84dEi7M|Pur9o!;Y<@_zHv^v=x7f-gDpv^nU(d)B6eOnfu9} zq6aDyK+OE0CtkG63lN2TME`oTfavIVFha-M{ali$5j73kaGL=DxEI`TJqR}=5$;I^ zcdr|68znX(5$<{gcY_=5pM>jg!=bcccxw(N-5}tps5YG>$<9Y9d z=WF=<13qv6I^J%o{!X3JTZ3xzkU{qI(Ee*WLlnL|2lojB;OM%I6UYxJ$F`S?pbrXCM@cMWGi zW_lVPUWbQj0R6<)m;4Q}A^XJGDE$$y993EfT9$K;gqOxp>lW>sdGr&xmx|#tXW^p& zPBr}KI=WIwH6NhdJi(6qy8P|tCNu%A+`_*wEPX7yl#0$5&P~Ta$lZJum=H0wdyAmyG8xHALy*$Br{Q#b2SN|;-uOp(IjmL3p6JS&2T2o>Yb>oM8MFk|F8 zo>v^HyFJxSQVJW2TSm!MPKz;TIO}vLv$4xp+j}t)s)m!#pQ_myYLEVlX{@mNB79hq!L-Vo@IKlzv=leu*!mB( z8S(U8z|&vT^q0+5kUD0-L-6z|dAh@VS{_v%rx`t88sBI zpfS!r#<*y4AX?Httk*?$c_MWl{R?Bjqmfom{m!iXFY-6l@ABkt0ze2IRsQPO zB`I;cX~B((%Q~1CsFg+Mtgfy>$d1QM_+`jlbal_Ecpux@ zb*QU0Fgbs(9&p)D^el%@FHNPy5ZMz^gz~h!OMZNpy$VhPD)nKjWK` zcys6u^=6a(#>+Q3c=M_CW*OeBq|ylD28_|PGFDy^K4<^5v#{1zoW@ElB`)$Mz?zm( zU{;m{SG*yoN#YWb%Tg;}jmtZJUSg4zbm2Gwa^B128c7Y1-v=dN-Xw_#zCwNDhxj>1 zl9i7ZWZov3rs|-_-7{TE_DofNWp6tVf?dA88^uINe0@8G z$6N^1r(_mpLBB)#8=~OMD2imw%r=VLfEnghhYm3-NU=&y0S3^SkUsfZ>s$R?55F;O z7VN)e){_NC~$^wUct}-fz%}UG`X84&}jLT9r!po7$m8 zI#X{O9&cB$+aV#W^~k3oZ7Wt87rJD!#c>sYR?}25SZ_g-(|${>WE5g>3by#eh}nlE z--RqON?uX6@)YPFr1J25yD2V#Wl3%d%iln#2CblPWIbPzc45L6T8pcIg!VXt1^{A~ zTH8L4l%v~GHN6l*aHZJJEwT*WE;%@q%LvAenCp$;c|GqB$4s)RKsD6i@b6onCpWG?*$}aEDe3`043t7#=S=DM^IX7B%BvS zD5#R2#eYLF(2sLnTE!O&GCkG(faLi(OdU|mdQQYJF71gq9GFykjdXSw)O#Y&5(XxD zy}oV8M!jXvV-3sOn5XF&4G{{mk+eh`5V~-zo+v}UfR;iA`Z8T@R7Cx`r& z7w2!t-)xq^g21Ftk4@Wm2z9R_z|r7+HvD{a+W!E)17Je`M_=p(L)~ zcAD03`K=knHJ>e<7B()?L=p41x1DAc>VoH39x8md;)0Md>OJJ8(hApAwlPf>{9f1^ z^Bok26@{${;)Gq8E}hU${^&@~NxP2hJvDU;^YXVR_y?Gyz=mOVanV*5ZQi^0P*>rM zj71-7<;9t}Q70{witB+bD~fW|5Y@G4VV)%5xu>fO?XmDQxvdUAy71$;{5pQiO7T2d zSKrzrG2dCFYmw(ZELo%|OwWB-gyeT1E;>)|tnbW>tZ!Y?OYe+)e0hCmugGgvk=D!o zOBVKstgl)!HdV@jCB*ch6aRg!?+*~F_44|!GZ8=u;9F$p<@Nhd2==M-EZxkQ%6bW` z7};A^rKI#}LAvL3lo%gBBOfo4D*2aOhG+g1cfsrHP;ly!UQ$!5e|eVn#zI7O-5uq6 zePm~A)z@_u*YI0M)z_^RKjgR0s;@gL{gKw*YdFn`e4bi(Xl}li`j+aSo~7e?K~Adv zYUHCjf7PL?%Ix~qUf>xiQVaK2wt|T&pruH2LUfVVL2}u2+fs!OFL@2SblV@*Z+$HSgb4vXB|t|%lr)^*k@i%*b5m!Z zPQAIlt4E(^Hc2{uHPr7%U{P$k7`#uF1{hsnmfug%?E9C0u(jJ+n#@(6(oUg{mvdp z+}lIycldh5Zc%noF~9c<7!~2l;y-Sm zm`QI5>6=4C8Um4B85Nmf9kU(I4O=R*)OURNF~4l7>bGUL zT|e5ZFX3OPsk2YS-p|Cl=%}1$;{qO%5efaFFqwB-7 zXtMu69~^x@nmn#ossVZIiOYlS`!$tae_2{K@@XC{QZTidCTR@2_=V6{L|ZmR$E2#e z%uXB=4X37B^3>72)fHx8{i=?z{{2owP}slorqjo&WdiPjyru#nnE}?7Wu4SK%Su_j z9A2dmuiu$&u7FH}`aET;!o~pH!*~tDglVy#NFPs#_o%#Gv25Td|8U9*4c#uFf5mh5 zm^yTnOgmR>((6Yps8N;oYT4W#C8paBeXX*XZQ#$N{Srld`wr6AEzS|Bg1 z!^V{1ic*?ZbPi>IjIp3R)ypp0D{YKVAL}#53`eV8VQrV-qBH!fQgt^v)*tn)`Ziby z?p=`k0gJ(1W2%Ae3;qoAjL+!p3}5s%D=A%CuJVBOx5qccW1vf?p1ICP zY3+ox0$@7``NNI!HmAYGr?g>!Met2UYz|&6B_fBYz1WrEVaj$$*@yVkeUz_~tz{Mv>RJ-5+UAH7nU*dQ2Ie}Y`rwk`~Zr^*3={0BR6zNTN4Yn}?xS;;LfV)A^z)gym?o`yRN=b~fi_c@DjH9iiOqA>pZA%L_u{^X!!1|W>_T*mJ;CYjwa`b}1|+dZ0aF6{o6yY3(i_a3 z9e`GbM~mK$)?8~2!=n{tfVVYp6=Ce|L4TO$<;Y#c{8by^!Jzq244N76+_EmL&x3Al zZ7!l2#8joc1R3Uw{4VWCw4b;X!?u!Np~t=*oq!-bJtg$`TT0O9&J~tu6V!DVT&gKB zgRlf@*(Rka-7CYrWe*bl$tn4p#T2L@2`mD-F)adxWWL7kY;ey}iZKCqVf4fo)m>o6 zc-4b0-3ESINGnHUH@H%iMn`o-K1!_^gv%lTi(OWQ`zr=pgOc0-)W;)U-vCnMvp8XJ z-~Yvy>m#=jIbKCzGFFDAz4Sdbdn-%O30CBREeU@Q0>867x4g{G?n~(GbLv~0Q+mbO z7q-zcaYw}#zmI~k?W6vMG&Pns%uS!uJgsee!tD<^@gQjz?BD`3UzO@F)1qlL4Hc7I zOCr(Ryyk(A4|U14eRq4KC0&KD&l?og4#6LcroW~Qc@_O9gIn74OvKU5jKbIFVwEg+ zhixyAPjodp2mZK9gKa$FoR7>6)N1bO(V~@Jr!?~clqAp1bIe0sZU3Xj+o}2{dWhED zDh!2T9d9gpD(-Mw4uRnBAgcLkC}(Y`aIL5MMLY-^vweYRaaUo(-FZPhhPx`f7$=8p z!ibX=y%M{GDtc#Vso3B!;7tz9<~VXxUYd*P6k^sbn>vGq=G|wx$QQ1yxGFN+hneD9 zw6qylc8q6_i7CSn0wml*;TiKNnG!<~65a)(;7Di{pb;_^Py=8XnWkOB2yzhL2g79EN2Di_w8km3JOk=sO*faW7!J~?I|@Z$)iWeL*KDVC zGDug@DgU0=T-d{OB2OfsC?4#+gL*g9m ze}=-?F-xqD*_^_KYTQlB>T*c7tchOcZ3=pQ*qOS$q9?X*REF_oX0)g)6fMD}JQXQ9 z%h&yC;60Wp@vQF4@I(Iko9Z4+O-bbyf}aL-|3J~SxPDI$_pz=*hGq95#jVV-f|&3P zL|2h(U2C>i{!$3H)w$aX?R!9jX0qGJRa3wGkTSznQ%aY2!0Jtp{Sj2ud`I2)Zmpza zWI#8CA`YPQShK-XeHQ$NkiM^2UmK3z;?v(O&flBA-Cdq;1|m(V!PE~ChP|t2ig^th zIJGfYSdp7m`F^+@u|ZIzi3&w0<(R|R{LCJNszA2>5=0>>RnJLPRrqKsreupD*+28A z7A;2IIi1Bn8Tt%dQaGk5IKqeij=Lx={*C$GQ2C*7YI|_VUh_TBr)zqm)EEn5@9si@ zk7QeJJ-n3b@PY2d- z{ zO`V91$8U-A)F1|zvXXrk!S&MX@PTDzTrL%R7+uh+M6F!sIu9H7IlrsD!v;~TU`&pz)k>=)db;kGZdYeV=jlSk(LPRA15~kH-;oNNKn7g z3q8y8VLy5+Y%z7EVj7jvRuhqwiwW1)W9pAfcUW)L1Gc>O zGRBvNvpEYmcl2|%twI0NE&W4(;ZkFDZY>Bmr{}6O3Fu*3G>BCjpx~a6UR>~E4IPU9#D~T%@IjMRjl|fvtCEJ&2Di;r_J;g({b>nqY6DZArA4ShBdZWZ z6?WQHm}pl)OT)aH^c-b-8$4ot%?O#L;r>>76z zFpKN6k(c&GM~sE}lHt(Wp>!TckR!xD!7Boi^on+vzgKW@z%kjxWDL?VuXvYEjzmY- z5*F$6te?6{`( zI7BZWJz0O99soLR;>I}RHt!I)@^_u?GoJ@d4wbk_2$FRy@)aPAz|Y5e6SXDw1mwr~ zE4OU>)Dk+{sTTm6g1Nm@aKT0|vy2LzNCoFrR0N^Xyc9xk{N2DbM9%H26Yu%705f7- zoj6KNOIUv?HxCa&dY7@#TZ8>2xEV5~7^`s6^po}11BG>-pB;oQ1PdEHkv;f=xzk(0 z=zO@AFg)<#W_jjpY}KL<R{Y<=nER(F)+-2G?iI{p zbiQ*!xER|P)H_&tw|!swJy|{qzTiV_8}a%foq@uwb8iGBLMlESOBk9iCNLBoC$`Yr zmhB$T)2{iej|i6pqUmSAXS%t!FHrDVrF7XW zOqnyQ83k-5ro}$I$^(=&LC1WLe$=CQP_+=gTMf>|qWLuJ9)r>Vu@HH^9 z7TGmY?z%3Tc>+|^8!~GBXxxClgpU~^ptp+qxBrcw2s5PT2D)lH_!Sl;jKvEmdvmC~ zmSjVE6-gq19MG%y0O8EHpm4Ywq}F+e;L=--wHRX)+Rw3*JZHoE*BdI_@vDUW9kD}O zsr~NuSF5;%s+(~peT?JF3xojEmm&}hn{)VGxt@sVE3uK%V!4hLJD~9=IIkwPe zzS)UZ=T`H#5yL@*gVl%n=`{q>jDdY4BXLOTIlMGZ43!UfD4e>hYnNrO=RpnI&8JWk zEmAyZxFI;a5V{JuK%O`U5kl?MTd>Xv~o4H z7Jmm9;l$XOS+x`OZ$kASriasJ`*6rGC0w|-0=Le$n;(D@PaX36R(uB=bRhzT&2wMT z8x(no_@h3kOkc1vWln50h6$@aQ3*hrqsWm_JcrYNn2i>|70ea0 zT?-L~O`e)xp$}q7^&(-M@%d=5hvs7bZj7NykF3@`_$I1cj?e~cT0Y?-$T|y~-v;0& zp7fu&5QBo~Pk|z!t~GlX4zb$7C>=f_8vIF$#VXKnhbeabJ_y2KxnR+|VPm#8JaV>g z-YMvMR00K>VYUK6z0M|hvSiVwjZt@#_K=Wm`7yKkEv7cd8- zoVNE6@3Ue>^YE$-@jomtnJ0rzTZ5u&+=gs`h$WTcJ%onzpNv?wn?;0wQo+w>Sys6d zlt9@in0sZIFK#9tuB=jcnlaqWP^9cfW+!ZDtOTZm^F-UvT@<(9mFGG0A$v1lOU2p# zy-mF;y^)W4SMIKkfYhAmFYT>VW=Z438Roa`>-YfON0Hfe>M zD&qSvt&6D^0%~{Eyl?sPpaG++25yPOk{uG$`Qt-frVELtZc$Xe8v@sGjFVX zkrv;+kI%dV(t=7nRLAB4J5{ug_9ymfjYAZ8*jVp^+)CbcHqOUiz6B>$4)81;n^!O{ z517t+T|U0M{SPa!%JRx@@nJ*MWr)^u`C@xpf3feFq+s7M{2#2S(Hr5(zj3e2R>b$o zP<$oQ>d$y2DykH>k?sKJM>4MIT(aP5#hZ@sFv&Ez-x3SMI5zC5=As=R)wiCY4KZcE zC1yqSpA6FSTVPkJU?6HaPpbc#1k08k1r0^>HjkEy6 z`UvkgDZ~ySvIU+~Pk`7V--y^GIBWqtBUyag9d8ZD63r328HS2VpJn(5ih%iW8XjU* zBz6Tpc|IqG!?XA@2ZG%FU$YN9b%Nd2$4_}4Xn+-~z|;mr5hK)$MHrNKn%7`l!bCgI zb$w^z%tfNaPXE#1euBr0wyow*Ti{Py{+e2cQ(%2WLLyo@j(E)jZ$cNCT#){*4-*^;B3a}L@Tl7FKAg}WwzAST-4*Qn)%R|sKpNgi^ z+*L0LqQpLCfM{zRI5_siTaeKu7deTVwZ%urxW8yd!KBgbKSV&g01^O#SxD zq%&;Xm|+gXs8n4?>RFXo@IX8W`QFJ$2tnWCkl)sy9Em^Mw%BSfTVU~1b|)H6EZ;^kTBAlQb1S>l)$a{`nM!&2LC z%zwPf_T&B|M7pp;0`B_*9|A$>cu0X-wWvGh&5SlHU%-d=?PRcGRWwFX+$OT{`A2qk5;kYLC z=T|Vk&c+Yo$pLlR$Jo_);#$wMOXC{VUUUU1i@6oL%xV92Pw^e&=lW*X2lK^>ez8Y@ zAMdXj=35&PvsJ@gU|L9jD>0~xw!+nmx0Yc<@`a5#ooE1Ae8lpx(^8h{&cS+M>I z0y&o=*%yK)IPYeouPb+{1%%Tj8(z4js_Izfd@gvl2#H}cjaT`XEe}HblN)=0` z)Lkn2j(CEeXm+R=wKza!0z--wc{?2Csdowp(bh7rlc8APDd*^l%a2a?Vqve~rhRZi4=Xlqu+1!r}a_igzX` z0(MyV%r`(#)m5nq*rZZLvp*=JOrRy^0~k^)eVNF1c@s><8sePwP@EZ3;)JqT2ZS`M zHf)T8p_o&GvyCq6<9szr%D7VsdyFuuGtxH5U) zyx8O?{@DK3d?I9M*uR2qrH}8_^l@b{+zIg}HQpdlZtT^)|8vp>YB%C-@|v$@xAGGdX9(jJD$@H zjEB^L=5Zwi#j}D&oG-IOSlC?x1IBo5*f>Wsrj@L|UOHCKuW_;*>*QQz%76#nn%@=Z zdV@Qd*eJ~;1qEo-nybo`#zWj6BPWA424=aU}VK1Adq!^s+d zVNYOTg9fKi(@SqhYa!TzbA#*YzK1ZjAUjvuxH;&=bC?gQmsU9L_PIXIc$9H!%~(wN zYx=8Uy&0%^U9Fb?!U?Au9AU__%)3~1gsb7Pz-JVHz3oL;{p{WW)%~@S!1jtkuJ_zN zY)nU8+s&QpKnmMD5YKv8@vw@jn7_B{Vc{kEFAl4Wqv$n!VLrz;LA7LPYM;)C%8b~H z&=?o}Qth5*g|=s<8g@rqe>rd`qfuym&{In@3damzcm}pj$cEi92rs5%KR$K^aw0UH z0VO|n6j}9W!xS!SMfo_qYfR0cO$7&IxN8gAQCETG5Ny#|4p#AZa1l+2iuLsJ96vTA zcA7nYFK)&AwwIFaCwCJ_2$NU)Y6?E023D(>C~Z2G;UMHDLj{oo%$G& zV+&x;9Q_X)<Wbh<(`E;cyK8d*dNWBhxC63CgXhLx%l=5XWk7;ArQdB<~wL& zhPj~5YQ^Y0Ol@M*r7Cjdb4Kh*)LqGaIYzrK&VR}mv-4s`r9a9qn*KsF`!|@c!beKv z?|jPRLdqUF4l@cy6aaF?B8V&tdASyHxokJ(qPlqx`LC)LY_5tLb#8ruf`^6&e{Q2$`Gb3r+OnJT=Cj&&tv#Y#NK`ettN&MheH~(5 zK~L~2Pw_ggWNL+5Di(N__SM%_eLbVHH3m6z9*7gop8I}_?@|Au3DLW<4>5KyqH!amw_E&6$tt*Vu3z7NW=N#Iyt7n_9daaQ$p7DNFd zh5`c2xaiyKWio~LTD{9toeM>n$Tl36J5m3481BPz$QOUyEBXpLFgCG;a+*R|^Qhj5 z$5@?3=YowuLpLi`yb5hW3wU>kQQ7jAz)L8+OT(F1{vlCEbigLf=*t~b``*%O_Eikw z3PgW;NXQ{EbbUadh~9UqXXzBod*G#ZMLzjK)&5h0o^h=%W^k^2G8;0ex4IhA5hZPt zF%%&u%mw7UQ@i;WXhSH95SEUlH0{jWGVLX3gHyr6rpmu+26kNS!1K1>s(9jRa?gGk zhQmJ=>Jvi_sjdJZAlC)>$L?>%db7;8X_*kvQuc^$FpRDEXl5CUOR%^%C0X1??2n== zhS3Xa+W*EXIE0Gx4_JSrD~C}4i;HNTcJn26c$Gxs3)D+SuSWB1mH?^5H@;gTQh!Rw zsRuVwv~xzA$IifE4-^~CABzd8yk6N!mrva1ZS$6u0%z(rzW(1EW!UD$Y z70PKq7*3>$WL*s*y~*H`kLSKKAuNO|mApd6*t}wE^Cq{41?GdsSXVJv+-Q%Md@n}8}UYk{4m!S>W=UG;#8J9p2Li^sBShLnsv#me6 zOWbI}Q3~yAnOM{6slEp@2Q05d4k7916l6B`+jF@>HJ+E#-nmKoUt8=WoW8Jd9{O z#uN#mV>=rM6`%PTEg&o-0+)P&O~ROJv``mtco~9 z(UJ?HjFL`JP0tPK0~%vhXh7F^WXSqQK}a8Wqb4We4@dhTqCGaf^xW0#vsT3*`(B3JEW6qwF;UjMWe0jcep!`sFdH)OIuLR$RpOwt*V0uKur-^fpE=-mQnCfCN(V8 zE14qCm$3lxVbs~Sf?Zml^)(nydU@{StSZbM@bGm)^a)>=Hf=k{Wfd^-M3sU~zVUkS z3t0vU7S2N|$6o>$6{$q`U&mfj+~u#{TLFimG7F(bKZlIyMNK>&;ERoe{YqGrb+=#>yMLy% z#sN{jF!y4+=O<(pqsHjqdvKtlGikZHa+{s@kByXMkSQ^)hrmw6&a*xTTc4*{pC?+M z{jARj!X1Ra)B2pJKD9MGg?2a{TF!Y|ZR}BHk75tvC-DvI6LE3*{fzbbd+YO;*5{Gn z8E+w-J=Q1l5%Tx@*5`KX^L6XXaambPxU|hp#&V!I?t*+q9wGozr}z~zgf;Uv0#0jxk@?+ zaIuDQJ*>IdT5~ZVl|hJme{lUg)ja4BLSmmpQB^-9qT+yo@KfxZ1p63@uHh&wu@n-= zgm6U8`5?23Mv$({#KGs8do4EL((^cqoUks=o2dWVgs{3w;LUZjjUgx8?5TbNDKM!} zh;PHs@y1*#)d~xG43$zIV(cI2S+&ySTtthObQ7v`UED*th}@>pe(t| zD7n6B#tDe$a9~0Elwgv81GKt2T-yhx-Wx95Hg7vl4%IwEzKkMGbYd)83~zmg#>4I! zDxCt?9b-zFrq9K0Q5eU`p>JX{k!;iQBOJenEjjo?k*)cvH9BGuIW4vp7Dd%3s&%pk zWPfDa7>k07Y1h|d@sI5|^S0Bgi{*hCjF)g#R9{$WHE5NVc4em)*`Mn9`SxBk`pX97 zTBA3%Tg4_|C_IW+sp!EKj5`^i7XUrXw}1W^=xNvx#_~N&;b!%Jb}NRY=ns`yhC{E$ zL+K#>AHX}?OB>SQSvsZ%An6Uj^^e<+*nvID-W7eNK1W)g7phP8R9rrQ0c1`G{QzwL zKzG9LUe!Snw9D1IG*4ju!{;CgU8rZaZD4QKnc280)frEjcgqP)aIMbhNPr zIuo7LNnS;7Fn?R&sOqFnDCPfa@BQPeJnQ@ao0F6x!8B^7nKHdgLrK~+9@>;*r8OZT zBoH7%K-xl+LvjLX^UItQekfHO5n({fHtd+(Mjb=j z+n1s{UtwX`^kh{*IYfiLOd{YtfsvW`JIh7^`2?sRehEwoA%GBmZ40^ zvhts-*gxa+o>j1H;yVNn&_R5sVNZUkaDS7}B7CFfrZ-Hvw2|a(D{kC-&!v;h<6M8J z$*~Nr{s0Y{%75Ir=LvPAXX%CH#yC^?z>bdd(3&6XHw>dQoaz)(x%84|y&88k?nL5` z<>jSkh@~BY%4;f@15$YnQ)>N7r`1iF{#oPcbdzW~{O}^3sW;#gdM zZW_8zk90FEvqL+2yU~|FA0F2&6My;+V&O2WFTGWw2m67IfvK?0!(q*7mwxSXMz~H7 zNnJi#@!cD+m8{OK0b9BBU5R7tVdqHXk{m|0$q2^I#^`GM&`FF7nqDtc)Lc+k)oT$SGi!nd?f+YRq5iks}4nOPO=sbg+)M z%{Z1RyC~IK2pUKFbZS(#^Kk6RTA5lk%Wz%>6?`ju(c!67UqankvrNm z8jY9d8uu<|Ji|AVIG(Iu3B9XV(v}IHe3_ae5Jjdn?XULPX8*dacO4M;jOUv#jbZ$H zX0d^nK6Yc1!Al=EeRM-UW%H4dLr_DDiRl5C&gIja#CsQB;jMZ5vCGzEQ%|Z7Jsg3|5|$g+WFQ;K#$@Zmg6FfyGT0-X+5&kI;>++JjFBW zDc+6sHto4^sh8SK=UYnq=9f5nFuIKD!HC#_QMcghXyhX0)yP>lie5&QyusS9$4>q% z7;&~hF(Xb6UdjT1*wfaze`>xCq~l1P2Vi~7yGFmP)7$g}e}opByvIoApc(40S#IAh z+&ffy1c73#7(07}H@!jLb@`s87iA4pmGYS=-ZXS8r)P*eI_ zE5V%5AARP(Nx_mU^%Co4?aRH7iLDvK|Jp4gkxY*!;npn5kX_zZbS&!wmiLBPJ})IG zX3K1r<|ao&63WTJtylAu#^K)9{qeUZ&_y2Bdvk0g5pw{zIW)uwRjB(9nRfuVd zDWuW$qtX#0mYDiNBTa+`g`t>s${+u^$b>UpDgSmeYjB+iG%EO`x2KD777jg`~`x|l+bMN5V(W4ZUEV?dYwRc!f{L6sQd^?EKFMIeZi*D%h zw~O-U(SvQ4KCQ8x_2~bVCk8Wvo=tnT(Y+|5@7!rRQV8^II(Xc>k}r1EF1S=f{)7IT ztqwkP`KNMJq1ztB;H|+rKBB1S0_d$qU-$cDjpZa=7Bf4eY+T@YN56n6NLn+oK-B$P z?cK!Erj2&INaL0@DB-(NB#5gP|6srC9(*b4(z{>{^r>0nyp+|ZWb^@vO`$aDhKUtf zMberQiHv^h_f$i+JVp<5%d(^-{jHrcnv$Pv&G7lPOYdRP!_Chi=}1C9%a$IGa9%=U z$!>8mo%&iTf)6WkRR2nz?hj|bkH9B_{)TPuqENgh4zLh!Iq^8f@o#zW`u2w^8g6F~ zR+i>us5#|_qko5!k%q^3UZ#z}R6ur)WbUbP z|KT??=7&0lY-oR(@ycGla-$pV)Y=aD02H&d&5JlPVqSzzZw<96ALnQVPy@06Wa@{@n7A3)f7Woq&Vx<;|{%8kiy&;9<+ zE7K9M^O>pt@O3j@bNO$7xj{cIYDT*G|12+om~|o@9Fw2)q@v-L{2%Y-3rCF1_DqK> zyuZpp7p=ecmwC4&|1uv|Gv%8VpZ5!fOC;)5!hI9&E_yNsnzn;yIBqN0us zH4B{8*;9P^*#pMMU?Z}y`)7JU;*z!}+PZ1pdy3Cf<8to8)TQ;ouH>-Be@e^Q`*Dqy z9%#J|-12KkZLt=g`y8r!K!;i%DR;Yi6?`wrw$J|gn4AY^*MIK%rWu>^4dxqsIj7zHsRX|A)v(u?8J5LgU)#IYXZBb!+Dgy1XP8}@k&r&> ziPQc{q{u7l4egg!InBQ2dYFb=W?mL~oX39?vKkozOHuC`rfITIE@R6XdKehpO#js6 zGWT4%x*Kn)8vf|_x82CM3-`A~Us%Fp2 zoIkKB$+0B%WcU2j=!H+|Yf^V{Vn(!VY{$#6f0WM5f@el&z$5je-~Ba>^_iPKE-wa| z@0_Z=QrT*nh ze`O1L&v(g$c_G~8#b)F!nvuab84I?1@uqykc?)-GduKc&f5PaNDmk>u6yonCM>VaN zUiw64`P%gL0}N7#In)0wa>d(Kyp@_R$Z%qk3a^PYYvWTEj*d$5SVM-+te32rJ1n23 z{DGWy+JEXWTebNM`3;O0~ z-B|$&`}}Ap4D#24Dy2F&9VYvRoDNHAr(;fs6}vXMWKVH$^n>%VtI--1C-xIZEJQ1xCE_1aL66EB#bEi~RuQzH-c zhqQA0mnHuAEtqtA>?c(>TBvIMt@fwilyANLwYpLMkk6if;tl6_h+=82c**I;rjK5z zzUkw9=i+Zi=Mri@U=col?Aq_kyu@``M-Y3Oo5Sy8eN4_m2JO9J&zJT2CpW$Q-?g=1 zeb3VPUi-aP0c%`?xw@YGx$@oA| zS8psC@9-1Jfv(<-mENMQ{qgpsKc{StAL}ICpEG;*oJw!Qwq)E}7VGy=x~$x5>PjTN zSVu=~-$1;zthGFJU%^vyQ&%EW{D$tn_D4~)rzhT<6cs{A55%?v$veHhZ1p1Mx(ntFPA){mrp~uGog|xZfM=A;&IL^shvon~=P!`h}M?dITq3?A`z3Ts%o>-3% zV#&UNHL>nNCAfss(YrcxO5L)F#*z-PMG~KA5uvtK>6Ing2fF%`K%;B4Q*wRVvBbtI4Tp< z|7q8@0=%wHudAoOZ-53uQ4V%@djs+0;6Sgf7%wr{A0O}#5%(}tPjlc^msWdS2#(Q0 z#RpV-jkZiM{f_unKWcHVw`y>MQQuI4rXlv~3bN8$(23Vs)%Ah6{^z&HdVBkl{svk^ zd?WU;nO0F_4a-}VjG^s9Y2xx-Bee$=IN$wn`6{=%Ik)-1Nk@u8MWW8|judQdM+{;m129`t9=HZSvnc<-Y}L zDEI6Cw+dmq{P(a1Es+23zhC~3ZAf^r_CEegbW!%SZ?Am=jjcW2)$Mh5_u)4N`UYtU zBq{tTB7hn7^cxFGydU=NzKwF->EYSD*}{S6Qu#;}?C;wm&?%iJKHlp}H1?{)-=?=F zTV09eq@SRdz)S{v+ws0yM$)#MrD+=xeLdm@{Yyp^?Rn>8ad@wCVbN+TX7CW>?Ow+UPx` z&O(N0v-{V}Q(t0mAZ{MiiP_s;i?)MT=Af_8r*4L0hDkaBCH3@m3^M-Fd-b7uJ3HY$ zG}y1XG(mQNYBlp`cdYl8$ChJjxB|~|db6uK?)7~6dH(EZRR>tRV)?3;n&mCt>^tVp zBLjDL_;bAFtDBm<`kJOyi@cVVs~34qD{AUmn^x4;G_^*<4|Bs0cZMJC3O`hZAMOr6 z%nLu<6MmQQdnp!EpxeU{#{7ed~n-{GVYBWui;OX9y z)ytYg3NhZF4Yg?nk|e0LvEHj$Ugxb?>D4x^Shc9tc- zmd0A;GsWdKE^A(~vZXcii9&9yS=h8l7`@d?m#=u=@|*pKFvIEIf_4nv%$#PEewk|$ z%_W^QCqwm09nKJR`RL_xtnv4O-bVt0S z(yR76`r?Mfc(pq&a}0k@DT8Sl$apyV?v5aWZ~X~!7;*(cwh}TzOJxrHFZ;(+Z+v__ z<#V-h9pE|(?f4VpsbjD58iqf7i43{IG`SbKF6^hlBgpw_uUzT7d^aHfb8KL&WBW_4 zCqws+HW?1R3f{?N{H*DHSJCOg9AS%~MMLzraX&TmoJ+qS+p=sR4F%eC@LCXU3r+BIbP{*<`? z!S!jL|Kd91UQO<+3474yY5s}v)Me6sJ@{(k|Fpb!ljakoxteQ$tC$b3ocOa>cdg42 zrvn-8D&jA(Z%vK=KfjKVZrPNHX_xT#wnd+lyyc!#uh-?KN2kl5K2HDGTlD^KE|DPd z9+myhtsFKg{#ODweb;FrzrD6cep84HYw z_AdIiu1;3P=m1&$kd;F7s|mV#zbCfM@9XW}=G%z^10#R1w~JL%p~%vVEWz2I8)WDL zqn}<~>F#5>f;9!!FeHAkjOk+9?l@SVq)(1@vsT=(&8*N#$1Fcx+l}=yfH32D7a@_! z<^_6~WnzCI&XR^K^L8+hkrgRaA&vCvpU*gIfML#Hf^iOm0T!T9)D>G=UWQ^!R0fd9 z(vC_?w6lI=^t1~z9dTtrTTRhqKCLqmS+ej$@fv$&=+MnFY0f2T7PVOZ>hJ5;%1T#F zFOzjC*Y5acR^P~0yx-{I)`#t4cTnz(s%81utrAJD=SUvr$au=FF~wvA#Ud$u%k(DU zYIIXrgVtw8@u~AFKxJR4;BuYoQh4V4+l3)<|TsmG3}*%OJ+a&!!XeWx=Y#rjQjIrO5#Dttelk+ie2=Q5a4w{j!9x?&SG#4{*PdBPy6;erY793^HB<+Q%gq^l) z9H&m$9%(GWY+fUpcsLwc#t$shloR=o6-Kd7!qA>PxUWJ4y1XS}bPVxXmw9LSv$Y_h1#jFgaM?cQl^HFd&*{LRsVayvY8Y@K4f zHI6k@B`oK*)7g-eb-^)PY0_kDh1z0v>0_?O1=u||vw?v8occ+9>U53tC$WE1<=CZK z3$y&pUWRA|#z=uPdkw zHdmZ3zpti$_RE&DN)Yeu8{D|bPxQywkPg9YI8$CW zU+Gra73w3=I;TCG{WDBf*HAQX6XfVNTDrS+1rUsn7|&4YG)dNIWEI4CYCGEU(wl0b z6&thMBc3c~wxJN3wLi9zp&Nx^#(UAN9B4GzWQoLWmxbI{dh0EBc$T!e(N2CwV!d6E za?+BqN5caX8C?YpL}FxYvxV~H8k=rO`I{I%JIAmg&cH=BfOH6I8kP(O{0}}h-8`8% z>Bru5kZiexpL*oMMq6bM9{3-e?vq+~S!cQ4`eHu}SQCTYN&h}yHbi0Y)!54H2uHd? z8Lqh)ewx3tQg^E?W4T84eaxxsW+Ss4UfFlGQIz2^{Xd(Is%X}`Z4%9Ni&rB`JNT(o z`@hmm{DtnVxV+lpQ*GF1=$TkbQVgyL@4HX7g?obH2nsr*FkB|JEOc`vS0zPXO)=Q2 zz1^Ryu`-e~VbIg*O;Y;TlcZ!f%N``V*0Qc&k9e$oQ(BFy*LGHVK^8SbU5Q09RPjG( zcjV(`auA^0e~+)_?BA>AZZgl7O_|xX?HlOPt`lqbm&N*B!>N=rH_{3!h$WlWX+BLX z@n~0nnO2!=CfW)NNmhLs&6oSzxBE9MQ>E+;>YBCCOjR%Nqb{!RYdfzr`_!{)WuGnN zKzjRn?{I!hdjeVeo@JV!Y9mclo82nZ%8>=5sH=JLW50m9x1iQFb>G6NhIkogk2<WM4Z9)cv-Byy}}RN;nnR8Uc98WI*sVuL1218(G%Q$7MS)Y!>nPJ%zWmLaLf9E^>RqV0&TiE=?ZOc4J zmKv;{mCBRh^Nj}X+>a)#Or|q06GBK&4NseC(7tV%nCA+ctqh^L%+s)woK}cA1V#<& z&8%7FA#x(#?@|@*O{PK}Rz{X)%`#(W<#8By>3^i;$LCnrx zGvvq?F@af(C&+8q4PJLE!Hs^BZiZbvRK^hZ_MI%3k zk+F6rLpb?4IcRjPm}Z#gG;P%zE5$Z*6L!BJ^>4j3ket@=Ri@_KF3pyTe}^4@h)o#f zZU5x*VDiWRA)A>{r8z8TB2TE+!yU+fd9B~UDiO(WD9i7U9e$*0X$ni~%3dR<02i^d!o4~#Kr znXc}B#s+E^ceA~(9PvtE>?T-dyUsZWqfqf~(#Y%qurzmYj4Wpq;w1W6Jud5rcX#zj zu3TAZXP72y9qVeC4q5|t#;rQ2cG0p1s&!6m)?n3+Ra9WsKsBS|erUbvxP{1~nM_H| z)I$h*j7=$8K|)f!2Ruv(ls%aNHF^xW6)&k~=sTh^|nr z%FF$m@AL1Nn=XVheRNU12z77H!ZdqGQw|9>#mw;Yc*5nkT%y!;f}dhdREsE z(uZM`O+XxP&RO?ByuX_jrZPEO$MmMprD|+Ks9EM9q-$70y~IkN<&hanP9rcL(4@p- zr!)m)c20>b3u}?rEieo{A!OETuVzqgBzV0BB{{S9q?rsEj1-@U`RPnaq+Z>MFlAGH z{_VQ#l4(pr?9&SMT?=sr<#fNQJz3GY)4-fe`^#x2)Jsnp)xre0tEaVW*6UtB-Jd1X z;la51-#8^@lf6G#FtWV*n45KxoVpGeolqTXXG;~<+=6qmuaaY2Ib<7!HA-4z!<<`s zRs_n|lt7THE>1X;mgw8ngO<*Ajae((wJp2Wy={}Y9t#h-eg;`m+LdWirI}l#eJMK; z14*?DQAxB^g`J+hZyllXVSuK;iN4je}wd!}U8PYS+aAnjA*9@xuM79ok7N z5*=(xc2*Uvi_u<%Bg>sRwM<`NU8S@|wr(?W6)JmQU(LDCPq*OEDAZ<`=>Gl8U!-)x znH14MekhLMUh+mH=h018f>6^dNDp%L5~4uU;|$5J=y9L^A08-c&P)=*K>uX)w2d=& zQ5jKpxYa(DVIyeIq%tZiVOvj_7UgZfNNYb*^ns7ES=0$|mn^VG=~Q*5lCG_QIm2mc zzRg@?qAw%YW(quUfThheyjGqy6Q=3(Zgh#an*N8XGdHe4A2R(uPR(*uiV=$KXn=7# zu8Fy!B|-ys8@7;G#L*QZnK(;++|wF;OUpflBL``P;t|nI@X~37+C^x}WJ;vgwQo0w z{5cg%&~jdV*}Upv$xQ3&Wn;=JR4lqulRZpl$)$#!lsY5!b(1 zip*c!-jT_2kmalQj*?+kU(;&UgdixYT>cXt#u5VJ91ITxb2Fh~ z^R^_c<@bWhQ7%n8Y->x?1~tL#G8OKL1sg%F+@l!(JGD%qvzsQqQG$b&bSR?eq_twW zQF5{(%~E)cjK7?1|5vK4<#|0yoA;SA1~EYmn3pHjJeVNJImLbkx;p-#(3l>EU!|Ni zU6+)!k~6q@v(g!nMli2rx0VTgQZd0;0WMdKVX5M`5_UxHq^p;QUp|t76G#VVCkw;m zDTgzl5miy!i)TwRVr;XWsH(F6EL5GK)C$d}Da6nSBba)i3)6iwZr4IKvuksfIap1z zF|%sY2r*g9nsRG~j8v9-n9*Qoe9FY7v_7<|7;4G2tX+maVqpv_-rXs!F?6_8TB14C zCp|^0yA^U~V^7Daa1ophgyr2AI=QN45QxM(n8W0dMZD9WWM`#?i(g7VmAg1Xw$ZJ_ zG6&1_%#*(HXx^;P{6G9Qe`bh#D!1p;t}aKo4d=D_45!`K<;6i$@TMhCd?&NaywBiD z(##X=I}YIm*o+y1eQ82ZVNSLJo6%oSOt;k~taT*G+BrL`>E>uo=3HIbGL&Fd-@XsY zJC>YRc5h~gR`T+$OJI(fw1gW|90M*(^bHQQ%OR0KgPSc)UAURuXPvuPrExG!4io0e zxQddTyLZQBy~w^6Ytm!iT#gP{FwKo)8Z9g8R^03J5=QqRqHP>sUs6w)a~eAQw{N6# zg3OfBBn9H)nCD-_TJ7}BWRgI~s6B+75u&l{u{5{5Ya}QuQZSSB?u-z_!yG4zA(gD=5}Mu+%COL2 zjKtd#a^^R9gTNW5?+0x`w-$r$+_V8R@00`*jP>lCXW~RpmA36#R2Qvob|+$7MzdSC zTj;X~XY9gzjLmhlG$)S}K_e2Ws>a0Wqf5{Po7E%Q>)d&n3%%OvgqIB0ZsQ{wOrGOr z>@084G5;ZD#xwfLSr=`Q*ESN}eZ29ewUJ&!FzevyReLEMvo6ZIkfiD=G_0{I$2x%V zKdLeX8eTF8^b^+BGMlJynz&Jx9n9U_;O@@g?ymLe$%%_m6@=a$+|3K_?#U5jeh~Vu z;BIaxVN#x;*W9!cbJ4=-m`;4|-MP0(vkVmrPdoVV!E-mjl$XguW+5dbg97G*d^V#-L$6Q-Eu3a% zWVvNc+bM}8M!Ct5$ny2*ExLyim$gC8;)ZoF&HaA!dW#Kxb!w1=Y1?)5|Wx z%`z?od8_4}Q+erNlT4g-!OTXGjqL<)b@FDLzB)ViomC=4d{lp5|Db&hRJXtBikyD> zhR=Y!wksdq=;O;ky$O}7-*;lWT(wD5k`cO_gns41-xMDlpum}D@;ty7gJhLh{UYBa z!;*XS6KveD$ITbbT$YT6yf3jOj;938X;}O=pB)<5#>*u!K7Xd7#5zpP+~!x|71NgD z>dq8-Kg-#a=6&+6gs7kmi4!1FzUer$1Qo{iQ<|6-WIeNfBMz5}6{%Ydd0MnFDFqv* zta#Y%pmJi!*X4+5Rq%bo>^71@=Uhd@&?=@iTcQVk-Q*){Iw#}PAgfK%YV7Bo(%H!v zp8mXx!RGAell2^Ha}=x@^KKgK?3~Pz1ZSI!PcUL=GWGJ|x`8_$;G8xVY$O;f6ALxA zB0H1mvXmA6w0TJ3%i#>EVX+O)e*}KZ*@*D)f{3hVN#H}mFaAeMCll>YW3b>#-L`+C3wF|X8V)I z+c4PGo#YES_PtB}XpI@yUOhe6k(m@j(Y*TbTfCaCd@eu+m01d#sCoiE{7P;*T^BFw z)$%*nwVnlp*)?+mXZl5ol4a^Q}B{o#Z+sNccy& zPIHZN9kI{bz++tfTvOhb_wKFy+55*axa7R?)IsjgRgb4mfh{$B7YOVCFA9Aj-!6K+ z=hfAXr*?n`!NXwHBECHZCKvM^oI=klZQ#3CV16TiVgwukkATS~$OF$U<(oa=(PiVQ zlAAoQc=>p$3LIK7o=Sp8-^=%{z~svD)Jxz+umV#nUNfHB1dhCq@9cmrYsXXG8=yZh zo@xe@U^jRUJP39?NIoR|A@m0if<Epa)pDk3SK@A3Z7MJ7kBza|g&Lc<~_R{>y~(7gctH9eh9P zDex%YqdEg#o5I78;1J8kD;3!yi zmVAIou;}gR4VHo<;CyflYyykFhdqK-U=nNrcY{grFnAC=4xRulUCc(?#5SZ^H z7c2oszzQ(`2b33B3U+`k;0`be9tNwP$G+tm^lk?K2X+J=1s8zlz_mg@kKKVI;2E&^ zFR?qJgEME5&JU?i@F2JkJOLg9&w(T0#lIpQp}#;nx1jG|6HoAOC~xot*aDsd`@#Ib zMGn{ko&=AA7lnR-`YJ_lumbD=>%fCx8+h@55)Ul?U!)I?fiHk{{~J4+P5g_b0}g>Z zz!QH*zQC3j;RDCOV*ZY7-Ty%^@F2JjtQtixum#))Cc$G84vv5)zzg6Qcm*uJgq%6V z1Eb(Uuns%{wt>Zek3C5^cmQkxp8}KMY49L;5zK#y_+^wkxDFfxw}M0e2tRlNJPlq1 zFM`GYMENp4tOI9)Bj8$j{t@YbN$@G~1b7-8122MAmx*^9;owa01UMfY16#nVACrFx z2lq)hcuc~<5wP^1$v@Zvz5)(`CAY%|R)P6HK@QjgZU>KoN5L`h4A?P7djUtl85PL; z7vg~@z&5buWzq%DfhWPbf2Ey)L*Nx~1T49O{9hSQRf8SiCNTfs@aNzO@FZCEAGCi7 z2fa%4087AgU=+-Mh4uorfbs!~qu@Sp3_J#w{wMtcco7_x@Nw$-oyg2d_x@jj2@WT*CQo zS~FP6cha`Yb6F~N3LGkD40tE`x;>RD2J;!uw1LH75*z`KOE_bm7r=Aiw7ba9yi{rd zn12s)!4_~kcn&-u;ovc_bUylnN$>(V0?w#H{<~7CDzF1w2PVOOa0na%tL{yuj>63J!tu!J}Y{&=)iI6gs#MJO~~EPk^T+ zyn%6-goCeu#f_BLz3_o8VEz*72~2{gz@tma@4LaKRH_2ZUzSRBfG5BsVDWOw9~=R_ z1(eGQ#(m%z*a7Chm-+@L(l=0rP9o_xJA-0!~|m z9$*z%`~k-BV8;iM51!l37`>i+{3iAe9zBR0uh3>-CSFtZ9u-au(0Tf$il*s z$MY5z`up=26_)M0p{6jpYidp5{GB(}753-VOqpIdA5u+W87#08Wntm8nt~>xpX54x z_joF1W$la96_)JEt1I+(=0^@pFD$81=Gub6;J%?C9=eY#b39%NvZf*D)V%T3GVVR% z?u()=whyf7v5?DWE-8YxpLgBj#y>%HTtuM3X`e{s5mF)Z-P2%Gut@zn207`oW< zCK<|`T-fqnSU|AY&06>m!@rJny+~W3A6bX2rh=^$s@T?6!e3ax*h#`wpJjy?B6;^w z=b})Z$Pt~6z&CV1V+ig&a+yR*1A(|y?-XI@3F{OY?=39aB{r}#Z*igj2nsDxL5m9_ zj~VTd+E@_TQ8?|{=U^9me1-Vas>f4r08JgLJuVV^T$pW-&5>7f)>VChS0?iE$WIOV z;ojt@i9E;1O>N;clvu9X7`>D5?pVltPI$E}u|;dUROy=Og?^1I(8UFhhMurHqMRW9 zapKPbCI0?MV`0g@JnCYX*u_rlqB-wN5zGP-l3=0T)E7veFB9h|YXx7BG9w_|26N>3 zhvd0-f_+juB5OfD<;Qx%$GA7LaJ+GJcEVegBnAb3#dan($cGF0ORcpCpD#ADO z2Fe@0CjveSQ|&9VwXmc?YgG8^;5!1}(ST3wa0&80=J?78>xQqaaXj^Y;nR9opH-`E zsLj>5(eV(x+u{9cAhTA|79Bt9bd)+6hOc|EFVw(inSqISMXW;TT*y@O5_i-s%BBaW+)9I zi(EuIjv{XedB;~UFA#Yxp>`b2+c?D~-0ArOBSnJ6uuoIukGr5W$+z?@2S{$YJX$KfUA0l!+#x_InzB{lZ$1C1OdNnd$Ti`L( z@+#mx)IOg2q{PDp9yenS(|&6VH;%TpAVOOuCignN>X7jh>zPcKwGYG0H0|xsOQ4V2 zdfO*uxl8=`&iuT~SbnXMq4|gRrTBPC|8l&RXM-*Gyb=1$lKR4;WzxY(-+K<;9h;a} z+dMIrVf-LG7qvNSnfVWh_w~Ooae6A>A zb%cGId+z}Wqq~iC7Zx=?t31-4Ti`hh&w1e?erCUHinP8UvfmZ2q`8|o+q>;}PCQO8 z8qv3kzd0)Mdd5?~W%IKu(roe`{Qx;%X6rK|52RLKIBi)$JfR=zGkt}B}yT+^t1L7=;G|<;ULAj!0nJc8GRs7YdWA?26MV#Lc%or)FkEcFP5U^yzKw?pW zw5uV~IJ*V^W&5zlrTs`h8(n5}rXf+LQl*$V57b37@nnDG*ayc`599w#dsJT}dK`h5 zh7Rx2f{4^iqdu%Ch%jQXQkECwt&*lgp}@DK!1EDP^m@iuzsg#cEkD`@(HR6szO42w z?W+o&%~ZRoL;cI!SyHgkS&ny_Xbs4i!QRbkaPs`PxozaDIg7NuAkV`h=QmEs z5nkkZ0vaX+G#2F5-AG8TNn~CLBMB+ChRh-NvVy$55;C#i>I-CERm>ph$mhmW583v( zKf=`Cj>T!&J8xiaxG?Y27;T1AQu`PG+Cu!{FVO#RFJ%!PA8LFOmUfsC+s>m75I1>z zJoQb9t99o5YvgHXP7(y0cZ&Z?zQ}%)5cmo0EdR+~S(tVaS~Ij-_`@^ z6x!J=n(W=akVR{PHkw6igEp2$OG5L$l&RltXfvRN%jz(+k}TSBXr<6}Y=RgmgAr)` zS+w)ePC*OT?@Q25LkpL^M~$Z6##BXrGFCbP?Ethpg+edBGt#AflZ2fm z>;z$I!?d5Bk%xk?mk2va*ldZXVeLWKG!_ES5TuAM3cXPt%Y-Rrc_^3Hynp@nOb)WNB@o-zE$aSN8Uso*qx# zF5w!tHPC&8u(ljw4X|DyEJ@g>B%b;r`p&Q~TaGVk#TV6wrb3HkZp5&j;RI0_9GE$I z#V=t$$dYlE@l8u*oU**o@6oY3BPi{6THw13U-JaM_h;~Jhp*(z{LQBce2IXsiZD5+ z&`RjGN~J# zld0{>{P}P&G-Fb%_0NCJe>|R=70A(MsB1M*!a4~1OB=RJY*EMRk>5a$nOxTwu$qNp zGzdw%gE&QBzjhflzXuA#S?chFXBeLRZ;Yqv!#wPH zI3DR&F2WOq=b-TLqgcEv&`v>I&^C(c(1s@oixM_6NmvtMr*njf&2A#>3}I|> z(wGbVb=GEgKp)EyNAx;O*p(b%lBbh|y+W9-@A54CXP`AaGcixXKT22=VPXDPpdHG= zFS1JBM*5S4RS|Y%lCWmNj^+px+wLap7-8LFW7zf+V%v8AD{C&jxUgTm=lqFl?@P@Z z*GXiZd3HSYCx{B!Hq(GeXJCwssU2VY>;N@l8ASQJFEd$N8jplrW#LZKALG z1lGRx=ivgvYp;>@ncHCK3Ht@&b`W=q#0|GuA1`9tY(oLM7#sm`(MG z2kk@7&kYl{z{=bi`9KiXOxQ)jByH2K27<6|!lpf!J8U;$6_bP=C9HXpFgcT#oFwc8 z!VVFp>)4tHvyLZqc!jW2lY|w&opPHbEJ|4Zw{pvrbADxn2StNy3g0 z){!HOYV}SLww17@Qr0>q+`zb?w%|cZT;@$L5Ppns=Np4{$f)U=@$AZ%&p_uaeA?fu zjo3M7)U1X%z6$uRz~}sNS{~a$rZ>^`)fV{t)8naj(M!u+)=1x{Yu=)FlJI`QAIJ!2 z9h0p>(fc6b#|h6G7t+scb3Lq%Jx;+l3g7-fj&yC5fe5NAU`G@rO!~r6c$@xoJoWJm zUY1par#_Rn*vG!%eJsqo%CNGW#!{M*D|xAgxA@OEBNpb3tX38YZzEj(mgaroaF&au zOeK5=;X{*zOIaKt{3zi|xX)<6(Se}Mh3_df5g&{K$o+-I;Mjzdk4aQ68hmR zIZ_U1p`U=hh@Dxid$7=78chhA~SOdxGTsulw z9buA|{G?3lptV8!6Cr5(v17|0~oxHEWTXydH>K?1>WW#T%X(>@Ls%5-lyQ*`uz3DJrD1U|8Z^J1r%*Q3nEA0or{l@@x^}G*9)IL zz(wR0zaw+K5?1+DbJa=wmpMl=g@<(#KWh(1MrB{hTJLNqV50i$b7#I|+SP7kZ2#Bs z)PEBh{2I6pLo4CD?dfSe=y)+}Zy&k#yc9cDd9RnHth5{Y`BI__`Xm1qZ{A679 z3baGeeoqLR@ATS;Jx5Zlr;9SzMzkHvneG`8&a_EfZS#y}b^o0iGP^Y5-{mLmxC7p1 zct0fs(%C2L$#$PJav(kNmGS5Sct_xUo0Nmfh1Z<9`1@dxR$qWKBalQSZ*p$@cpm2g zxtE`$c^=wR&|F`=Gs2D;9bK*ZVs&TAEAjIgu$+Z=vr_PXUHIl*e9`T3Y*hKpyQE)@E(V^ z!OGbs<+W4JwwYA|Hy$|!-}wwa-Ft!WF;_h5v*rA|cSE{-B+pl%y+T~sqLQEV#WPU! z3bfA)LGu>*oUKO9Uj^a2k)wL8k-SqXHP32!H4t`+Fdd6^6#AV+lyYo?J_h|mA~Vub z=rdKQ=2p($ubY|*&bEcm@3H+6S<4|Pa*Y-&ztt76T9tle3Z!HEQ^+`tj4F|>Wtv{6 zk)1=c7FJh)RU0|5iB4n0J4?LZmUxjq)v1Bo8C2@p8#%`yRaKy--QA(+TJLSm?-`L6eTw zs^bZc_bo2qBwaR<9kvdrZ1iLvF){T|dePT$9#wSVC;DB1RsoG=09)6qw5o-tn8{l< ze;KsN`0H};ue}O?((>ORY4ejbcUyi(lX5!@tqdKtU1~W|2;p+lGdB@NZyC9+m-CNQ zNl;=`w>OHcb;wftL{`||Ol#3)Ue%@ecE+Xf-bFn5iGF3!o`UvOr5M@*Xlwbq>c1AE zHA6cGtv*ESfL2sseFk)&Yb&%0XulzR+SWMT#3>>1X>y2C(mV{$F?e1tJp6pF+cHku5Ie4No(rsJfjY6w{_Fe9S^dcOHl>|9FAo1jVk@KN=Qf@x9bI?{v zJT12+f$t8lg-U%j!8`5sY2L?8Kd9|zvFsZzD~z&(nz8MtOYO@-i+RWqT@E2@CbDqj z`V-ny&>Eo0z5K+EhoRL$%eG^muoo=<)$;7!fj=Prbok{bvWuZz&Pt~Y+Dkdokus{Y z{9hCSYNwQu^jX!B#iq}~wiy44?0$HM3R9^9;pHd3YY5s7Xa|Hq{QVK_hcRL6cVztV zh^}q~Yo6k-PZ94t@pNq?CjOZHVd6@a&L{i@!sp+VN_C0chk|iQ+Mlrx+ml%xi)BP2 zd6IW|x{3RU#MOGoN4Y(R2h$Fu`#k2nk&~tj$&_7(Jpph38&YO1Ps@w>#=g9a^7=q#ap`#HCE^_- z-lruE)su4GFXx3b&QpIlQ$bTlWlY#+yfJ0wL>s$qMHIJ=2+Q_$}aCtOeJPsMDR2WOu^#D1l{MWgI*7N^H1%nezMHf^zq zu-$~objA3XnD!}RPn!rkOjy5!Y5u6QT~cS9AAi6pYWCR_PB(h|uMV6;HIKuy& zv|>oZz@}Ztql`6S*$00~3Ge4~Z|pPO-;uyBc|U^l{-4E#(uRZXP0z|R-SN&4{}}Om zCBBxM&ciu!%fQQ)TN6QJ@Lh)QVuT0EZ9*Qy^NIsg^8V6hGVAn>968f>Kk8VtIPkVq z>aTb<^02GN^H#_?`W2by=*74`mFu)hHBt8=r)*}*oX1VK0X>I>?oJqBzn;7x$E zh0At`Isb-?A!PIg^~X?cvNiV0)AE{f=S}5FnfeR@j{b`EHR&>ybJ%1O0&YphlnwB` z0Nps{oq}b>bxr)%n_T+s;>G1X@{4Qbz)X3^^e>e8=-u3ekCu;n58`#Ul$QPlg?@D zEveK7;pHd!j6ypH?O7qvDHXA8Bsw-g-&bnqgXn0_{7`qnI|)%v-)8Kp>k(u;K+vfn zC&_gXSx1od0kO{|fqiD3Pg^eM4VG}$@6U5)cPYdET(e>6;J*9k4TWtxZ`?I?-wpfo zAJ2P&bi}vKxSRHKtF3EVSY)BLSFM9G!d@b5W?)yeKWkTvZT8)Ofd=m`waH#+jw+y~ zir-2iYj{p7^}F0lecE%sq_{I*I=qL%mW|(%ILC-nQI<+QVAHo}kF{-xYhg!RCM6go zV+~qnF>ziX&en3?+v8r&)i1@zZRd6j`VQ##2ljNebp_pr%4JS@2c+$+m|$p}lVh$u zziGm`GqEetD>;vKlRHwWkBDBJ$&<;V`akF=q5qc9DHoeZ7PWWguPlsa6w6ZHBogOt zGHmSi4Dm}UQ^8povEd8QilMznWb%`;9Fz2+Jz~o;T>diD8Vi>t`@_<1%I;x(=AEfj zwZu_BV9z=Fd3R26j({MsqZW7%@O_au_pI?oW#vISZt*Amgk2wm-49hjh=J zqqove9fEJc+*GjcO+Q^PO9hPN-*49Qn-fK0 z;G&njmwe!E-Ukk3rQ4V4rTwdYH?TQE)#Ol%Otv6P-({Z1JDhLkL4AK(R@Qh#&;HiE z5or@!YfVAkuTLqwJf)ZO!P*9{pySMCtOo{dK*wY1gQN|7nl^xio92bz@=3npUe*nW z^D*u{wyWgqe>C#2_JND&5TtE2!_%?c+PAi09lHr*dM?x?NAk^4Zn1+Q;v6TAjvIOQ zxeh@)1MQ>SOFJ>|8SpNObhtDoi6`%C&tH*B{deKvC$zKB&OwtlBtM~DgmwYiETtIQ z6=<(OlW_S7&UiQZgT~gV{)Fa3%Wux4RY5C)_NEYD1GJgYWC>Y*(yrD)D}yF|eyFW8 z+kIcqt|W~i_@eMRT_o-yXcf>_1aY+;ytmNjY#8N1DQFtQ@U_6luqT`bf^BaS}e)PDPheXgi>>WE4(gNp?P(;M)z~8-?7LE)v`cSV?EnDuBHqNxbctpUD$@Fj&$+bL6( z$IaRy4oA*RO9z&*_R(0-nKer_e*7S^hLP2M6sT^ueS#?SAZaWh(XSHch(+lJ@N~`|8L{Q|hOhcq7Eqxf=Q2$38dp zW6F{upoFxek-CuY7))E0$~a5C16nb(X_78K;X4SeC`8kM*ZzC01YRqF*Gk~$R07rN z;F%vkU=tXYff3tg_R)sW?Q^y>G}5At#e

|rRUja@xAi^}O3H-Y{bHclG>8{+E`s(ktEcr|cbN<}CF*~s2w@vXw^(Aa$l^4Mp2f@hLO$aVE9bI9n{VIh;rK>v_yvpSEuOV_+TyUq zwHDhfHd}14SZ%T2mSfaDm)LZREY8p3E3@=rtLLzN-eI4k7SDd#l#6HaxGm3P_PP0p z37_xE$<>eLyJE}TVbs#ge%Hi1ZR72*e#oZg{Q+}c`MKvW*yln+_P%1DXV_Kyx7Kf{_QRHS>|Q(bM(vBA-a4-?Igtc-4es@jk7c?w{k8) zekuFx(!Fe-ziS=xzuD&lhW!`r|I?2-%`;V-*KD5aEv~WHX>qf~T^66T_!)~&TYS#q z^A=yU__D>Rb^+?m7H_pU&tkpBH5NN9Znn6~;*%CXWASN=&slul;)@nvwm5aA$>*Cb z-fD54#d?ctEOuJlY;l*xCoO));?owNv-rHl7cIVQaq23YzQtQD&a+r=agD`Ji<>R( zviPLM&scog;&T?CxA>yPmn}|hvFTg9)#5yh^%mDy?6kPq;x3C%TKtT~r!78b@p+3c zT722!)YUe9i?>>wXR+Sm8jGD4H(T6g@kxuHvG}yb=PW*N@kNU-Tb#Parf>09i}Nhj zTU=wY)8b}}yDUCw@iP{mw)mXI=PkZy@nwrs-)Gaec&o*E7V9mpvDj&Gv&CH&pS1WH zi%(m8&f@bHU$pqL#i?s;`WA1sIL~6e#WfZ?EpE2B%i@z3KV$J}i_ckn-r|cEU$!{a z_ET@Rc&o*E7V9mpvDj(x$WU&-Wpcy%>2JEbpAGhZ!pNyUk}2;EnUB}~wByiqv;JHd ztG|~i_ImT-#skNmbt8#PIqu2vefAoBj{jPClV$kaHRL(I&tE6s7p}o~Exla08%KT7 z%8NekLNd|ued!wMx^dVaT_@kkYw)>o%-6E`c07@(pPLtDQYSvSaoHbd$;;++8y0KB{;sXTqoZ*uaoce zHTc~4`rFsZ_uXsoW#{V`{n=0aqHFkzrJtK0d3L>Kc;LTAza3fq)nr;U@0ctklm1_2 z2hrcp)MK)zv!9(TB#VAF>v@vL9oK31*ULBj@ktW;1tBl4t-aSTTfBUAxj*;r$~!CP z`gca}ygNF7?p>Z&nb^c%Z%)QGc$NGCqZM}(YJqD8lCS-GbK>qY=#zQM%1M%*dM6h@L-AS*qtGA2)lku(m-^l}EeI2o6 z%&UxVYVG9j(ZyRgbr9D*nHa6H0scyyiQ(=gmL!1yRVUWd)s6~%2^P0dK&kVts^ z>9n4ncyIEjt{v&m#V5Fa^O(JH7|lw-^>dE=_N@5lZG4BNj?rTFcw{d0mswMB=?4oy zb|Gk*9Z0x%+3Cx&kL1C{ck4_Jhu>%t7BMoyb@59K*{cO5DHq?ZTRC*=RF*whZ*$K} zxsf#^7vHTDIh1c_%g^cW_#Dc#N!Fm;vs;I9ctB&DeFx!j`dhNMksFci;=6S(hi=`= zrSIaq{J-DEUuXrobu@==-A&@ZnJYW~2cbz8-8jUpGdgtZiLmI;>EWI?a}$p5+jS&| z`mJ%t3>MjYhabs`@775ju6@{6fQ?se(ZR>K38(MYMIE|%kK@nQf4`0I%HJEd=~;Zr z&Tn0O-`!Xgw<|GR{HK1|+&SFtCJvTAJALVX!tu*)HSrxDWA8ltbM@zFpXWyAFt)jQ zZXGzTvTBr?<18zanlp{bP3B`Iv2y^9c|CTzrQY2n@$}>(-+-{>d!;T|9@E zvf{gSkRwT>zwahyRtevtgCB7tvRwX$A2;!aKa{)vY;m~g-WYd6iv|>P +#include +#include + +// The Wren semantic version number components. +#define WREN_VERSION_MAJOR 0 +#define WREN_VERSION_MINOR 4 +#define WREN_VERSION_PATCH 0 + +// A human-friendly string representation of the version. +#define WREN_VERSION_STRING "0.4.0" + +// A monotonically increasing numeric representation of the version number. Use +// this if you want to do range checks over versions. +#define WREN_VERSION_NUMBER (WREN_VERSION_MAJOR * 1000000 + \ + WREN_VERSION_MINOR * 1000 + \ + WREN_VERSION_PATCH) + +#ifndef WREN_API + #if defined(_MSC_VER) && defined(WREN_API_DLLEXPORT) + #define WREN_API __declspec( dllexport ) + #else + #define WREN_API + #endif +#endif //WREN_API + +// A single virtual machine for executing Wren code. +// +// Wren has no global state, so all state stored by a running interpreter lives +// here. +typedef struct WrenVM WrenVM; + +// A handle to a Wren object. +// +// This lets code outside of the VM hold a persistent reference to an object. +// After a handle is acquired, and until it is released, this ensures the +// garbage collector will not reclaim the object it references. +typedef struct WrenHandle WrenHandle; + +// A generic allocation function that handles all explicit memory management +// used by Wren. It's used like so: +// +// - To allocate new memory, [memory] is NULL and [newSize] is the desired +// size. It should return the allocated memory or NULL on failure. +// +// - To attempt to grow an existing allocation, [memory] is the memory, and +// [newSize] is the desired size. It should return [memory] if it was able to +// grow it in place, or a new pointer if it had to move it. +// +// - To shrink memory, [memory] and [newSize] are the same as above but it will +// always return [memory]. +// +// - To free memory, [memory] will be the memory to free and [newSize] will be +// zero. It should return NULL. +typedef void* (*WrenReallocateFn)(void* memory, size_t newSize, void* userData); + +// A function callable from Wren code, but implemented in C. +typedef void (*WrenForeignMethodFn)(WrenVM* vm); + +// A finalizer function for freeing resources owned by an instance of a foreign +// class. Unlike most foreign methods, finalizers do not have access to the VM +// and should not interact with it since it's in the middle of a garbage +// collection. +typedef void (*WrenFinalizerFn)(void* data); + +// Gives the host a chance to canonicalize the imported module name, +// potentially taking into account the (previously resolved) name of the module +// that contains the import. Typically, this is used to implement relative +// imports. +typedef const char* (*WrenResolveModuleFn)(WrenVM* vm, + const char* importer, const char* name); + +// Forward declare +struct WrenLoadModuleResult; + +// Called after loadModuleFn is called for module [name]. The original returned result +// is handed back to you in this callback, so that you can free memory if appropriate. +typedef void (*WrenLoadModuleCompleteFn)(WrenVM* vm, const char* name, struct WrenLoadModuleResult result); + +// The result of a loadModuleFn call. +// [source] is the source code for the module, or NULL if the module is not found. +// [onComplete] an optional callback that will be called once Wren is done with the result. +typedef struct WrenLoadModuleResult +{ + const char* source; + WrenLoadModuleCompleteFn onComplete; + void* userData; +} WrenLoadModuleResult; + +// Loads and returns the source code for the module [name]. +typedef WrenLoadModuleResult (*WrenLoadModuleFn)(WrenVM* vm, const char* name); + +// Returns a pointer to a foreign method on [className] in [module] with +// [signature]. +typedef WrenForeignMethodFn (*WrenBindForeignMethodFn)(WrenVM* vm, + const char* module, const char* className, bool isStatic, + const char* signature); + +// Displays a string of text to the user. +typedef void (*WrenWriteFn)(WrenVM* vm, const char* text); + +typedef enum +{ + // A syntax or resolution error detected at compile time. + WREN_ERROR_COMPILE, + + // The error message for a runtime error. + WREN_ERROR_RUNTIME, + + // One entry of a runtime error's stack trace. + WREN_ERROR_STACK_TRACE +} WrenErrorType; + +// Reports an error to the user. +// +// An error detected during compile time is reported by calling this once with +// [type] `WREN_ERROR_COMPILE`, the resolved name of the [module] and [line] +// where the error occurs, and the compiler's error [message]. +// +// A runtime error is reported by calling this once with [type] +// `WREN_ERROR_RUNTIME`, no [module] or [line], and the runtime error's +// [message]. After that, a series of [type] `WREN_ERROR_STACK_TRACE` calls are +// made for each line in the stack trace. Each of those has the resolved +// [module] and [line] where the method or function is defined and [message] is +// the name of the method or function. +typedef void (*WrenErrorFn)( + WrenVM* vm, WrenErrorType type, const char* module, int line, + const char* message); + +typedef struct +{ + // The callback invoked when the foreign object is created. + // + // This must be provided. Inside the body of this, it must call + // [wrenSetSlotNewForeign()] exactly once. + WrenForeignMethodFn allocate; + + // The callback invoked when the garbage collector is about to collect a + // foreign object's memory. + // + // This may be `NULL` if the foreign class does not need to finalize. + WrenFinalizerFn finalize; +} WrenForeignClassMethods; + +// Returns a pair of pointers to the foreign methods used to allocate and +// finalize the data for instances of [className] in resolved [module]. +typedef WrenForeignClassMethods (*WrenBindForeignClassFn)( + WrenVM* vm, const char* module, const char* className); + +typedef struct +{ + // The callback Wren will use to allocate, reallocate, and deallocate memory. + // + // If `NULL`, defaults to a built-in function that uses `realloc` and `free`. + WrenReallocateFn reallocateFn; + + // The callback Wren uses to resolve a module name. + // + // Some host applications may wish to support "relative" imports, where the + // meaning of an import string depends on the module that contains it. To + // support that without baking any policy into Wren itself, the VM gives the + // host a chance to resolve an import string. + // + // Before an import is loaded, it calls this, passing in the name of the + // module that contains the import and the import string. The host app can + // look at both of those and produce a new "canonical" string that uniquely + // identifies the module. This string is then used as the name of the module + // going forward. It is what is passed to [loadModuleFn], how duplicate + // imports of the same module are detected, and how the module is reported in + // stack traces. + // + // If you leave this function NULL, then the original import string is + // treated as the resolved string. + // + // If an import cannot be resolved by the embedder, it should return NULL and + // Wren will report that as a runtime error. + // + // Wren will take ownership of the string you return and free it for you, so + // it should be allocated using the same allocation function you provide + // above. + WrenResolveModuleFn resolveModuleFn; + + // The callback Wren uses to load a module. + // + // Since Wren does not talk directly to the file system, it relies on the + // embedder to physically locate and read the source code for a module. The + // first time an import appears, Wren will call this and pass in the name of + // the module being imported. The method will return a result, which contains + // the source code for that module. Memory for the source is owned by the + // host application, and can be freed using the onComplete callback. + // + // This will only be called once for any given module name. Wren caches the + // result internally so subsequent imports of the same module will use the + // previous source and not call this. + // + // If a module with the given name could not be found by the embedder, it + // should return NULL and Wren will report that as a runtime error. + WrenLoadModuleFn loadModuleFn; + + // The callback Wren uses to find a foreign method and bind it to a class. + // + // When a foreign method is declared in a class, this will be called with the + // foreign method's module, class, and signature when the class body is + // executed. It should return a pointer to the foreign function that will be + // bound to that method. + // + // If the foreign function could not be found, this should return NULL and + // Wren will report it as runtime error. + WrenBindForeignMethodFn bindForeignMethodFn; + + // The callback Wren uses to find a foreign class and get its foreign methods. + // + // When a foreign class is declared, this will be called with the class's + // module and name when the class body is executed. It should return the + // foreign functions uses to allocate and (optionally) finalize the bytes + // stored in the foreign object when an instance is created. + WrenBindForeignClassFn bindForeignClassFn; + + // The callback Wren uses to display text when `System.print()` or the other + // related functions are called. + // + // If this is `NULL`, Wren discards any printed text. + WrenWriteFn writeFn; + + // The callback Wren uses to report errors. + // + // When an error occurs, this will be called with the module name, line + // number, and an error message. If this is `NULL`, Wren doesn't report any + // errors. + WrenErrorFn errorFn; + + // The number of bytes Wren will allocate before triggering the first garbage + // collection. + // + // If zero, defaults to 10MB. + size_t initialHeapSize; + + // After a collection occurs, the threshold for the next collection is + // determined based on the number of bytes remaining in use. This allows Wren + // to shrink its memory usage automatically after reclaiming a large amount + // of memory. + // + // This can be used to ensure that the heap does not get too small, which can + // in turn lead to a large number of collections afterwards as the heap grows + // back to a usable size. + // + // If zero, defaults to 1MB. + size_t minHeapSize; + + // Wren will resize the heap automatically as the number of bytes + // remaining in use after a collection changes. This number determines the + // amount of additional memory Wren will use after a collection, as a + // percentage of the current heap size. + // + // For example, say that this is 50. After a garbage collection, when there + // are 400 bytes of memory still in use, the next collection will be triggered + // after a total of 600 bytes are allocated (including the 400 already in + // use.) + // + // Setting this to a smaller number wastes less memory, but triggers more + // frequent garbage collections. + // + // If zero, defaults to 50. + int heapGrowthPercent; + + // User-defined data associated with the VM. + void* userData; + +} WrenConfiguration; + +typedef enum +{ + WREN_RESULT_SUCCESS, + WREN_RESULT_COMPILE_ERROR, + WREN_RESULT_RUNTIME_ERROR +} WrenInterpretResult; + +// The type of an object stored in a slot. +// +// This is not necessarily the object's *class*, but instead its low level +// representation type. +typedef enum +{ + WREN_TYPE_BOOL, + WREN_TYPE_NUM, + WREN_TYPE_FOREIGN, + WREN_TYPE_LIST, + WREN_TYPE_MAP, + WREN_TYPE_NULL, + WREN_TYPE_STRING, + + // The object is of a type that isn't accessible by the C API. + WREN_TYPE_UNKNOWN +} WrenType; + +// Get the current wren version number. +// +// Can be used to range checks over versions. +WREN_API int wrenGetVersionNumber(); + +// Initializes [configuration] with all of its default values. +// +// Call this before setting the particular fields you care about. +WREN_API void wrenInitConfiguration(WrenConfiguration* configuration); + +// Creates a new Wren virtual machine using the given [configuration]. Wren +// will copy the configuration data, so the argument passed to this can be +// freed after calling this. If [configuration] is `NULL`, uses a default +// configuration. +WREN_API WrenVM* wrenNewVM(WrenConfiguration* configuration); + +// Disposes of all resources is use by [vm], which was previously created by a +// call to [wrenNewVM]. +WREN_API void wrenFreeVM(WrenVM* vm); + +// Immediately run the garbage collector to free unused memory. +WREN_API void wrenCollectGarbage(WrenVM* vm); + +// Runs [source], a string of Wren source code in a new fiber in [vm] in the +// context of resolved [module]. +WREN_API WrenInterpretResult wrenInterpret(WrenVM* vm, const char* module, + const char* source); + +// Creates a handle that can be used to invoke a method with [signature] on +// using a receiver and arguments that are set up on the stack. +// +// This handle can be used repeatedly to directly invoke that method from C +// code using [wrenCall]. +// +// When you are done with this handle, it must be released using +// [wrenReleaseHandle]. +WREN_API WrenHandle* wrenMakeCallHandle(WrenVM* vm, const char* signature); + +// Calls [method], using the receiver and arguments previously set up on the +// stack. +// +// [method] must have been created by a call to [wrenMakeCallHandle]. The +// arguments to the method must be already on the stack. The receiver should be +// in slot 0 with the remaining arguments following it, in order. It is an +// error if the number of arguments provided does not match the method's +// signature. +// +// After this returns, you can access the return value from slot 0 on the stack. +WREN_API WrenInterpretResult wrenCall(WrenVM* vm, WrenHandle* method); + +// Releases the reference stored in [handle]. After calling this, [handle] can +// no longer be used. +WREN_API void wrenReleaseHandle(WrenVM* vm, WrenHandle* handle); + +// The following functions are intended to be called from foreign methods or +// finalizers. The interface Wren provides to a foreign method is like a +// register machine: you are given a numbered array of slots that values can be +// read from and written to. Values always live in a slot (unless explicitly +// captured using wrenGetSlotHandle(), which ensures the garbage collector can +// find them. +// +// When your foreign function is called, you are given one slot for the receiver +// and each argument to the method. The receiver is in slot 0 and the arguments +// are in increasingly numbered slots after that. You are free to read and +// write to those slots as you want. If you want more slots to use as scratch +// space, you can call wrenEnsureSlots() to add more. +// +// When your function returns, every slot except slot zero is discarded and the +// value in slot zero is used as the return value of the method. If you don't +// store a return value in that slot yourself, it will retain its previous +// value, the receiver. +// +// While Wren is dynamically typed, C is not. This means the C interface has to +// support the various types of primitive values a Wren variable can hold: bool, +// double, string, etc. If we supported this for every operation in the C API, +// there would be a combinatorial explosion of functions, like "get a +// double-valued element from a list", "insert a string key and double value +// into a map", etc. +// +// To avoid that, the only way to convert to and from a raw C value is by going +// into and out of a slot. All other functions work with values already in a +// slot. So, to add an element to a list, you put the list in one slot, and the +// element in another. Then there is a single API function wrenInsertInList() +// that takes the element out of that slot and puts it into the list. +// +// The goal of this API is to be easy to use while not compromising performance. +// The latter means it does not do type or bounds checking at runtime except +// using assertions which are generally removed from release builds. C is an +// unsafe language, so it's up to you to be careful to use it correctly. In +// return, you get a very fast FFI. + +// Returns the number of slots available to the current foreign method. +WREN_API int wrenGetSlotCount(WrenVM* vm); + +// Ensures that the foreign method stack has at least [numSlots] available for +// use, growing the stack if needed. +// +// Does not shrink the stack if it has more than enough slots. +// +// It is an error to call this from a finalizer. +WREN_API void wrenEnsureSlots(WrenVM* vm, int numSlots); + +// Gets the type of the object in [slot]. +WREN_API WrenType wrenGetSlotType(WrenVM* vm, int slot); + +// Reads a boolean value from [slot]. +// +// It is an error to call this if the slot does not contain a boolean value. +WREN_API bool wrenGetSlotBool(WrenVM* vm, int slot); + +// Reads a byte array from [slot]. +// +// The memory for the returned string is owned by Wren. You can inspect it +// while in your foreign method, but cannot keep a pointer to it after the +// function returns, since the garbage collector may reclaim it. +// +// Returns a pointer to the first byte of the array and fill [length] with the +// number of bytes in the array. +// +// It is an error to call this if the slot does not contain a string. +WREN_API const char* wrenGetSlotBytes(WrenVM* vm, int slot, int* length); + +// Reads a number from [slot]. +// +// It is an error to call this if the slot does not contain a number. +WREN_API double wrenGetSlotDouble(WrenVM* vm, int slot); + +// Reads a foreign object from [slot] and returns a pointer to the foreign data +// stored with it. +// +// It is an error to call this if the slot does not contain an instance of a +// foreign class. +WREN_API void* wrenGetSlotForeign(WrenVM* vm, int slot); + +// Reads a string from [slot]. +// +// The memory for the returned string is owned by Wren. You can inspect it +// while in your foreign method, but cannot keep a pointer to it after the +// function returns, since the garbage collector may reclaim it. +// +// It is an error to call this if the slot does not contain a string. +WREN_API const char* wrenGetSlotString(WrenVM* vm, int slot); + +// Creates a handle for the value stored in [slot]. +// +// This will prevent the object that is referred to from being garbage collected +// until the handle is released by calling [wrenReleaseHandle()]. +WREN_API WrenHandle* wrenGetSlotHandle(WrenVM* vm, int slot); + +// Stores the boolean [value] in [slot]. +WREN_API void wrenSetSlotBool(WrenVM* vm, int slot, bool value); + +// Stores the array [length] of [bytes] in [slot]. +// +// The bytes are copied to a new string within Wren's heap, so you can free +// memory used by them after this is called. +WREN_API void wrenSetSlotBytes(WrenVM* vm, int slot, const char* bytes, size_t length); + +// Stores the numeric [value] in [slot]. +WREN_API void wrenSetSlotDouble(WrenVM* vm, int slot, double value); + +// Creates a new instance of the foreign class stored in [classSlot] with [size] +// bytes of raw storage and places the resulting object in [slot]. +// +// This does not invoke the foreign class's constructor on the new instance. If +// you need that to happen, call the constructor from Wren, which will then +// call the allocator foreign method. In there, call this to create the object +// and then the constructor will be invoked when the allocator returns. +// +// Returns a pointer to the foreign object's data. +WREN_API void* wrenSetSlotNewForeign(WrenVM* vm, int slot, int classSlot, size_t size); + +// Stores a new empty list in [slot]. +WREN_API void wrenSetSlotNewList(WrenVM* vm, int slot); + +// Stores a new empty map in [slot]. +WREN_API void wrenSetSlotNewMap(WrenVM* vm, int slot); + +// Stores null in [slot]. +WREN_API void wrenSetSlotNull(WrenVM* vm, int slot); + +// Stores the string [text] in [slot]. +// +// The [text] is copied to a new string within Wren's heap, so you can free +// memory used by it after this is called. The length is calculated using +// [strlen()]. If the string may contain any null bytes in the middle, then you +// should use [wrenSetSlotBytes()] instead. +WREN_API void wrenSetSlotString(WrenVM* vm, int slot, const char* text); + +// Stores the value captured in [handle] in [slot]. +// +// This does not release the handle for the value. +WREN_API void wrenSetSlotHandle(WrenVM* vm, int slot, WrenHandle* handle); + +// Returns the number of elements in the list stored in [slot]. +WREN_API int wrenGetListCount(WrenVM* vm, int slot); + +// Reads element [index] from the list in [listSlot] and stores it in +// [elementSlot]. +WREN_API void wrenGetListElement(WrenVM* vm, int listSlot, int index, int elementSlot); + +// Sets the value stored at [index] in the list at [listSlot], +// to the value from [elementSlot]. +WREN_API void wrenSetListElement(WrenVM* vm, int listSlot, int index, int elementSlot); + +// Takes the value stored at [elementSlot] and inserts it into the list stored +// at [listSlot] at [index]. +// +// As in Wren, negative indexes can be used to insert from the end. To append +// an element, use `-1` for the index. +WREN_API void wrenInsertInList(WrenVM* vm, int listSlot, int index, int elementSlot); + +// Returns the number of entries in the map stored in [slot]. +WREN_API int wrenGetMapCount(WrenVM* vm, int slot); + +// Returns true if the key in [keySlot] is found in the map placed in [mapSlot]. +WREN_API bool wrenGetMapContainsKey(WrenVM* vm, int mapSlot, int keySlot); + +// Retrieves a value with the key in [keySlot] from the map in [mapSlot] and +// stores it in [valueSlot]. +WREN_API void wrenGetMapValue(WrenVM* vm, int mapSlot, int keySlot, int valueSlot); + +// Takes the value stored at [valueSlot] and inserts it into the map stored +// at [mapSlot] with key [keySlot]. +WREN_API void wrenSetMapValue(WrenVM* vm, int mapSlot, int keySlot, int valueSlot); + +// Removes a value from the map in [mapSlot], with the key from [keySlot], +// and place it in [removedValueSlot]. If not found, [removedValueSlot] is +// set to null, the same behaviour as the Wren Map API. +WREN_API void wrenRemoveMapValue(WrenVM* vm, int mapSlot, int keySlot, + int removedValueSlot); + +// Looks up the top level variable with [name] in resolved [module] and stores +// it in [slot]. +WREN_API void wrenGetVariable(WrenVM* vm, const char* module, const char* name, + int slot); + +// Looks up the top level variable with [name] in resolved [module], +// returns false if not found. The module must be imported at the time, +// use wrenHasModule to ensure that before calling. +WREN_API bool wrenHasVariable(WrenVM* vm, const char* module, const char* name); + +// Returns true if [module] has been imported/resolved before, false if not. +WREN_API bool wrenHasModule(WrenVM* vm, const char* module); + +// Sets the current fiber to be aborted, and uses the value in [slot] as the +// runtime error object. +WREN_API void wrenAbortFiber(WrenVM* vm, int slot); + +// Returns the user data associated with the WrenVM. +WREN_API void* wrenGetUserData(WrenVM* vm); + +// Sets user data associated with the WrenVM. +WREN_API void wrenSetUserData(WrenVM* vm, void* userData); + +#endif