From b9a58934a94ac0181a73fa9a8d19d36091bdc8c1 Mon Sep 17 00:00:00 2001 From: meilier Date: Thu, 18 Aug 2022 16:49:25 +0800 Subject: [PATCH] =?UTF-8?q?WasmEngine=20=E7=94=A8=E6=88=B7=E6=8C=87?= =?UTF-8?q?=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WasmEngine/figures/WasmEngine-arch.png | Bin 0 -> 58081 bytes docs/en/docs/WasmEngine/figures/icon-note.gif | Bin 0 -> 394 bytes .../WasmEngine/installation-and-deployment.md | 324 +++++++++++++++++ docs/en/docs/WasmEngine/overview.md | 3 + docs/en/menu/index.md | 4 +- .../WasmEngine/figures/WasmEngine-arch.png | Bin 0 -> 58081 bytes docs/zh/docs/WasmEngine/figures/icon-note.gif | Bin 0 -> 394 bytes docs/zh/docs/WasmEngine/overview.md | 3 + ...05\344\270\216\351\203\250\347\275\262.md" | 330 ++++++++++++++++++ docs/zh/menu/index.md | 2 + 10 files changed, 665 insertions(+), 1 deletion(-) create mode 100644 docs/en/docs/WasmEngine/figures/WasmEngine-arch.png create mode 100644 docs/en/docs/WasmEngine/figures/icon-note.gif create mode 100644 docs/en/docs/WasmEngine/installation-and-deployment.md create mode 100644 docs/en/docs/WasmEngine/overview.md create mode 100644 docs/zh/docs/WasmEngine/figures/WasmEngine-arch.png create mode 100644 docs/zh/docs/WasmEngine/figures/icon-note.gif create mode 100644 docs/zh/docs/WasmEngine/overview.md create mode 100644 "docs/zh/docs/WasmEngine/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" diff --git a/docs/en/docs/WasmEngine/figures/WasmEngine-arch.png b/docs/en/docs/WasmEngine/figures/WasmEngine-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..e29f5a6efe84c2254f3679c300e07ad3cfdda0db GIT binary patch literal 58081 zcmZs?2|Uza^goQ0tq^UZ$eMkOWk&YhSO&w)*fSVopE0&Ema?|Vz9gigBzwt{ol2G{ zTSS&@k*y?Td+zl8{r>;w^}L>!q0ijUz2~0uzUQ8E?meel=17ARtmj$j=;%%$40Ta- zbPP!Fo56exv@|Q6siC7|a|zJ14)CG4d3fXLMC5h;dlG>{+=>1HBJ#Q-P^g|a-X(xc z^aYQg-G}Jv;pTyN{qG$V0)ym7KhYyp}u+{DDGb;83{jfBkU;yzl=IG9^+y zyuEQEP<=%i2q1MC>*4E44E6_)NGtG14g#9xwZRj3p``HNBSlF;9JFYWNZxoX-r3kA zfHqzpCL^x|nlBq0TA7-NKy|>gw}%%V{9}N3@gmZOxRPVMoyl_%Kw#7A0{IwqX3#Lac(%W$Ny_G8UcI&j_{x4@)%zqUDF^h zALBq5TijKuk`~PJKZ%3zWPc9;*FW(7cWT<;fDjV?zgAa#kcSK4gVss{2>Jg{XIhKA z9#{rf4;+Dv^8v3t{s(Di4{tqRXDrkNVH2zkzlwGD(E9ZFNdG1i(SwO->Cip^ zOzGf}X5mY)33j(IgL;`68U)%{A&kff3$Fm68QK9D4}X0k(i{Vxz2pOJ z;ek}7nFYnvKu1B_hhU(qXJ+V)AOIq0Un6VF5O*}e3ypWTBwJy8wNRiLZ|RIww1yZF zNQw{_ZyS=2w+qVK+uFbwWfV*_3qgP`=2UYN`2br|ps$Ow8Ah$w;|+1pqibg;q(`xukJT-rVX6bQ;%(G~AQvh?$G z(bW$&G|+}w7+Y)kxEMHVDHB}fe6VnDWPpvKr-yBbA{D3L53zQ!a-k|2>F6jMWAwD} z`XOc}NWcLGjRx@QLrqZ_Jp+9r+7@a=(`ppL&;xCW1L$CoAzIc%q#kIr@+T`glhMkG zCfZne2-?@x+z0LzfcHWB>bQBEd%*o+y1FoB4>JUfU0;+B4f9|>@JG?wBM5DUaUq(U z!xT}z77$ZCVo->oxeo^I?G5^(b?_E2Dn5kdqNt?}mA67^xdtgAeG$rrHX&FXO>r?O zjJ2t+vZB7ctDBcL)=kb7i_j&yC{bOVl@Xp)x1eCHKrMVQ8e-(_uSdpelhJ`jfUu67 zf;Yq~(8bil$2dSQ04%OPo{Ui+em~Hzs=#;b4@dQn0I;g*?SjACC3Hk>tHG1|+h%BE-f5sq5`*Y-yl~AQ2!Y zSa-6ku_@k{W^4b|VDKC`6h#Udu4`>bv2}w3W1$}u zq-af*w+&YIBAQ|?$<_pac{z%?Ry4-KyuIaMF6QRmw7p=VXY6ebS0s~2U{7oNxVvKE zL8bv-;Ehe7ktYH|&_e2&85=p{wSzHM@<S-q@E{@4L>U~CcxZ^jFW=~JDX8G;mQy_U1bkTA{Iq7BI?n$pu3Hd zkvrVaLWx9hg?hUydIb_-?m@KeKr-=ngUex2NK=%T8v*X^p`Zi<%@ln_XGJ%nGei%9 zMY|ZgQRR`kfkdC+K$IE9NKamYAm`=oh6mIvycLzS-AvqrU@&6^n-D6_S%-?W@b^p~T6bwUn1=tXj1C(vi$~49D#>hb|wa_>V6ojB>N`xu6+Q3LYx+D(@0cIel zWlgp5G?R1p_X|eRmIPx4@ue9+D=(bCpOzL1L)A0URVH}q*^qUqzO>zmGxyOYT6miK zQ1wDEHWXvLzJ-r%Kp>e24Gtk1gqV8h;Y@?b&PEE>!NCFkfoNSLpmP?+5G^GWb3=%h zs}TeqLQ&8~`gu5$Onq#8e7r1C&iZIqw2!q}kT*5ZR#8h2fyG*fU=;LlR4c5vwK>Jg zO%a2!wRC~O5D>JtJ`AR%1@}_M8Y%d|j4|d|f_Z?xCBztkv+yy4*aY~w0XB_D1S~25 zqade4^zt>-bwvidyXj*U72xi{CeBztV`GRn0cHkOw)HfETe-neWMvzSHDJWeUC)zX zY6zh4BO+1CN)$J1Wo;zE&DaYAH4K8vg-~_pb4Cf2y%5G>Z$0Q5mQ8!P!KYsneHAXeUbMkF-SMJJe~ zhsR+J+_4_IJ~~QN9jX%53Z`rh!F!OrbgcAjAUJ;$A0>TvZCfktpkRWot|gMFXz3$o zPDLA00=2v$LEdsmZIXqL4Mxs@WE|}3B9C-O`&t_j`I zgy`vc8^~dhUal}NoEKFYPXc3f+!f_@Jq#hpfFLM^U_&#-D3UXk7H4UD8p5bn9v=GM zekih;t(Ci{POzt|yQv=9P#5Ax2J9&ilwEDHif&LHB@?I)jA-hKF|i`p(o8nNgCy_c zPXSNn5IJoHg+OahR~<{Vl9mnHmSBm*V_ghvD1N#jx(IoH%OJQJ0_O*KQo?9c-Cb?G zf(SlAP(^&8FN_MNamBhhD+8Nq=H_i8=VIs&LnsEClI8tj+FnQtsIsT6qOz~E0ouw0 zud7dlVf_5T7_v7}$yHa!h9sxtY7pYC4>!lcjIaTw&NimLSYJIePd}(DNioD6Kov_AiP9 z-~T6`meR6QD!rYFSYnmvfl{tn_%}ntwA~s`{vM^RnqtUO|aJj+(8ktjxD> zGej}43ckJl__6a*Ugy@R0|~)r4<9p2m=vu=kd!XD*-F!H%nc}r2!e&N||*1~w7 zNu&8*evz$@uUXH=u_V#4FeYfCJS7o6l&6F4REsIrlLg8I?|oZnuuRH$&j~GC?K5{6 z4O`eF3zkYnUg2OxpJu~UTBX}5(mCvF2YUUV8)c6whg!8+e5y>z`C`qL;%OA%{a81| zL0Dgyo@_OHTK=%o7p4rNZr5s%K6y<}e@;7b24Lr!?G- z-TOcrpOJ>T>Z$Nuxad_P_pQhFziN-3i)4(7X_@~0Dy1?s3rt*O#Mo`wI72*<(!bMu zE_Ap-yh33bQ8sMuIk+Y~)c<9>S)eBwhzVmfG8XYaoJ^_o%9?ds!FUXNMq~|o_`ft* z43)|WD!(stqgvKHYtSbmVbGiM!hi<~VM)>?alapFwEyFsQ_jkg8WhbQ9bMm&ZvNUq z@~QY)M%7K*2V#m#c~&fS5CoS%q~=L@t$)$-*9LR^)keSIqDkL}D~~C{IsKpeGWL1r z4Xv!=6|NkdFS511E1Ew14Bmg-2C`_9DcxJSEDLQ{Gtnei26|(SS$xWswy%RMi)v}@5Z{7P>uN0vg zvzRJ*(f~h$%&z?70%MheTLG_;xdahNoR>uwui*Oht-)W%g{mvr1j0!DkTzRfD zwq0*ISTPn3|B;wtT^g&P;X*z)_&)Ho(&6uivlk|WJxuEnEAI+p!^3T~xCH2vf0y3D zAO6V`se4!1|GVm^Z}JEia&+-p*Plr-V|(q}RabV{Yi>d50O;GCBelzD@%JB+^u^fI z)2M}UW^YXtJHKocFK@ftej_%Nl#zQZ#z)OY4v6@RQAsKs!MgFXz;A)+iRTvPpAJ|K}1SY&p_0#*JFPsQ z_I@m*hh3jRSm4F<)*|X&rnq!pj^Ix;Z`_5HsO8)jexJ;58JnbIa#x7P>?)ikoGiMK z$jxTc)W=am{Y%RpT$xs5;w&|1#NaXQa;oA_9x42wxG)OghY$i}7H>O6y9B;35~j$D z(rC|MW))6@Kjle2#$rb4OQuf{Dxr2M?d%Max(p|gPTg16jC_ZYa{}xJeuPB3>EDyr z`%QfM=5!c@IYStO_S6hsuzQ1b_$n(NsB+`N^^(Ts?u0orBcoDG|Myz2wz3GoThjGV z26)8Lj*8lB0TjHB(8(#x`IGT-j$jiTCml0(p+%%PXS8ViVk4h1LLos%^$b3G)n zzQwp?fxV!5NppIZMLJG|o{NOI-gfIk3{c^57IS!PDBH^j;VA=#Q^<&z4<*35GH73K z6BiiC5@(4K1Kg~8V~1}u8cu0|9?K_ydZ-HlQu1jgHvt7hK;fuIdxf}(JIRTT*L2gD2(||8= z)v@$fg7jS5iFC2tp+^8(eSp-?aS?9N$czFMw7x*3&alJ?0?y366*IDcx#9-R4?a3u zgNZW%6C+wch_+n1Sj*ZP$PWXC2mslv!AK7fLO=k#XNbzpO3|dy!08LZmx9g*K%zGj znhe5I@_>}OPG<~*$<$bEbJy4Qyd=A_W~)_x@|`zt-)4w^+KX-OOtqX$X}2+O{X1yU z|LCh+hKP)`bb68OhZKkUt!_nZj!YboBWAbbq-YvKp@ldnIe)sRdltG&lWT*Q!>D=J%Er!xamF9qAnT3A>( zJ~_Rbd^xABF}AVfs+QIxSNuZSom`Zn4J#{~h(_~Ad>8XsetxXz@ncCg{NX~;aV9A< zV^vA8tLG&cl+uk_( z!e{p)dOMmY>(`&%!_=>#f4WOy4wpJE4h&ipy?p(kfRXEBe17x|br$LgtvD*-k!NSy%_fXQBMiEd0}?GGwtj|`dZVWY40-maePC$nX+8wy>qf+L2wKg z*SF|;dda$gQ^@q=BN98Z%{EfS!`@XrJp9`eYBFimKrggyXZ6a6kiYs>0Szff8D-@V ziM(T*1GB&G^racgEM63tLD`^xJ3CHJv*P zIZM#HuLC_ZPGa1qW2nEEb|3D&BInv+W(+t`Axl~_jU3IGmsMvARj1w`i8k%{Q;L6A z?>~2^{7ky>OT-NI*PHw;!@EmEAS$4Iix?!_R$n$uVds_j=jH&&y zg)zq0v1zaF8^1`E=-mra9PIT&9%ndBfPR}>^Bhz=-uA#3zP*|1W39#cZ z{^{zr;z4}%ZQ0}eH0Oghak^6X2%EclEq4?`-_1f_p1ped)bmTw-TyeEVFA zV$-RhnADJ`u3FM|g zF+ObLt89W))l}rr+!AkGX65S{n2D#x{xn66ukL@ug`bb;`(Q*FDzOMkA)G?O zHeVO?yqIYE9UVo~U9lY!5q&1VkAlP0b6g!ZQ^ z(49pXejp?Fd6=w*icwkPUsanw3zJaKafLbK3fDy=k1w@Nd;`xb1AdTGpt+xmEsMv! z2Us5{y>fXN2al@zJ3o>6>>;G?GorXixA+Y5b;SLnv8lTKHnGX)(Av zT_Ssvx27|v?`&6sL+D)WBER82_0`Zey&V0uXKQDrQ!Q0$EHS%PUlh|?t}7x672R|- z6o;du(|Kdi&5(pjPQ_~_+Xg$A!hddB+<}*T&ySmYo-z1qgKZEs_RQdE(IirRk&>nG zM`kesL%5ZYfH`zKh3qYf;G}T#H_3m?oUv~#JcXn`_cp$*GuP%z=G$oTu#b(YRw>qx z&kvRx@GLYh3n{1EOPac;#j}4ahoulBeZIS$J3(elD+x#XLH1+{S-X3Si2b`+;>f|doxN)stb2K@e5BI*k+|!T0@VG|KG!zxa`8K-9JdMl{4#}k{f_B9<1?m6+k&9I1B+~P4_n@8}RtFsjxoRhmPlpot| ze{pm5u)gHx74Om4b~X=^hzs0_*qPR+A5>;z*gK3+-z@I*g)HPe)=kPaxYMi_%JKeH zO?+DO;b=*QjNEE#*HKvXk22+}PfEj|Kx~@6H^_7abC>b0^&I3$^qu(ZD4bohn!;k% zAj2Pij(M~?B| zOI)~iSiJZ1vj&5tS*E2*7w}LrSbK7YOX+Tw$6Dt{rov|d4;}>Mjl;H&71oRXewbgX zG8Vjye*FIXOibqMAB$q|Pt@Ga$h+q7sQ)e7{`Pk0>>s=G<7*=4l^11Rky6I1Pe}?3}2JxJRP`S%F4KrsvE33XkSWl~!X$efVsuWDh z!7u*6%jI8&%1(NCm0KivDCtkTZq{c#l3P*P-Aaqp5moMruJ}^!*){v<*N45Ud~J&_ z?)0V|1glB#hyQiR5?;7=@K}L3Y<`OaYZefYW@Tn-F*7!pIgyFWe_+viw~b|Z_0!g* zs5rX#ncwDtT%W{`zaJW9(YQ@(Cd@)^`19j@Pz&|lUrYwoX9F}$rBBN?GwXN)>J3Yh~PiiU(F#J z>D}D*V-Pm4v8Sqfl({tCEOiRG$`h-@JoAF*U5rv` zcKS*E5BC+!Rh%|eqB}WC;FNgv9JlV%Iprt&x;_tNxxAEbHqR$fT?aLJR6Je_UEBVt z`F>?ISo5ix8cI6P;|{l!D)GZ#)YQfiHtvk}D%pYeH}d>{@RfB(sh3Etx=p+O zE+!B0SG|A37|`;Sy8suh@JiTyAyTh7WZ>AZ#mvcWf3xxOz2f-elT>_zeUJrK z%*nTVz_25}R@pLWNLV*P{+#FE*!C^tn?6U|3#Ch49gAtbKIwtS#?<}(FlDqk4QVmO z;b$N0=2=~6T)Ugu&1RNp?ls1Lty+_vfS3Hi<)-YZB!8e6viK@7Eo7&3aV8!9;!6`N z{m{a@?!gy4$5i&eYZ=%DLqa22MpnzN^q5fXM;%sqex`AGV>ogIE~P+jItf%$1^!l~ z`h0${Pu?%hpZz?E74O)&!GBI*C6Oosn>?s^0dL%2qTp?!4dvOyq???w+Lt*FOzuSn zUYV|i+J)dE+k+-L^0E*MB-u$eRx#PuSZjqDu57;$V>Y3^t80|E_afz^D#m)@JCMRi z>BHW=LWPTxH++Sz!i`#(XJK|zn+ax!4{{w7p z@i-qTo~|TF5>twu8$LiQdhONRF+V%sk(W_?t4IbW<$8`+E<|Y;jw8r3^4MSgEzGNu z@Cg%CLcKKX6OOTG70Y{6m6ueUd#U$|WX6+qLAA|sm9G2Wdj8V0aYzYMB8kle=ejIj zKIUn2wS!7*_s!D{IhLZ6V%Vz@NS6IUhhc~$4x?jcC)Sd)owX88`2+kbw;xYNciG0`EH_mncbkH-^ zpUWmYOJjNIuUI(v#QlViuqQ?nj|9DFsXP@mwC7I$^n&zC4P`c_fOI>)S}EeXoZGaw zAi)^NiOE)4lX@9&Be*C13EwFP8_J4xUXJvU^O;PaC$!;xN z{N+NAOJU=1eMr)ikT(8tr^*2d8Hg_UkNu4K?JY*AB|dG=3efjXl#=`LM$9gxkB0uO=|M zufoDF3rMV;ZX3@(>T8Itg!%lA{M5{Q^hWy2+TxzloHwOyy!&}Q*;jt|^JK7XLLbVM z4?**T*n>rKdg>opJZ*a{82HqFMt?KyElam+#jKMF2zL7 zFIq_|Fi^g8`?l-mWOf?*0+V@LU@PTuZ91t9zO!&UuxpET!K~Gpy}RMG$_#w#AUk#N zUTNRg7XvJNby=Or5Qft<3p2a24fhyOay+#Rjh1E4DaJ{+res|_4k>OmS!*|&FU~x% z5T&_YGFD-#jGFNq8m-hh^5c*7aC@{3N7=a+wrlvcM|0oL#d7EHRz`5Jopo$$*khP` z__e@7Eo*aLxHXc6yhKVUL0 zgKTO;mfo>`$i;ib9p)=*v%W>_E+RR#mE#0eIQBCKlkK-Ezxe1ciEPH+YuEPfa*16& z8w8yhKDt~G`sc09(z$cY!h8hC?o5cMc4k`IGhg}Z&B;3z4wBOaW}-LPq9Q7yAffZF zBClFHhPf8b&AIf2B`-H(44q z$1`oczv}B@*712J*T&UJo4}VizOp^A(^|>bRM@;%jk0OpWLfAvKd@XupF?|%8EKFu7ZE7%}cTiq~~|GOs|9~kZXqbSI6i$?)7 zOdOGsH48VFuE*7Uo%{T?@J*kN(BI-2r=COrFA)o|TW){uGWP6vZ0ZTaCU$27_+tK% zb*^5j%VS&pvD%OuU-m1$FKFe%8<|KXR^Lf6zCP_gIE9NKjuK&Hm{No1wpVj|Zm|d-gm>7t0TB znTEjw49Vy-2YY9XykM_lt5%*htAaXw@5SWQ&m~S%AGtQ)hNBuX>GP(%8Fj_Il=zm| zh1^xRXY2FElAhtqXEU_?YDL|g=b3Jdsr~$(WYl=@?sK^0$HhsRuUOQKg)5OYRY<#Q}t1#4t?y`(Irl8j=~yKtsH)Zc%@b$#V?QFnwK{o8vik{V$U zxrw&CQ}t^Vd&fRA)vYP*J=0Td!N1S*L!$$^iSpWH* zt_L-xd$*PG=~eI4p$q5uuZ6dq4;s{}X!(8n4#jV$zye;EUAg#D-6_58Z89g(mIUWU z!V~DkqBY>FN7K);Q$opYoPp@;JCW{DE`q}wI7IYYBYvZz_NB}Vg}*&d-nint??^;f zUjbwG?w5-~=7~+OH76O_*?6|qAywsJdpp6NizkseQ}GUWtqWcRhvZE%TMbb}gqk;d3jm=niC&+D1MSraqYp zpA)K>`E%R2zO#g**&_H&Yb7t!zH{A))Q-y9zq4h$b7i>1?%PAWeBFWi(~KHoCjA1| z>-?hkM@CX|bA<>FVfE)VaGOlnZSCpzS&NniY^y78@}>39ja_;%)#MbY#=2KJ5w`0e zSad~~>z!>*apBsej&j8n+^g)-bpKk7Ra9wJ?^1h=cupAefG;X2hWkyM{J=yYUmu4> zO!OD0OKmJKY~inbhYEW3{UMJMYHJdypCD{dRx#`6koMNYyBx=2$B2!#$2NZyCCIlJ z7xnS)d}}8>aj74ME+wBGREn5EU0~$mlc|hur^M2kd>pa3aUlS*BB%zh%UAz9)$L)X z0dCyJ(LRYo^@HXMnU06=i-;L7>z67d_4q{>N=}djE*yKETffyAA3QH%5%c1@P_JL4 zX4@2#29xzD=`;5+nR`PPus!wl>WfhhA|prN=LQZJi03RPFdRSI!&tGqJdtcB=@;ED zDmSdEO!undor)emvtw^ z373na&;Je|jsMB1Tk-ztwK4a(A2Bo5RnfJ6-qqb^{PJ|&XWqg2;3dJ5c297s7W-M9 z?QmSxb=_&#nysUk`Fcu7qE)Y#KUoVib2cmov0om*ot*T%qZZ`e(#dj@*_>5iRIO-!iMIU%v7zFsxsD6*%*$n5CaBRJi%+Oxpi zAvjfFH*>y0e%f_n-+9QY0`>LNn(eFk#Pxa0uF{~PY37?pHTKGM^Cv>yhvwKfGlTnr z^Ou1aWzlSKYP%r^03tObri{^MU7gao)v8O19EN>xj2rL zrvFnn4ZX45s&#*0a@+c;DUVI>Py3E1B=ThX<(zT(+qIk&58O9&#IesgvasL0`Kvxr z8vWaH(SskxIgzreirNu&)was=+Lx#8MH>Rv!q;Cl{QTCw^qW{9@BUu6Rm-Qs^U?|F zxZg?+GedOe9#+V6Cfu=(hN-(vSB0)cywat7H_sSTit=B0hN~&s&4UQw#Mm+v?|vTs zE_tcvGpkbuv*b|ER#Vd1yb#UYtv4O_X}A3PwOlQ=H#;xxA?}`incp~5`EKrgGsc?xG5PV&3Wr|Fq@$b65t(h`R<>Pz zb1^K+vKm)yUPA<0tm4nIBz|H&CVAFTdq4Z4?r*y50aIo%7o;)KQ4z@}`@R}KUn?2t z_O*Vw^*i!3%aO`j1vPH2t{xq{%F`) zN|uFD4rCw%eEH7Y1sMo2kX8tbO1=ehG1q}eyYwJuQ_Bq!3|nX1_6=JS!RtNdY#WfX zVT=KJ3C#+5OD<+JKx=xmtmHIHQp+`3-hvmTBEs}R)`xI83nYp(lV~Z5{y1Evp};9x zrpCFrvIpc}9)OI=ub4CKDReBgAhq#^T^r<|RsjK!AF$EjS{I^c71L;Q!+@^zAnS9A zbGavtu`LzMOR1Lh(qj-_=LbFh90Tc+ypw$Hs3gOx5@AU!Rob*nKFAVvUW!{Sm{Xpo50kn}kRGVIzQF=TnU`h2$u$i=V#F3sHK zqyQ7ffT3jpz``^V&4JbnW3!3zYC)cw` zU7gzo)iNR0DX8;CFB4!Xa)3ETu90fbYCh#E^!*%F+vkI;oI#8U%U3UrWgycehO&)P zgBt&Dvd->+iY31cG8!0oXH359lB<7{R+Wa-U_-UDn&VQScVAFMO#kV|Sb<3Z$*P|2LN^azzP|pmt4vWU$*l`C8M8q=;T! z|I%zES7y@r>P^?TK!dut-}fmCWM?$XRI&`s-CG@S5F~r~X)l93Jc3s9@GsZIPyT;X(mo$v{@IgIIk+eI6QNjuFQmuW znPK7?4IipTo-n?e(zYk%F}|Z!bU#S@tu)e*p8Xr?RQcE1I|Yg>Myp^QPii_H{t-!O z+B86v3~S%dlT%*yYS<}c5?NapMRS`t4 zPg~G{y(G=2+0=YdQJq#$@G`x=YDWd|$;=HWyWepNEu$`|+)a8OcqNwPvwT`DbP_t+ zw9In47E%ABz-ZI$k0A6E=xxaLUcFYUx;)GOcdiCL-l}M5!bi=UO{^fTDWZCL5@G;~ zTnbLUvAjF)EAK=H5}O}|NW%Wv%hvJ+Mz`4tFdN-ZklESVkuk~aH|;6uU19}}5TIcgH^&%RqDkUml@2t}aL7MCBXdNLgorElhL>8uga z3qd7?nv>brl2X2DqvQThoeYWFaK7xVXO3i#Dc1Y3%QxXVTcKME@P(~|uH%RnUIuDT zcLzMP&cVp|wiWbe=jI?BTiUc>AQd8=6L1t-9S&mhF14!O>??A}>&zwg!J1!c=5bHy z+xXK)MW0ls48{>8jJfk(Fgk^Fjn^5HSK^A9Z>@T0a8dkZtx6w!LM~HRuU)#Gx$nlE{`}y{4e`DxYSMP(xR9fN5 z$CI@Oe}6nd=3apYE?J?gwW5z9e0|G$a+Kx2cXcrwWdcTh%Ke6s?AwG3DuX3Uonm=u zj*SN@#oyXFG}0dF+<4A|NflKsf7;I*#RGf_jn(2i(u__KrmXogtK;&`1ue8%akDy@v*QiVC&0f22RC@99`Z;G)@ zaq938uF^$#i_K)S>$Kdww;i z>h@Ih3+krl4p1`#dwge^-yMGKAgu0Jmt^|L(nzJt zy?)#)8mZ)#q)R%klTG1JuVJag=hs$VeKwkTcNgE4CVug)%hW#~9k*g@ZT(D_yXRx@ zWOz-7V%W}H=Fvl3p+mX^S~a1M`5(;QjE+*5-xohv#Qx9ZL?@ikS+Rv{l3RH$RiX%I-?o zJOx!jnhfd4sbM=J`oLtM&}_@Yv38QXsestD^VDnr@BBy$V5RV-6EDue2Y>jc|CvR8 zfmxoqdikg2(U_~TK&pUY>wAR$Nwo?Cd-EdSN8tWdI$ft%Ue;h zP21Wwu@W1t`wwVVf_$dq(fu&NXb`k9*KAaI3@~CDoLHpg7h^uihCowWXaTR(wQ~PF81VrY zWMswdRdiWZRh7vXmyU$M?6Vm&Q|sk!A9un6SfEQ^ zNDof&j`=0>DSyL!A33prm^l7#QCjusqL?v4Ds7#}TBla!#$`CXX)0M3-ru_aMRcIBmKU$6-VB%f`D506cF*Ir*9rM zqpfqnFj}@XCWf)ItBWj|vmD3PbpC}dO$w(xP=pnZId1a+EFa@<*7~UTzO~Gn?<7DN z6+=7RKz!{rtnRjTawHwejdjp+h1oy+(Y{Ah#fO44?z9vA#B&56a*UkT4Qkh;gJMAG zs6af+$Y~_lVVU2)IcrhWg&zWQr>A+fLh|Nv+#NdC5<%cP&e2XrGw(KahQP6iPWhwF zKMF@*tM}y5_Ob-1KPwXaeGVMy82(=WH!-7t%V{ui+r8^wMd0<*ZRbuGyU}(J!|S6m zbiF-2rDjL{k08d;}N{`V;@H0sVVxJun_3`rr6>&#V5~Uf9RPX$HyO!)ax8_f!VvFTuW)7 z#Quj-EeWT#eDdMj&WnXf?D&5Y_d~2Hfa9BD|8e|NQ|LHttHQQ(gD1p&zEt@QKCG%5 z{MENLd9B$MkFR?LfBW`rXABFsu#ytyiHk|!_Lgb3Qs>J)^&dftvN4}td$o-@Z*w>)l&Gq>9#^M%Fg77*lQGJOdvW2?RoS{aTY` zpT=RsIJsL|OFQ~4aIl~>cEC)-!P(h)_V15!S^10iI}G;r|BMl_xUXvE4Zm&=_@NKi z!FRB)lWF12YRb$SP7`QK4DU}`1k$IzYXS`Ra*b`ywS%4hQaf14_eVGOGQ{LTeW3t- zJ!7xxhDqJtuWp+C4a&E=Y%lO`n)UR(WJwdClx@sMvRhgrkBDe!Ty^WYXR&y+ZYDux z_I*4lMRRxf8bD%0!-yJ^MPbg%hU(q&vm>Gj4NxCee6pqA}bt zA53ijck@S~8@hwfKfZ5(5cSWLc`*Q+{|4u1E~ z%CG4g{C^c>P0W7`mr7a|A~!u=n@B0p+>E};sDwy$n>z3i!1k9re#P)%BP)y>b}vd6!m_w$xLFwMA;Kg!C=OGi8CiE!9rE z04J5C`HY(aKsayk}&<>KCtldmg|o6w4TC0;ncWfgfa-;*T- zuj*gj_)*^coI+As`|_&ztNU>S8ZcUBblu*-$fT_`?e^xsaCSMa^fjJeVl=hpwRV7=}VWio|@(P7JH7I zdr6#B&rVQU~;cgz~8%vf-aG8{C)q5XPKT~@4JK1o*$72=8|E4^szBCI8d?sU(j!z zS8>M%jY6SfIB|-=_z7mUz$U|lK0Ah%a_O&()yPIOw6XS1(M-V$lb@I9!ChD(^CCxu zC{CcobfS^ENgg~u<}WuB<^H@xC0CG9t{4GKvNI#;`kg)|IH^2#bvLJ;yCy( zIx9N+?E^p4$)6T2%(0wS|NZfuL4i+2mSUp~AuplW=JhtV^oTo@BmpNmnsT{U2mW2RasMwOaf;ZfLOALfRK<5OX2vq{SIKbz#?Bi zIX*ftSVzEfCGNwMQ3JA6^ef*_R;cF~@vSip-kO_ezBrBB5~sHJ_6D36LpSbvPjY(5 z{+4XI`e-AfvhiToJEo0tv)>KBoY|k^tPHGBSJ;O3lRZBEFqk^rrAS5J>Tvg>j6=2a z-6tgK+@fE9oy(5Ty(4i6r;FjoubmRw;hSqYXgP4=vmW86{cNk9h+WHnS@}GNH12F;Bot#1`VwLKAPuFetg_JD%^+jqus=v$fv%P0MPu;$J~Rl zwz#bS<9}9@<}-k%0}tyf-Szi>2+*-uod*aT>2$}?qM3i6w!2`VYF}Oc@egJiEkNk; zgPcG5i?8q6;YV`Ar4uhctIEj&S0w+-2_p-AIA7$-5y;nEJ5J$E=YKlzAHkLd#^2L9 ztG|cfC+bFqz)Fj>6qn#_e+@!c8 z5)%_M9UG}dqw}3!*zyMhP?`yxTU)N1zwb4B&n2N~@XV1l za766}ZdkhT0rhzU@V@B}2v0CKZ-Hw8IQY*8Z+f*DF6q*>9drJ^yVjg3((uCZuW&~!P3@frf%Br$p*0X=Dr3`rrW;q?9@2i%a7smP5s>GRo*DN z|94aJED;1IMgc1mjduITKE;J4sQs}nER6~CeZ44J*evVVVBHI!i8u0@>*+CBoNR6m z1IN>haY;pgQE)9fg$0&8;_ZhX!-vj{PAt@^NT%5=!h__rv{NDxNR<_Z^viF0-rVAz zdvxO>*%j(PZ&EjxVaM03@$0=%)S?&!>!X4Ew2fdSNC}%uTM)}{(jkygY1?zxM#=jOeM=)YatRI!Atz)4wPZqD;FdG1uFy)L~F{~LIPO+mE zxMs^xNX+ZnCl6!#)mPSOsTC16iNCn69 z%Z?;YrXRp6i}M9fgcRCh-V)z)4_AVi=JM5w@88{-pxYtgAX@u1pG}mQETvsiK7i9zV*g_{P}-{KD(44b_^mq{G>)O;14ikmatzkW8uq_XE0(}A<~ z?eNVZY`0$wg?g~F&@HWpsnU>B2jS1$|HIc?M@7}O@8g1?gdiOX(j_H5q;xaD(2aC= zryz*5FoeJm3P^W%NT+n?5YjCTzk|>F_`aXDzU#Nv{5726?0wEY_r9*{zV7<~sjGaF zV)=L^0oq3~0nuk`z0hnxk?i9G#1-_A1KgmeOjM<5t>u}CC#T0Rm}IfEy7X*I<603P zvpxFyXvGvy%FNtucl$#&Dw*f4u<+T|nA9abm-Xbp(Sc+e;=4eH(ph0nAAp89^)ck+ z`n*$abE3GzARyMv5zx!$_~EjV6~+FZ3~4;kz%Q@w8Fp^s8z>Y?DvD`|NhYLw=`V8H zT8^~DE|7*orwXXaao_`HmOG2x$39|w+nu^m^Q?q=gdqL7p-ES3_}Nh zod;b=<~U_?)Dm!LYF9XIbP@Pmyrr=HM0LBI8J#Ws35RJZDOd%NW8$Sn>#;niyQ1G3 z^JG+uwmCMk2SXh%M}A#r2NP_6cV~UUY@C~^Y~n=;i;zq1T8JsN`l?qNWU+zh*M)&l zx=TTN5e;A=927esuC*-)G3fHr@po~IqP-@A15*HgsDa@L1B>HgREg95Y z1sHf`>@xi$5Ve@aujn^!6PD&X`Dz9ErVN^|e;+Iv?Ay@6XB3M+*Eu6fB`qsGpvydy zQ=G3_Adxq}$|*>0+)7=LrEHqUhICfetTa;T+ARTb2y=@ z;1e^6`y)Cl6p+Ad@4PH%#T_2=!uf%Va z?mWcXXY@3kscB~rmyFK69hD#T3?T~?iy$ytWu2qh{v4y5LA69*kMwmPzyZk}0N{_< zoyH3l4n}D`SO++r65^BS2|Hf6NW3IlCI`3nr-5cgzK9WQ(uPZNaB1-31Q#6$4Z#zh zi(uZ~>+vey^Bh*w-iww?zymyppK!;q&H3M32eaGF*RtDCd?Sx_#6x5Tx1F<;i^oU++_Zc) zrHTe29p}AAe{Zj{rI9CkLsLYK;WcN)BbtxvvYM$5zR$p>-9sY28}UbdFAWHuBciD@ zf8r6q0#9%CJY38}Bp}BK-0+JoBUAvX-bg*VlgDD}V$_V_e;O&pa#5l>5DFaj^I;Fo z(0P9efG{K)gbV+7y;wQ9#-7il`=3JO|BU_*Uw9{*p(_4O9D-w%ZC53pml#W)!&AV}d&Cy6zw)`MU_ZMv zWj%btd##}5T$bU{AKLuS=rs|QDV;`+T-VF1&(?;D2OkenSYWpL_+Mfs-R$vcmF<*1 zmi3v)$H66IWh*Pg!B@Go;#e+fL;O2gX-mg4JVJaK8IgcBb94Srl?4V0lBrAD#Ruc` zhH-(SAdI_1R!_$xGh_-D2AO<7K?%*v!x^0GeLTtb1+XyuxvWT!17g2X_Vy3N?KXL5 zzv0oqxBN*wxSqYk_aw^$0UsQ45|(v7kbOLn+?0Pjk-{1C+R_pMp-uiT=?P3}jX8DU zt+Y*fy(ZB;5u@b`PS}=l^ka4r4j#iVVTq|L_?^36n>?6;p0M#}>HKp$-*X@$19dD8 z{R9j{!y0~y&h~EyOG**lG!{PdGOpK=am&i{*`%9_A z`-X<9&zoK@4uqY12O_>23yIdh`%K6DmE&_4>Z_=;vTBR49{;^qfJFK^J)Y)zsz}BE z)~D6d$+N)=KhXG^Bu98&ZOV0<^3rk)A#bwuYu0#yrUavSXw2UkiY5q8rU^QEY=T`U z$A-^c3zP%{)j__8-QX=Q<2>!;f~jWT;Mcu94}|Z}Cq}{WAYTmJ!*78$FY-m6@zXz-q7|xV)pu5u-%~#zx^*}6>gnfK%=tYXD%R2ywe(3< zE1%}?PuiSH33Rm-wR5_9R~I}-ujfwLTXtN|*YNs3cRpRu5%d%a7Q6{kC7x%Iz+8*> zNWHt>%#oS83I*?Mjv;ce;h=~ig1(bGcVpJAuXVAXdDu!i0SdMyrn*~Ix6(W zC}yO^tfxCADy~;N9MgFym?ryp^6iY1<(NrcqVDfQ-5YLOwFKQ!P8n1dcm;ET^tMJQ zw#FG-*qaK6`Uc-H9FgKzsrM@WX8DFgK~MtUjmm-5Q9;*_e*xG&Jd+c~UXD-niD$G8Ld0$`y+L61XBw~$Q>9fk^> z+Qt`|&{2`X9tGhdjW1;mL%CfW`Df|r5At;?x8A#?)JvyM#kuX41+4b_$dFs05OsbS z`S$JY)fH8KV##U9i+jw1&}wZYh2Uq%Y-o=^QJE8D(yAG+rw@qIz{s80(dDR_*(8~L zEmw?+$%1-AUOJN`FnprZEXnVZ=-((5wKU++SAWH%v}Mt+b`OWFHKf+DUvxi?T5H4y zmlXHLB6R1(RhXHsB}zvIS@fHV6>yJ=)~Xv-S`F9tvSF5qui!;AB?E<5h@j+0oBY21 z?i#!WYJ0NG-wmF(-uxQYbJ|O3k%63TLn=)BWs8V#=>n9<4QYZR`~-79jLfdeTOjM` zMSkl|@{eH*N8di#i_+z7vioL2`09)-uoLADe0AWK&{MrnmTpnypck!Z1spxs4zX&8u<`3PN`R7p{_N&?bb_^h~e2Ww;g{Z`X?P$<}w0DiY*= zbU$xD(**dzhVH4h_HjVe^>?ge_ZOk4M_HJJ z2_U!WwyQ}2n(7D@A5&C1cOkIZrh_6gSktI8*6cuCE$*aVO^44pcatA5G%BUNXAM$O zT2zx->DUJ&uA>qq+K|gGKQ;ONuDzJCX*c`rXje9+hB~UboTHa@b39kqP)ibN%F$6x zpWG&V7wG0VNxrLXtx6;5RmE3dMU=pO;t9sr$`?!C$1ELJr#NAIGFwxaQLCDIZSuRJ zd^HR!~+QeIT?Tyb?Cf2#Ge-Pcq56HQ0 z@V#JGF=GsMMD0;o2}-rYasrB}m?lye$dysieJ5jwre>5M(^phi|1y4ZN|9jp)VhIy z&fIpd$U)T0Ku=xcl6&i_?cF?p$r;HQ8+_UEh7QYh2tQIG7(6&cktM!A2yv}LA~E%R zSDBUsGC=j>kYBmB6Ne6Gv29YJk0TIj4z1fW`%Q(6+J12aJ7|MehG&=hY~ssj^~@JB zK3$|~!v-upoJj%*TuTwv!=qW?=73Fm=(ANCPL5CWK(v}5R@aQoO1!I{JWA6mrq`&o zfB?8gfc^Nhum^T&IntK*M8s@FY~Z{niE(SFTP9@6lp~DReCqqOUcNKI&;$-cAN={sn!HkS^g9PP12O|T0IVMM z7W2&sf$tg%qS`|jQjpq1-skk2)NiQExn5udZk?YZR-Ky8PkjHe^MPw2R8%9VC`#iE zE8A>c>2#y@$S%o#aeNi1@>r(A3DcdfaACcBNd{=Ua?!qu7w0~q40KT4mEbZz8{(fzFsiP1+^qTaAY8fwK~eOXBp0 z+%IboRFA+z3J`~Bi#(E*WCYN^Y_E37os5Kbv;+0Im!W}JkX8l4;H6QzcGu=8M>RmlGos`@{eHo-kJEEgYvdlf^y#~_pvFzG%o6$^DgHoq~ zZbeSxs7siJ<(Bjp*Jv&G$noJN>d;VSNR1sV>wA~9F3GiJa4UQH6wn4t!pT`~tu=sh zrlv$X`^2(|f<5Q%P01Liq`>;mM5n0@{_(eJC9kL~Ez2NPRuSS-*VLZ0IPZ{t8aO-2 zn%v(}o{^<#VUWd^Y(I05Z6|DJU^>WuSzT7*BG4$@^ab$xiEC;YxiUflV^CI}<#N5vA6I)VBJxo7J1_rj#d^NQO0ZkgfXm7}DYg}L1PBJDsL+(L11f6VY3urA@W+W7P*AkL(XOG?%xZK|ze98dNe`==MIR$C`hqoVHS z=m(f&$yO@*iM>{ZvPxrP2ZXz-M&IE-h7+d{v|5Mpu2xRQ^e~ z_JFI-anmDDjZr`feF;rVzH(fSeNGB!zzNwEe- z;jgx{uVsS0RpA?9*liB)I)dbY3%ieq1CVYc4A=W~8R+Tb-`Nt%dHLX$RQTGdndj-( zD)PBVeYDr*&x=d;h)H?R-ge?9T1fnj`ib&$G@~Q zV2vl4lLL7)j(RGehAWw?LPrums=b#=_t`EDP=CPM#-`l^s3B-|wBf%HRY1xhiBoi}f%qH; zw2jGkGd@7T=}qKJQa1%+**Ay$U7@birU#!W4M-B57YIERQzqDYh7Z-1pZpL4>y82a zb)JtYg%yarm$9^C`8J3mG_V^ljfK&@(als->>YTV(?UrJ3x0EI;Wj(^e%R zO|u#q1M@(_eD=BQ%6F}(rB!WRR+-dSiGi*qvWo`M2|Fo#gWm*~`eQB=)vcByi`)~a zT|E`PL0^KlGfr50bs4ps`PHoM?xY1EK~Nsw5n}%dDMdf^Z>#wUJ9GQ91JgN$S1k<} zcXtcQQ(ruK4Ft32`L~A8%f7khI9x?%)Es=M@Q|Ki zYQ;blHa4?)vNj-nJoKX#@D~q$r4+bGV<*?1GPw5Z4XSO3tfgbXTFDpkqwWPb7FgmM zNEdx+#iFp<$E^F57o$KP3v?4*No{wlM-+{_3(|~&9R2y zN+~skUd5p^EevaNTkM1X6l)zpc-Jwdueqb^Vy?U85KF&Saznkw+W9{d?U|$39|-JF z35UX|lp*AuPZQ+iXGi+YQc;o3E3CV_yE(;pejf!Y9Du}|X~e{cUGD0AE*jW`?p~#; zmPDLQ_hf^7Lp#R#WE8ju2uzHVOR;p;1CA;5eZo`X)&tsm8+hu=yUi+kMvU!rEA*{& zIjd8YGhS+7M(mZ)j?v0N%P_l62M*qWPNm$70GkS}5O`f*9z8q;Q^n^{F*MH)maIpx zr%%tu#V_sH)yMwWDJeMb%crBcKiDK)h->eivM+S?ioX@Y z+k?@uoefp%rg5`YNzm|=>h`(Cv6WRb_h%O8RfB_d{9UFv0FWXK;(d7&8F|nbmtVv# z;q4z+E13u~qw@kfTk08pjLi`@d%VM2s~LuuT~;^F zT--nMbD583^DW#NW(2A!?V0eqx$64LY@QXwUFs}j?P#S?yKntuFF;DeLYut%Rg4M5 zBWhTL^-r2QZ`HXM3cD8#)fx0hN*=W^{H~kW7jIe2tYbY5U8j4S@e6_L$&zmUVH1lK1K7(3JJybqA2T`Jp~lsz z*?gIud9dj#9$yV1@WVYN+2+%V4=13zzFpAk5pI62F4vM~_t{Y%=Wfs6Y$fYDY~Ow; zNTn87TzjOd?Y$-L6TunLP(R+t$grsV#MF$%Z0Z)+2lKkKy>V{StKgZW@m&&&-;djw zB!=J5yS};QAElpX*BO*QByx8H%^iI;01x~sI~k65_E0rSjx#BA*ky8Roc6r#=UcjK zfc~_~8&cET#YA!QoJJ)Cs2C7Pvg;Zqp6LunMf$w}>YYh{@3$j)Cv^_4>5RI?qgnyf$VqkDWA;#p7BefAef6 z^mc875Z%{HtsR{%5I{2Yg`1w|h63Fb_`7k18$q;`(*c%;<`T(W>o(>rFRv^EuHOQL{0>$kq0C9d1tS}QAV>-jyiS005!Ic0NS2Uh0Ma{PUD z=ToItZST^$(D8vh&+0+*m+4E?nD)ZVW+HC0E<^j%9EWP%O)JKhqs&!HGDlY%(Imfj z+WF2KBvGLFv#(AQid%3K1-hTc6^uY=7Od)II0`y?P1NOg;z)GiCaz{_beU2Hzyp65 z9(5H^aBeiNkh(fJxa)+g@J3j7Q22-~3|vU%I9QCoH}#IQlMfdRBx~L*tnB(|>Ru&l zqOic1my3;emLk{PX<;PoPyk3w-V4p%v!A#dxTq@uB>eXZr3M~o^;U-6~>jV^i*c@tDPEva1e;vO)Z{N`FhjAdbdN8E!Q2o{5bJ^^GBc- z^saX6c{J%tknKXLb{s$YCplMe_jC9zJC-lo&-UJ5_U4tzRxKFj>S~I?(7Lp=p+i02 zM}REl`)cq0)iVGaWb?Tb(D^zCOrAsq}-Vm zSMUPcQ6sG?nUaRLTLTjMJby2#d^j_-ezohE8aBaK%VEA3rVX1Pj2P%9(Bw6_76lO- zpuvfi)?xTS=t0X7KI;@lr#qPt?}A<&Q8>}SDwo~sJ8a)E9|m{!-iVxRfDjekt?RBI zZ7u!iT*d1-Z?j_JNgG}REl(TrGV?HSrRqliW^tZ>A5LW;Pz6GE213652U)--!#6c( z%KbEjKYzx>NU9g!B6KJ3LnWGSF8uNw!TZnGuT(?&sqGgBSu+vARD&3x)zo zQ-Mdr9!}n-=l>blklPzxoqUyke^5tx+ojdi=17Yow0*E*B1-KRAZc?9s4O_ab3S zNUU>h!_`$i>y<1>YjOSefuQ}bsV=zS=~EG3>boYx*+yfatqZ=H_4^||4weEj3w*m< z%{>7wedwz7it4^JB2WKuSAX+DRTWQ5NO)&&u|zTZ;?qoznpv4W(EW}3(GIrzyz!1V0?8&Hr}Y6wgt1lzO-h zN!9PG!7XmCfh_)&%YQ&2YC*pQQj~@aG{tRpxU7YuJrm1Y&_7N*ptKBvl{OGIhCrn8G z-FfRExvoZzUXSOoT9uyKZvMeM`V^UOKUab-)BH?NC6*G8EyC18a*|I(zf6B5L=~bR zdR0-&k^aFrD%$U<0mDTcbsDD(b1JbS7SEEjK@72xP?^ zX6HDGXCrP-06Mz*i)N|{3<>P1wTa-=C6&Sk1H<$NhFRv|G<9(!Sc{5O(aBKTTjugr zl6*8sCAaE%zfJ-mKnLS4h5l_ZdE_CQFT_+8*jYp=Knp`9oK0~^pfbC8~{}FSrAL=?Nlau1{ zuz^~y4@#5(n+lE|`#)@!7*}?0u>2!d0LIH>8jcFhG&^3gyZp%oc#drh>eLZl3zWt7bSKTcROV&>Cp(99vdLgGZ!GWWXBsqdVmN1!= z0c%)T;v9Hd=_`{|Q44t1gf%9C88^$z6>PrKs~ie^-* zBK4D&=I_sGWW`=pE@CCA_-jhUx^@WuD~m0$l_|)D$LFgVgDekG7kcE7Zn@}k#L1Hn z|Eq|hQQfBdXOZ*kG`BPqz$WsmHGT#j7uTO{&5U}r`-Cb;f3Dw~^;9dPt+UR$uU;8t zGLP3dA`V4@VP6#gW@fKALP~#>|Nko*{?Rf4+3-Qj9CJw`LT#M0DD;6&4%2*UD$tNq z)=w)W^-Uwu$!R>PB@Gi{fGHhb88^oYYF$D$FW@vR4834IrXPlzqyH68_gwiRhCi z&^uNwsZ@j!X6J2R*LbGPyKh}^f?k_<$W5*t(O*e(Aa@Ow12%RyLwf!VaF$?>ghwH*IAPKkIR@JB<<8< zg{i#owH$?~S=v87#zIQcrs7Th)PX#x+yOl_pR3HHNfzsXcdV$Z_%)a41Pdbp8hO2> zLGcV@qQbqzZI#>3WbEfy$k#r0_J2<&Y=Yf0+!uShGnpsrFSN{A*O==6j13U*=clv8 zHVWf5{if;J935jPzej4{~Ya2|7x2P|)6-@H>?!$QW zQR4^*)l1QMfikxVI%_#t88u~`>|s=lh7OU=scQ!aD1iRQHMID{ z(+SifjU*a&e(4n!3-qY}v(m`3P_n2yWEZSLA*?hasUvYD2A2h33RakCez4X-qe^+)>$Dwi?;tcz*aYy`BfEPok zljslCt!a8S9OKLnh{8Wnaxku=d#DUb;@`TP^yM$y>owru#c87aoy2>bR#!$kZrON8 z!kQR@s(hqECJ{%Ch12xvo~HCdJk8|O5B+}dSm=bFtIyw2P(}+oiUi=1~)-=#7L+^`8rf zMWdvxosXpYyV*C^`!FNF)0K`p&b-);6$66n3tb4;{JOVd&u9@G>Yle$S$t@7~PDcWrue`U+W%a5P&)S=V*PG^okSU z+m*JAWvHn5#c%%o8Q`uXL6q?HEVmzg(Z;^0!{Zv8qG+f4weM*W(6CRXp_`!R>%6F` zWqxde`q!}k4G=h>*fih`E4I)Vy+`F&ZTpaxa7RHraIxCy7d-;IE15MwHxrM_m;U zZ}~u_0ltEJ#a%b_S+HRL7vUy6Br@b@qYe-LQpcY@6aTDL1sd{iG96=VP1>t-{oR~Z zFG>#3y$}aBYWyP`M_-$q9}K^DCr6Lblz1Ap^RF@UN6mqa>r9f5#?F}%B z<#?M@yyhk-dio3n==}9>h?j1?LUK|s4$7>5(Xh|^WRC;)v6X{T@R)glv%~RDI97VX zM}mchr{izbfohI_oLyMNNSOAE5q;k%ef+lQVLw^$cGs3v zw-B;B`u@%vFpu3uk<#}Ms$IgUOH|0^l!o(xj>cTr!gehx0o8YZB`BcVY=XOwm;--QT7UW_y_GIcDxu zu40IluO4m|_ey^{5}@7RUHoj{EoXgi=%Jlx(jkf9_Vlo|M?R}#_V6wN;!|FP_aV7^ zB~^hYKY2LXHh7=7Y+Bc%JKov3OlZkYqOdX)$%huW0C=(HK#KcPfJZYx0`sxkYFy;2t+HH4M0_qVC^aoWVlD&ez4Rkb z%cVy0Vb>$I+cAgR_naLPbB8m(*>~xSyW(#l*gDalped1Onzpq-#lJiEeXL4AMf2M% zA)M+d3~4dbNL+h+rZ$NtNW8<9p&Y|3t(38i8zMK}^wIGw<&CokE&FO_M$3|wyybJ$ ziw{7~2wHP%h$wF_bHs;(@+jb1%53%7k)ik;x#;)&uF%&~wqhZD)}P~viuCi-!aUf& z`#EMg;EYrj)M}&BE7CA@ef-V9hQ*vkC@{L{|GlcCb;EJmK>dTYfA5c9yBCtEInSep z+LeoN4c$RU?a4+0&EF1D9O?Yupaph!asHTDh@GhVO5YCNjtgoCF(+rB?W59INxEnt zj}JFN@mtghIPojQ2UFS@r2W+OjGbIl`|4~}_yQjM^fg_9JMwIRhS@i)sJG|+EwH7;Z) zFJ8jqodUK1DtTtNB(7O9%1h&1qB%&!=guF84?UN{m5i4Fd14|4N2TC?RG<#d7t_yBdq6GYd zNi?sFK!I8tmNnoZ3ckTA`#`-+hWJ>gV`X$P4^*atL#@9RJRt$nRo-!8?_y0|;y~tk zCNCBqWU(%D<)Xt-oO0iNoIDTTfuwF=Y{g)sADM-|X|UG(h@)tIvTKos6}+2e!8C0U z%3)605wYJ}Yi#jkboE;)dkva@nyV5j5;oTCXxbf(JzkhsbR3hiptCB6T8pyMWk|Js z)h~ETP~@Qc4yuo%0yfKb{5P9PBo)W_$Iec#<8ty;tRlkr`x%Pbe)OY%4gGQDb+WMU z6k&ybkU#9f91OKL?rkUns+oJejAg@twoM3o5?;CAp0IJJXfM{gJ0b|pDSzLOA^bh~ zVU&%JU&J#Y3s0T*aPd2iKtp}cdhh3!>lY+ED@1=ia*u$B?fqSROm909&;|M}Hv9r!$TY|DjBT8&4v$3$nm)V3* zl8MG2bF#qe!UfsAicXEd`((-ZISGSV9@??v=VD7Aby@X643sPqJyxQQL(ORT4b=Um zPLWMrq2smm79`^2Xg}CyjzD?NvD)9`kN5VS1{O2|APp*>MQi?$gBBhei3#&d@ z3!^wWC0yd^y=FZeE`b;WCeLl(DkEHUu$!&N<%Gm zwAfSTxxa$3YAa9Hqu70_DoCD3=VPcRn6~Grl(We}+bvhtGseUdtoaE5 zL;N+Y?g{TK)Eln~bNd2hLvXcF{ihiMf6XFTT6wAjo_9LZ7{8WFJ-&w|cJNin7cP+I z&E$oG-Q{W(NSzm@5Y;Jw(AiP3UC92@A|xBN2WQw;j9vBp@8{lqj`G*yG_Y5i+K;r7 zcT%->u(6LQ+qYLtgDs$VMQ&!U(vixn+DAf7WzFJyKGyMg7^qivHZj7dfwE8g3Q{lR z((&+}$LOfkJ!Pv2)!?iZ&oli`YWW&&I^Yzq@CU7p@xZg?uxb*zbZdQL?8kf1OtnXK z8+*KUaMN;tT~QuOC9Y+MS@ozE^+ zkL|YFWOZkA+@@9l%hT&pA)(oibQ<_8^RIftV#a-!Vi5&+tCMgblyN2lbk#DdZ7b|i zzu73a7w-9 z3XU$qD1m{H4&r`eb5=pUYc6$b)B;ef6%g?pX+H}GVddIiN(=CDVb&U1&Qs($@*Ul6 zKpLycxZi!Fg}EiF!r``6Y>?Fez9wt-c*k zoHR=BGu&?C4AY$NB<`jN;$aCIGAE#-p{jz@$H%c}su7;CK4+lRF)Czt%s~*P zd)z0a(46F-vRwCq`ZfO#98Q0 zvSRe|MMHO&y&Zj=@oS43$+*DyH;p$+_naD;u#fMPNCM+Jio5fh-NdFvagZWvrLWgieEN~#5Y)W^p5!$I7 z^DVaXHs7<30Cvj>pgk%q)rXMf^O9*%0kIkDGxJWlF0F(=QrJz+NaiY7nrP0hCuJqC z#EXJL|IG{zt3C}j3Z#i*-0DCjCFQZfPPiJ@MLHiX!}D2# z>+h3V`Owdj%K_~+>UUS)kffbZ7wE)Z>Ob{7(lyRdDrK( z8Toi@q{VX=+x*`4bt$}@w=V3fN1@47+J+QH7)G zcW^lSBZN#(Ipw_9YCQ`q^LZRmrmO1blV=K_%JMQC2jQnbbL9tqr3KmF11v~jcQLvINNWF{;M9%cXBeRDl z!`czCOieP4%JiN#T{U1~8P}qWSiipV7`KG9wCY_vxcX)Ni6Z}7CH^&y#!n;4RcX|U z5^j&&AefB(&!K=ICNTNm!^j67p#0^d^6LkSu!;E;0Ctr0_ga?-HwuhJ z>a)3EI3g7qQK6Rfpqmxtq-`SXnbc~bmi-yG{aRx8mwn(0Y-TuiCMki&a~s}1@hHxb z@+4~+@yMr-LUugLmVgsi0c0A43yeyh;&AIU;dQT>Ru%4ZR#x$Y0ZrHUB{dRqh74P% zck^7t<@igQz?KQmojiJNU42)`ed{`bX*jv>r7<*-zl)YGEkm2oG4MW31G2g`}O%n z=JuS1_G6ig83ry%=F6>MXhJRo*9KBov&T7&t^Z*B{*(M$bc^^mCIw-AMvBZVhadG; zL*@kqRG2419g-_bNN{JVDOu3AeYi$MSC6#(Y9Xf2hQVR#h-(|jo<9Y^ly*Wh>fbS6 zO(yiNNn?ld=U*-OX1~Re#IdnstrVH2@VE)C)W+_bpFM^UL*F4T(xK|#XgDRqD8!AVD<8+7JkVgzifjo+EP3{OpJ3!U(t7%@|>mDAmA$|`v`yJ(ZDpz5aF7m6jX13O;m&9(e~r0xDH zC;hj2u9&S3tz@RBXdGXbn}%Z*BR9kBM?N`=)fhfq<;=h_(~!mcDBHZC#A;o7L(aC7 z*?ObG{u-)TGyZP|PN^uRm)DHsn|p#n^-0_C4N-o5U6n!`P=&SaO#)M=WxLEtmP|{> zOB$(Vhdh>FV=)-9!kK`#mJ5xL6~I@APXkW8zYAj$?8g#>zc4S-{E1G-3;5sQ5i}*E zU+>15g!+mcM#V!C&@!5{`4l`XZDI4gGNII{>VyFmv?XZwbLt;=o_=Rkj6un$x>S>n zh~g6kg<_PGOmWk^xF<;q9kOJTt?XTTV%{k-cR<%4Si>@)ao!I}Eqeo+C#wi|1zw4Z z3MgVnh4rnNwAOS14wQxwJ0s|H*z}fV%2Hpb0%gTz!jaBj(PcX1M~5hb1m70d^<8Eu zT9NCQ01Q=HV{uV45Y7*DopVWEzVz`wm_5*?0P`sqR@Yk0{UQ?X^Av>7V58HsE0H4`ACwU^@ksCmy|!YF|S7b zx^IM`!KU-n8*6p)$AZQH&@sYTac7botGLyoBd7LqjGtOG)-;S9N-3Het7=B_P3g?HuFMw37W0<18b2emVNhF@#qo}^!H>STWi1%HFPlO2*vK`@KhPec z)0#B~HcAxMe?l%xV;8K6Cg3x91|fJZyg*rVOQ}p4$GP&CaQ5*&QNKBV-U zKu(h`ty}ZBdZ&miS(UHgv88Znp~J8bM2NYNtO7&VBcx8rsSTTYbI0aBnzLbSe%&G4u6H0iqvtIe~J+Zf0<^oo58?aB~=`Pv;4e^)V5w9LOV$)Nm)qn4#w;%ZS zAs&>cf>W7lm8|4Q2eTuFVIIBVO>I>K2vT;@W~#m9Me@}4H+_bS>*Z&Kg9TT<8lf}_D=rxK1x?_}Vm3O?e}0yrS);lOLwxXF>>6LOcz^#I7$nG5O+0kr8+y>3jT|YHls6w(&<>Rk7O#(4a#g6{@bw>vOoWZz2xc=bq<65PC~_VLF$CTv1bYp(~| z(o|oJqFBrX0nv=P1Byh11%5Q+b#^^I7zbV{wB-ELO(g#D+kFOijOZ-&+I;_HS$}d< z<7R+DW`2&xiWI}=va&3<_Oc~O0H}nS8g}!-S@*3vvH7eBqWXV;dm*>4#dB27)K*VH zhy%dj3;T-jWfOmcm5CeITNmbKLvX<1&(&8K6si#BA=J=|B0!OdqSZ1>sVdMl{r|Xo z>!_@{_FYr~DWw~vyE~+%8dfwtj*sIi`qu%E zSN{XZR3@quF_eT4pbvC1y6@KPS5mQk0J|f9V26;k)-)+9>~o0nFZ8)Z(DIRHK?FEu zC5E4teYX-Yx20$<7tQFIDR>r);zA-mf05F2hFCwBQ1D$!;*=N)?w5)XdMkrYR%Ym# zUC;%0h|bqo^k(EK#RJ7k zWy%i|_F6IQ z?TOcWHv364S(t^Pe(ZY>6x;kNSv)FhsKh--7#8XNiOpM`f$Y8grGO<^`a{tiusSP= z*#M=6b$zub{%&w(gqL3`#g|gFQDgnqMS^}2Cos?w`*|!e?AKjg)XAdN*^CW^c2`rP#;48Vtf*zj%uvM)pZE&Jcp3A zm@@nmoyVK#$P%|OcL%!jDA$QNm{I7jPt0Q9H9lfoAE*;3#1c&ych^^54Ym+L&OH{W zFG~XznT87ri=2p-x`sc#whVgVD?4PU_vncx@})qv;eI()<55@Nu+@u(f;WGV53!d7 z-&?Vjm3d2W2WM^{7BgOmwHzDwB_y=wkqaZ{$s1*jFkw6nJ;7OrqDG^)tskIHi@3{v zH##RS&v!O_7%d}>)vScA_5CkLSv`~#628#)5^b7lN&RF9Z9j(O1+B{GSi@S-no99u z_FPz8Zm%NYwEA*X)J3v>$7ZM?&LD}Az&Ho1E=}o!yK+8>o*u#D5^cOO zU7i0B7ymQ7VS;-J^m$Zt9TDlf2Md?&enOq-OAcwZsGfvZD0SJ&64r|Z)byIrooXD9 zUM@WZ2yz&t44ZSSN{P_!`dJE6T5>L0wQArp%Oxy0PuTfhw@;_wEj2hKrZHPRfi0;4 z%4_^_=DmRsbwAH=x%V3H8h9SGv_rh>VZ}%`T)?Vv8eKZE^j-bS&(xLJ*!Xj52J%jm z6?IUL_;w)p3TT1t4?DoDLgLV~SDZedJ5W>!O zVi%rb@6KSb?Ji~EH#gl6_4LGi_+^rkG?Fte z-jbcRvgV$3cUaxcrVw(pN#ZTw-Pb_N4=w1YjOLI(N~IU2&Dg4y%TAV;S1IRCKpgUv z!#60}Gt2@I8hm?yj-hgak4Os$jsFpNSWgJcA81T@mTtTEGvjyO=S8gnCjr?u@VCT< zNdL~BM63A{`T(#W!zOV&%1(fQFYwqh+>HK!cw8wGwv+WKWZJ|8~#7F$w^Vh62Y4Wg);sII{cI-q8ln$!G84d#(<>%17OdZ zHW?3upgRMES${$)%E2ivdUi49_SiEqWLWnlhgw5{Gps!!1yTMT_A{|h1UQK^PdYlu zh*sjNhtc;%Ht%HxF+SYTsTL$%;{C zQ5b$=!EbxZHEmvSFndN=_I{Y;B||UsGp$;VnKD=B7Zw7Tkh779s%SS0`ybuCI{W62 z%UGQ&7PqVI0_ops7zj3ez#esl*UwxjvUu-bO+Wt%hSvGMAb>Oc9IAY5#z63T6nok= z?3`15r*GzbT3)Tmgc$MAb0Tkacch31x{A=>cek5ui(i-VOoJ=1Pu;QKd9Yg^k6%<> zxvZRzoF9KT$x)$23*6sx?cMk5l)P_=uf2MA2Id2B#jDB{eqQ}t$W1pmCcvzm=7|gF zM%otWYWBn53fjoS?iA*whAWeNvU-jX{?(@`2ldh@_#34)o)pdVadAo8{7-Y+=r8t| zIF|J+`M<#n6y0~6LdrEZ;D2!xKaN-F8|#1Nuo{nSZKbpMdS__X&(1x+o`^L6Rn7@F zhUd(S@Vr-*`sWZgl}l*xDih7au`6RE{1vn;ahLq|0w}AVDp7N>FLy?ohBb1XJAU%# zrYjzQef?SBoukTpjrl_NGQI#UlXk_Gp38dg#zMLG8$tDS6cpLQGrEp8%SBpZ^0g^1 z69cu}P!*<91rECDL)K>XQl2R3z-9-3x+|t-+okKl*_$id}A)7hST#mI|6cyu3N>#9Uwp)%G(|x2gJ!d zjRgDj9vaiU#rvO8@HLl)VGOUAPF?P6)`?mmjHazDYBukR__MY&8m!^?)z6Z)#zG+( zVck4LCB7dRm~>p9jQ&tnid4C?rDJq)9i6pM_{6;Ye$7(MjRwi|$w!9!zKI~Y6ndM>4p|d){5Uu@vsK2QD zc(}IC0o@(xH+~apevPYwf&*)`J)!=e)pv!wBJX1b7qE;MLzlxK)-X`^VZ-lX>1JPH z=@xs*TXNLCKf0v}8kbsoV~eQs)jpbK^Cxj)hIK%v!!tKJ6YHB7Ef#mU>iL#7(*X^T z^IHC=Unr9AYHkpU78)e#SUR(Nm%SlM2O9{lpF3;vFGz-)_sLmDOLxyNdB+r?=$3jR zNjndT-dB^_9{mcZ7dPC?VPrNL!`g@)$6JqR9I`tL^m|RxEE>=+$8!j;neS1(EQ?`6 zlTNX$Y;Y*xJGssmlH8U;jIwVCmiC=KA133yjH;KS#*Ai(@_)S;=Kx0d7UK3 ztJ4935Y}MrchBO4CZJLBNR%KkSbl*p8o^X$RTbro*ltO$Xesx)zS;)cd%KrZGnv(< z)pGmj<^JeJQJo^4dAbL&Y;yXsH|jtXxhM8CBha9~M!()IPK-9`+`GKcUz^>SHRh7T zw+j^*En|T6CFfcH^<|uuIc?rFnQcR;|6r6Ozb6WRx~?6S3&NhmGqmnY^S7UfJePML z_S4_YvJloPu$BInPrQF_es-7RbkQfL>y0%QI98vWtyZ>;rOJTqjb}Q3#S*KL#}$i` zLP^aSR%*2HyY%q5YnZ8ew(OI|cV3!UYw@E!nH^WuE=PeORjtMr0*Hnqj+NqP(V5!D zs#%q!g4n>TRKKPuu%K~(?X+h3{W8-!Vxyy-|Mkg{ zF@5*Ur;=_xseQ$!#{TPm88kV&=H%7gsSgdKn@s+8l`a2hH zEUD;*6;&l(`jAB&pY}iuN;4I$K)syx4mxM0k|{w)3Yns+4vnPqB~7Cb?~5&^yVc0{ zs68>V=uwYi4blnHDK0MaKrb*L-4As3@_cLL$8UXtkUldgb}H=@+|O_*NKeRKz>3+T zW@ji_QY83n=?h76M<7KB8?{;JXY6^Sq`pAZ(kLpu!=Tovc0A(Hm*fc|Quj`oHb-gU zjdkO@>~<3qlZ7VwrrmH{Lw;?N7HD{#9AzKKZJ_9Alf9zn%iqq){xbHpW;Z`Hw1bLu zF)exnmN6qD#=he0YUk@#Fnbzrb;dx%+)%+-I0f_8CohxN`p#-eVuH)D&03d;1@CD_ z8%~jv`A@863qsoRC8u2C@E%NYn9UDmKVmV!slgH2zfBp$6eV$2z+IPylbJRKw}S*Kr; zKg}sp@1Jo@n=@I!HR#-~CS34w#^TSGiTmW!^%Yfi$*@!XU6d@k+;5wjw}rsNfIIkW zRv%}HtYMvB=c*vgtlsX&t=8A)ty;0#w&gq}<|>2(*shkD8X#^Aok2$n3FvNeNV)(< zT}m;P@7F}wB-L%;e6%Bqmt&}&`59|p`Ss?`SV>v+*N;QzJP-K=On6EV;Zz^=V9*l@ zN#zs)wGD`cZW{R^5|HI$=Z-?vt9VGQKHt4?9)4ysWNs2DyW>g%q;+9CfhxICtn)b@ z5pc;+F9UKuN?kayvs+@)WCHgkg!P0gY?j7yE3I*URZINSm>ntriQ?EmbwGOv*X zdNp*E!@5o8)5=R1*>)vMHM4Ava4{IOK&C$Yfg&(g>9t~(E}*ta@_e)Ph(=>d?@p!T zH~gKXYQ@;OvN-S4F=aUC0BQ|$;10YbXmstx&iz$Z{azYO5dQS9DbXeLmqQ6=fo;9F zZ{Bh}vkp__dKO)!teIg`zSRTW%>c?@*;LEWqRXMn8Os~PQ&xx*-OK{sfO}@PF~1lT zx#nc$?(F(svfyPv(?O1NdIhe}d=N{E{DF!W(dnNtp)>&JN)b2s@v#lKi@Ii&Cp=|g zl!eU>d?m0kz^4v@pu{80iv39iKu>VVAMR1;OF+4JacBi8})8LU&nW^X{*?Fl)~>T`ZzycxfO0-ez#2^Fn`IGq0q~z^+sg?6D4~=iZDi=nco! z6PL3lvte9uwP@WaudwS2rRgC{pDoubdgi}82)FB_UI4Xy`45?|veClNbwrd-q2 zbrllt>Gwn!KVa?~8~ZKoCd4|aw#zsd>5Rqq>{XsSz?WQRBccT)mUDBr^i%c{6$4y} zt8WhN#dV^0PR3GG6wV8isl!v9^Mmq;bxssT0Cpv+>M7HZv-<&Ux5vbU{%J#vq zG~cf2;)D^Si76rRo!k<`q@(c=vB7LoHo6=_^ku*OUT6BUXRSrse2M^;|!gF%0%5T3e>%4yZBb<5#Npk;d7HKIw z&O-#ZzS}*Su`7^=?4vX7U$!=adt%0? zbX)u5_s26x*)PsVpLq-Iq8p6#oC%2JGqlkzmR~zkcCncQk+_uEj%#UL^u+{j*pj77 z92HeSjsj|?>$9bWW6xQ59lw=DJL+%-t(9Ag*%7`cPzPbzU{-j+~`war(mW(!7sn z(~Q5j_RFi_2unPJjmC>8h(2!`+Dg}^5!sm2$qa` zotP2G-Xd{bYPIa-oWC`pFrpqMUv%6I9UOO7uPO3+|LO;}`*@7a5m_E?&ab<$hjaD1 zvtp}}-00|GcR`W6N(||s?P26?3KqPE_^@EAD{;j|<;fV?vJ+wZqzjw!mQhqzMADPA zLFRjrBOwPMg=a?j+Ps>?{Sll+q`BUqrhh4Ico;{ma<^OTIi)k6RU=r?tANk<`k{dCFIY-5(fiJfrdqZ{$Lak;F*oa2 z+nVI&+?nT!;U=-eymiZ`EeDlq{)hATt5@UemJx9cpJ=>!CD7#-6o0~;ZtLpo>HqF% zH#mD~S7R<+WE7#;Zm_qHO=&ht6;MeinuPq}73n?{{X)!$-LPxBQ0~4j1clI z6Q?beIp=({RruQ0fz^AAjFf}y3@rpzPHdwTEli!-3o$nDdo-7}SA>^V`Cd0+y(L^s zPt}}xPLKXO#ui7s;%6#PMwXmga^n}_t3#WbEQ(EqN>_6Bdg*t1S`=f=CJ}ri_j+Sq z$hc#;Jz9>FK`N@A4O=%jEMUmyZqR8EOElIY3$xhYz$^ljTMKhf# zxP!%+8tw+;XW<8Mf_fp=9Ybt&OQ4Z`h4^+l+2_?2TZix1HYI%eN>9o7);?crhWjgx+j`MZ*UU`i~!AhrPfd9=N9N zcxq%Yaqs7}J~MIOX1|W>upTx6V=F}kX5k{i8A z5E(~&tByPYW$~hZY{Dm*yWQb-<_GxUaoKj*-30ERhCS{0AB*7id%nOp7{4nn%FB!i zLW6e$Ukk{Iem3$YeKXrQkTIL7P0{L5D4p>C$SIw$UAe*`5+V5^lZh9ch3~?31 zSG^tv!+U^KcME{}K!SY?(9>j?W@K2LCG__u<7OlxLu((<_uq;Tg|16_-vm@!tZyn= z*A2UTOJkP&#NQtiT@$q-%Q&5h&cl+jZi(gwPV0~hI={+aCw2Bn=K^q2S ze?+&GPQZZ4-c@((^08R)&Fw9w z?9i#R`&IJ3L!lce&jBjxnx$o2IN=Q^`s%&m$f+-RPWfH;T# zPZ|qxuq?*LY2ZdMrb_}LsVe=P1^Z~q61e~<}dL@BBo+5fEXo2>r04Pm?CxK$Cnrr*3{bG{|u^WkNveN3uiXrY*7yF#j5}Wn$?r;v&Od-)uw;CU2C}XKmZjDb2P?WZ~f!wM!0_ov)?MA#2Y+ z108;1ovvM6TKDzv&TB6FsWo47su1>;s$a}IeY1YY;)@|sgYHmeYdz*t&D(1{-ZGO0 zOxfr8IZxAUSP(o{aIFe#t_-KQ)f%js<*;4&fu(%5R;>Nkd)KAj@KWn9OI(gUkg6}T-pd87q4Wl-RJbfAV~L*{HlIiAaU&?Y zr(%X_TR5b$E%7xis$(yhz0KTTM_53+aJX#wX1s5GG3Im3RNJnwu(+{KYYF6SSOii@ zTQP79t-?x3U7497)dfi-s}k|e{y?FMCcjjebZ6uk0cR;G%E(c$v`$yhZNIJ7y**Rq zic7y*QRlp2cJ+57w7u#G?R3+g7A)SNc~?!Fu5bM#w6nPV8Nh(-$Ee!m|8*MD_V+hh zA(RHAtCOGSoS9kWRC@gx;PEVq*%L82u(^NCfuuZ5d<^)`!JQ#D?}p5e_qy-e=DCb| z$Tud9YmIi<#=f;3Y4KjK>=rx+=0T`@I2>cA?tM#vs%%)o%0a_?K zc<1F)S0oY+Zp0cHZ(N0HQ)#^qSappf*;?$EPYo%mz6EHf8+X)uN*^4SPma(O|u{I{6z5aNNB1Oy7rjLi2XAaIyVI ziv4KIu0%5Lg+6NoYE1RI)fFnRzxgt#H`xyLY(xAI%Tm1prsOhU>J@YP>SyLTT!|hv ztkM{&?2eg4P-#J(2W=qY5PpHU8cP)z*J=F5ATX}OLSjd(zq0yb_M(AKY(>Ie=kvAv zOS+lxviY0`ZIRB}nh7C3F{SY&OU-dTrYQ%WaiAHk6XO}pnV7zf+Kss0^ibW!`&0M6 zS%>k}>kp`@do6v!X*t53uUuS*_zEa<5$n)BXJ0(`)ltuVUcu=Vq|4zQDae?s$fa&F zL?w+&nv7|AkMdwppLhPppq@Zbjjt1Zj>%tak)T^~RG84|3^9vT+I`)^7mO<&iJC+0DmwxgIO*sQRw!fZXPkBWs%OVtL&&Y9`{p{nx!m_wUd@$>CXrdcO)Z%KFUqOAW zP{zBqyq3SP+Vzfi1tu2%5_L~VW12w4){!K|vYNKdU`N8GNz27TIp`nRW{81Tn%a#9 z9L?ItzV)UKiJ8n*!<*?-gWope5-jAn>3Gx(DZ|J68wYil)+1ACSt(C=QC1oVtsUba z-!B3u%*wSR;W&RB=8WVzT+%9btd{WGqUunRG_+3PH4+ig7^x5VrRB%$F`ecQN)*Ja z7k7mX{7XtJc`Do6N92yRhAr=ZZrRFy?RkGFcjOu#ZxOL&#|B-A7YKY)_Xt6q<}<)@ zglT;b2NW#D1jKzdl(Fj+OWVSGCi#90Qg1V$F=f`vh_+Odl5}}_W7FtR9D4L4a#M>t z@?gf%eG(tSr#*}cNfZflNfC2Mir6c@x`s3t`ANL6JMNCPJXw6i-><*{(+`IXEDx1F zeTRH^0dRbBAtA5X`+JTG-tzKqLt~IK)o(LDNd{gu>U6T%d{JIWv$#>oPE!#(5{{+A z_N(Z!QoUe(k_<_gkQk{DSqME=b8O*iZFgC6;D~%DzrYc%gjwJv6$YdJ6>sjl+hq$b zZpa{v%2M!YYHf4viazQ{nYuHZyxFr$&h?QGP=y7wF{*BFLdh@FDarr((n#oj1GDur zVDO-P(5GKMdeSP8@$eT%PQqJ<*Zy^8v= zgmLKX$kN3bUHV;C)Hf~bXN>)kknFn;&$rw_J}HbcNp%^tHoJ@ z#Ad&yOb|fML`Q9?2~XP)ea#(r$6OxS{~9OeA2EW*&9)u&dbc~kA~{{YO;YQM@aC*B zdk7zX+_m7D8i%x1sF$TUO={@P(Z^(BOIB`D^6wfAN;j_%$uR=AIumuBu#XC-Hi!G@ z->Oml!_M4(J$A;z2&Wy_Qjt72=ammT${1Du4nW3I*a?qbt@BRR)U$LFAF64PbmH z>0;JnM-EY^{Nu4^lW3(}BC8tKI*EWMK@jV3_n%NZfv~;gzq}pn)3n>X;32ZIc}Pk5 z&&T%{+QDWK_vRij{9m|i7D`ADbbO546Mx~%cNl^+wuqpd+_TF7>(g5l`^P=*C)c{oE0?I{ zooK&V;OKH1>ds`LH^yQoH8N{{Oz=jGh28hQO9P-rbW zg!@F2oRwH^L1}^}IS{8pww;^&J{dc4Afmx4sC-5t(63x;XK*p7?TFVgkc=Rn6y8P6 zGIO2Z`tRV1p&e*&UD~N=dp5<+I{{{hW$yigQB08y1RP2Fk(OdZ%dc5cjsHf}!1DU0 zB`dE-;>40EmUHyuhGoEvVlzq!3k)zZ*{F9})m{ZLa;cpLp;GjI@e9VMWryqF~ zp1^$qRi}H=cP!%nzCF>)hv>qUyt3iPc#Ry8sm=0?2ao(QBtsm6KUEnkO044FMr3J} z$iQz90xC)W%~x;x>@(?_d}FJk&E>DZ_!w;=@t{5ZZ37xN{)ai1N=NK(@P*)mx&rz5 zc(PyQPeF81+EBr9d1_06O{S@agjsk-b550+A`vk585C2On-YS6;`ui;2N%jBF9?DB+qB*N#+%=xf)krL z&P)ew`4)WN&Rtv85h#EBvT^clpZ?*{KK*wXiG1Hsz6ms)l@pn+o^)b!VfJ=6dYg1%Cqvk&q*TC9d9eGK zPT?!w7^BlZ#dF%md{e!{9X{<~Vr;XX0^?@l1OI~;^A zuFGIj^S^S3nkP*3rmc7G!Q{_1__z`v1RuTy8{JdjQD~!nq8OOW%_^(UnP6wHeCQQ)dF8-KwnkQ&|=%VM-2#RqdRUY`mT%16vrB(8ni$3N7lzwJ5|pv0t~0znAvK;tdq(a`<}i9VeeDOCQ5+KM7J`pn3fX~RVNR9!5_8RPl=ps`VVNgXff{ZS_ zuF)M{O|U-#{1;d=;ph+ZUV8o{n!7n@(Owqj<-E$URxDJ#=ak)HQvte%#7zCpj)6_* zd}-~e$7U&O7v<)&%meJX+;G)4$sMkhT4tA%ae3R}3PQcMkmieX(#cliilw#|f$&tU zVugEp9o9>{hd5rF2cZU%Vgr+0{6R1ccB3_Rj{^@}%sgH##UPMT=2CS4Cdz zj7!qrYdf7eBr_Sgqy@#Ff@M-mj7;?aw7KRbh#=rV-g1LIBJEP#JPBltt`~Pn-M-_g zb*OLOAR|9XbMHo#-Fo(@0Xsv!YuL3}M0f9el^b)eZb{+rN>=oTqg7i}%?M^WLa&Ba zjK%R0^dkBFB5v zN2ykCOv}J;0G|_$*XBae&r8ilmi%!19&eQGKh)KTdQ5C-NtM4#e39YJ zsj2AO7a=wUMdd5ri;Qo15Qn*(=%7zGJvvNN?M@^dwx_r|jGs0LLrehXCd1vsY)8Os z2;pXHv!W~4c7Ci{pYXfGJpncDbIq5bDOYEn*@(%F>$Ke>^Tql= z)lJyB-5l15QY^Pq`tk8eMieEIWGmNI`o^2Pnyt5?+PDiXcwtigWrnAirCo#A_G{y^ zjUi9~gn}cVe`#e9EC2*ouQ@n`!wgeV_e(r`<~maIh<8U6&Ptw#qFo#j`Dk;euTy`w zVu3J$WiPdFs2CW^E=Q5WAN69NxJdfc84SPH@|x_Yf%|Qaq?O(%Ww+BO%;*_`wRjDE zzG#DZXV;}fUcIbuzy$|(VLyphhX)bzR;RZ?}%HQ+=@db`9+Qbsp5 zx5eDkw5VHBbI%^jaF1cow-l@;R_I{o{hzqQEywIu9viZq>p|gi9fxs2OY5SAwui;T znfBKzR?gVa?@XtmzA}Y zC2vK)i43*1qm1Bn9b-BNE)Th9=^~B=M2-q)32dmaHZ+^h z(I1avecIjY!7yl(+P%Qyb6R1iXBpcXWL=B2iM^3oUp!$$T*IpCNZiTeiO~!x_0|c4 z(Y?xxa^Ze&YJGEBWXAQb50>Bpk75|A!HgbE-UP0^24HPNrhqEg8NcX8+h6`%)2zft zz*kF2P`}CBc=X-*Q;UNzewo9MpC7oamXSSfc1ufGcY;p$gK7wxpyzq2;LyUSWl_ID zgXjwL2-0GJ=|CMgyS=&28vb0rMrFT|=XU{#CSHZhUpls(u1=V_R;HLY=Bt|emR4=J z4!4gYU2ab0ZGV2_uia}yL&nF)2ui2`MTwdpDzG^3Oxc4NeHO2UOzbH*?w9)tX4Ykt?>tw z1~NUqhpER?)BuI29xwXE2$A#rAzQXI-H;FT^(%qYp3bk>=S!=(%+LdwDH zMCHep^yxOLf$E!r*dPE2zWud9q9lXIQ}a>^%3WWcJ$5xoq3~1ta*~f-5=Y&C1RaXS*5-c+3Tg9>l<( zOX36(^fQeiZJwm;!{}GsOvoMwD*gu)zyCb6hYdrtVBJ*)kfZMbNh_&pn|b4uCMv8l zz?j7VV?K+$eqvdAYR)-`C8s~stm+eMWW%MI-t}sv6uO+{;UZ$dgm4jo;VuP{F4Y>u z+aW@qzpK+=?wiH$wOcURMok19F*#F6kPQS-@1>S(szoC!N_8U*jlhU4y(VhOL$BdG z<8WGk*=1xR-wmf2G&y@{WL~p0l)E78rolo`d-oC)CZpkfVZ;c8145|PxL-KJlKcrz z%&TWT+++K@pWIba7LvGgps5=(<0txf@Gzm%Qs zAN?cp#elk_SlnNYCr>{4QR9($*4p)WsZh8N!uYpzV2|4)#P8?D?ctt3iGmjAGBf@? z3<3Z9>6w2H-q61YHsGmm{P(JU`_OsejEe6Va!I`yJidMNf{y7&0{@Nr!v&RIBF~~q z?7)lU2BBly2PjGq>zVwEdRuuQs(pagt3BHo_OB)=Drm=V!+&$A+;^GgihXh0x*sg?HT;dcE}J?Ry922J<-e+> z1St?&63Y%V#>Z~Q0cgRFgKzzqS`oqqmhT6S<;ujrqn6eScFUxQD9%ScL5BYdEU^1%C?I-T3ilI5j@4x7BaeHEsEx`{^R$|C$BJ4tRX$w-dm2!trM+ zK-z^5=YwjL-eLYYg%VEyV{`6f^2-xA01N;l^PB&+9RNKH=HClirNJxd_$@yyzQ3QP zj#vNw0ip8{ABp-O)#|UY;Xf=bfB!%|hy~fxiD@p6TJ#ez+W)sI9Ps&*|DOyYDAK=L z?>whktV_#V6ceo^hI=B^Fxis9R?GuBzF@no40=t0+SAV$k=k+(?bI-D$tZFX@sg)` zl<#J4bhxVeto*BYd0H_s*0wHsGAVwovKq6^ zAj9X1k**++As>P{A@PDoegYT3|Fp@5`!1f9cP{|zV(b{ap|C18{e8MhOyxIay5I;pByUM zGVoeTie~7x-$;pS_xZBdh=kAWsE}H$UG;ME{?y}iA5Jmqdr(y&G0*798l$RC^q7g3&&GzS#O>*Lv*I+t@@M%r{D zom^V$Mg+-TYR3RY{kJT4cAZt&oUXXl78=psO$U|m6POv<}VVKGta3QTEd*G@H}G zdmoR5H#W7^q(g*ln}S39BBI^D+MO3WW=orVh}*@N5*i3aDlpX< zmdHl3Q_*te#GSrWZ%pSB21Q^GPCtO2hx|*-mr6+@fODAZCF0HX$Mu8nnx(X5_Sd)3 z>Czx6IW}HvltlV|Sr~TN%=HH^4 zvm5p=F>29WAMBdv)Xm(AH^*m3Otgt5Z26NEPsjD}YSJr1Am+%!u zY3XElJ@r>F%)W|F7SEoy7MwJ7`3skIS=IE$q8CU4*EDYDcyGkHw4GTjLECI)G8?F;@);rxBUAwtGATOZTsVoTCkrY4B~3WpUmcR9Pq3YvKYmQe ztEH5UC#RsO3y9{^G3F6*hdL5kqCnl@jm*_)}@F?=;1y(Tj)TK#=dcdzD> z!?89}o(ny7;Im7YjUml%7Kd%n{_X6{hK8#{$ncc>hGfXD4?CIlfSD~6+6ZHJigWK8 z*Ge+rT8;79)#O~+4BqPm>yzm9O!+lEIeYQY+Z31llKM@jO0&tQJk?eTwt{v|I~@(T z&Em>$DlrMkmba5M_gYuYy6aGt`-ZBQGlVKF7t7=Z-U7#MLpC=s^cR~jjx&Y|$NqAL zV`y0pnvF?Ljz~53j5Hx^(xtCpuPn5>To$ce-=8cnuX^H4KQAQe`pWKXS0Nue3xp3H zw2O?9f{F!-9f*7g(IOB>%ig<}l-jeuBVTktIv&p>+outaTjl5* z?(bwpS`2??Z&KLbaJo@^#AU`TH-nnUNI>a)JCZ<1yR$Y{Hx=mO|ZU~1s_XA=`eOf873>!kZ79M?{d6zrfOZGL# zp0W9bw)=@4^XT(jumn&VoGjX%bv+9Bv6yWqo+avCh33{f&GarJ;ZK!T?+)K?UUSza zUm@W70qK3l=XQSDyP}k86N~Sn$x+h%T%LEe?>RXf$8htnw~g1OiH&_LWT)XKJDH!Y z^OIGNtcyc(H{1G4RD73CxJ2hNh5aQ3K|1uZ2$3%=IZ-c-sE8zu-&8GEj~u4~Gqk3B zlGDpRDQN{o#mKCzRc>I`IPXKO>kG3xHIYAsfp0PfxwXm3Z`ZXNx+>KzYchAvMbbw{ znI)v;jO%^7o~%~=_XcuD^2;nSsb$OLLH{8`wgNKLX4x^NiwYa}Il=YG6U;+Nk=IHj zV4R5Bj1@tfcMs(s=z>C1$e!8*xcRv~r5GTv00z)v1Rw7#0!oIG=rY>LVm9N7coVv^ zQ9j2x;vcU^+(UDyuY-?(?Z1?wKLDqd46GpvUz3W5&iv=I1UNUTZ@MD*0IA782!<&X zoK2Fyrs*Eh;>AP#zZPbL=tr0*0|0{|std;>5=8cTcrojNDTBZE^{4-zbw{wNjXGOh zI*z3u{cVnNSkn z;Tk;{As!iFT~Xi~S3)Vu_lQqi1CF>zWT>=K+3-EFzEuW$;uBz_xfuryR)3cE=~HJENw1l#=?{e_7%C2-Z43O&m zX05my9J4VUr!<{rf!>`x4z6>p@S*1n@;UsRPnxXK=)iWwaoeg35lP%@ zIOUbgD&`xyVJ7ve#US`mM+8_ImXy?Mv5xo6f~VB*pkGLwl)){?0a}}H@0DNeI8jE` zbHdn~Rkgf_)COHkV%kO`^VJhz1xZ@|gQ+^*M)iV-G~0+&Pj^4t!sUkDq^KPX%Y}qj zqJrZ4a)+Yw zJ%+#2F7_gN+B>7Fr(|h-tRTfHV4%QXoM?*iX<0-YwaZF>!i_x9)G)|Sy6=u*hX%ED z6m489s-B?1o=Jl>+6vjX1u6HR28yl0@d!{4E70d@#nms=e;U-T^iTZ%^bW`_v-*n2 zi|582PF!%+9TNqjCa#DD)y>l-<0hj{#<21 z5Grl22-RzWB2nNXkMe>W9Sr&@hb&G`!`TdVU40(?i7AvcRoEdMMO-c`$?oTBX^>~P zw}PjhPRei`MPqbcJVQy#D=DWmkMFv_DidES$hVCIqr~w^I`4AC55Bq%*-kp5BS-Xx z7^RPX>p1P~9n`0c6toVxBwFf!JMf0fl>j|@IHCeKstw`W{;eDzXBX<^%G(adh9}=T zary096)JJg@Cm;+U)xWbTsh4R?q58uA+5fZ+`39?Z%OwU9oHGi>ZuC=lW#zuL2Y&; z(^2{LMXL*ZE!y}ifpm+#7n9+yOXOc3zR>4M(V_k1(5X<3wDz3g_37QKr+bbUDug?U zf?05sC_<7e3qneEFq33u`!}#g#|&KhKgi^7;hCq=_~a-|WM36{Kmh|7NKY(1 zu3WW7AJ5oG;z1Y&?MAR;0_qzb`>>r1Jdxw-N6N69AIsCaFDlFk@O36>-bWCO4<@xp z9?x4i=j-#Td(&iovRnIQF*H-B2t)r#!TEi}55lOLog3@0cfcN#J`v)+d_5l!a98tm z6wYQQ{7uy<{!|7U%IxLvw@$Klb?u;B6UMnPlUcEM+WqJ?+!de_C48=$#vdP>V^Ad8dCQCPH_&PRJvc=DdKt| ze(5!pv0~miw6A+G)W-{6?8mA36nSzoVynuvaC`HLaQv;ELQ3e4TS*pyV~Xr8$>j6g z9DeCuMgG!b;o!F3mPKM24vf1YvPIwb zp{IdX=-nM}5XT5^I{Uij{FdvID;tE1LrsnBx~*9)9%J-*@hi?R%NEVCvA}p<<+?r{HE^rA$R2VdhMO6xmGD{4ATa|Y5UVC znkp^rvLk-SeZsbUTpOiAMo;lWmG~ikS^8I|vK1kmB9)!8g}$w%*>{olCPv&Rgx4=k zR2r9wDHi)X@7|!N^69L_yUrEf=IiUBnrohQ_hgI_3eQmrq1CP& zglBa>4428=DFX0+76oz}Cw*d@E{DM{)gA2UU5hndUPTtvXzdK25T9{jV;k8FrZE2v-|zA4Coi()9_ z^#P-|tHU4o2K668F!iTZJ_(g9J(WUWacwoZa8Y293?Jvqvy^K~_Yzj1NhR5k2{yu@ z<%=Rc9ZsxrA&pWzjJ0a5^0a0mj%EBh4AgPB=hF!`WcYl)3X?3#|m zvO(arGYA`}P|c1t-pI@6u<8`J-N=(W9_FFHztZHh47H`PB^!5Q`@fV4-o6>1VY<=j z2d+EPK>KO@@XkCDhPswa&FZF%wyB=0tQIB9t!)jYL-Zc3fg$=4ktlId0N=}#aJ zP9f{KGA>5`QIeTumq}6>a}oZdKrq!q4I!Ip2Sy&G)ts3+&Q7+QO5vIBnIc`=-$m1M!4KWgeH>)H4^FvgB zO`zh1{z0PFs(9SM=Ux9&y$rICNG@D(^O-ku`3c-|rfP;@PaR{tmi{QgDO3Cz3&Y}4 zbH6}7%xkhIK+q)W>6V!w(jAWkr|8c8m>1|)y8#1vsi}ymNf*^ zNZy?7ve_jso%jDbx3kt$6CULDJJXKw^j`6%#eeWeL!;)ky{UB{R;t!v z20=Z@&v<%Q;j}v_6^m=>%7wRer@1c_+cGdsLo$8n+)74Auy|Z)J}&C50j!I-Hum}; zUhUo)db&d-B>E@NKyTP=Rj>mjVc25Zttq;F!s8%e8XTro&KB*b4fZ`49y<@CDt;As zq9IR)UpHLZ{_R)f`~{%Kl>rv7eB(TA17-T&&9CPky!{=*CRY6IdvkWx(YoPeIezx) z+J+a82KBwLi^We5wh*NJ(Ue{3hDxi^fnn_Vl}5&itrrh6h-Aw5 zpr$%ipG&=B?2&_#Mh`~%Vo4ja2uEKi?ugQ0!>7cL_{#7_b~xS{uoFQhQi*x$``d6M%pC=yr?QQ2u~mT>eS{ zesI;&WA4)H8d=Aa{PI%NlU!%!aKGi7N<&;Nzn{1=;O5(Jemce?3bns#9?#iq)y1tV z*I~_Oc75*)KV~-#dWZ!B+c6LR0DSb}8~J$Kf#Ct3iOE)T22l?>2{%dx)Gro!{K;pU z&9Z8hQxi4(F*%YRfP{L#K#juN01c{UW>L3ae$f{`sE5vQH;bEPVHbQO*8(%*<7Fn}S%r{FhTC z`zkk@WuS|Wdc0wsvI+*{L~Lm0xNbqgHR-e?PxjpkyV0gI8Y(msR1i+py#8`n_u@TQ zPIRdF)aYYlz_nI6h3dVsW7N5}&OBws^X_WwGqN;Fz+y}}(u6;ayjcxHQFt9Mm(}pD z7w_~s8wC_t%bn^7hSJ0O|MzJdp62+leRy{3ZC7|s( z)+l`QT46`0uidv&?bKTn#&gZGY@T`BKHA`(`VTkb=2Eu8-t4U$cyurzTJ^>H<4i^M zXznYfydFx(vw3y`4}&*kSa@o*Ge}=z3>d`%d*(@wy?^vbF7fbmE_|n6dKI`$WT2sCC9^fUN=jsV1{>lYgtL0zN6IyWgI?!N{)+jb{1=HuATS~&~?S|#3F!8 z1q1C~qO#4p*VFz5*K%diB?0cA1VmK*el1S2&EkpVqq{vP+l>DMh`(b}yNtW<Sq90zGGSj6!9X=LeZ#aNpnxKP zn1DA+QoPax3Xn??VA2ngyz>Urz%AQyfLj7f}L#ACw-X zlES%A{JqKFuvwC*~9{aO^O;C|W zRhn#yywv&7)!H~(f<{P~eo^mSAWVpBX{9%{J9KtvG2Fw%y4QMxD*e;38vr+vXWaTo z5E0y+6med3W5~Ll)gzp7+(?Q5KwJKi#rOA1%+8)vds+4NugI-k_hZeuUT-O?S~B>> z##~#>xX=7jA-Jc(?|JBHoNWl0-k6J^Rk9v(PalmdDs_B%q}^U(YGz4XtIaf$hNSc1 zhlfu+%Ukjfu~n2%AGnG9le<(jEb+KLXH`B^$>NAm(0tt5CiymWLd z<77~exJ_T_dv?N)s)JsV)Tg0WJtO43hw*YjE40ahZFb_}qj3@-Gn)@ZAiVRkeVr8> zZ;Z$rw4$IleH%{?c*ID22)BiZ?&;YN^0n3h5toc7NOsr5RI3n2K!AB^S9(@Zzj%PB y0#1HGKkvfSwWKmFjj?;ako9EnwlbhCa3xOUDDt+wO25l7PO~(}ps1#v5B>)u@fL&t literal 0 HcmV?d00001 diff --git a/docs/en/docs/WasmEngine/figures/icon-note.gif b/docs/en/docs/WasmEngine/figures/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/docs/en/docs/WasmEngine/installation-and-deployment.md b/docs/en/docs/WasmEngine/installation-and-deployment.md new file mode 100644 index 000000000..d2627e8f0 --- /dev/null +++ b/docs/en/docs/WasmEngine/installation-and-deployment.md @@ -0,0 +1,324 @@ +# WasmEngine + +## Overview + +WasmEngine is a lightweight WebAssembly function engine. Based on the WebAssembly sandbox-level security isolation model, it provides high-concurrency function execution and millisecond-level function extremely fast cold start capabilities. + +**WasmEngine Architecture Diagram** + +![wasm-engine-arch](./figures/WasmEngine-arch.png) + + +## Interface Description + +The popular FaaS framework in the industry generally uses the Restful API interface of the HTTP protocol to connect to the function execution engine on the backend. The function calls the functional interface. + +The detailed interface definition is as follows: + +**deploy function deployment interface** + +- HTTP request type: POST +- URL link: /function/deploy +- Input parameters: JSON format, {function_name: String, function_image: String, wasi_cap: bool} +- Return value: HTTP status code and message content or operation error failure information + +**delete delete function interface** + +- HTTP request type: POST +- URL link: /function/delete +- Input parameters: JSON format, {function_name: String} +- Return value: HTTP status code and message content or operation error failure information + +**list query all function interfaces** + +- HTTP request type: GET +- URL link: /function/list +- Input parameters: not involved +- Return value: HTTP status code and message content, where the message content includes a list of all deployed functions on the node or error information about query failure + + **query function query interface** + +- HTTP request type: POST +- URL link: /function/query +- Input parameters: JSON format, {function_name: String} +- Return value: HTTP status code and message content, where the message content includes the details of the query function or failure error information + +**query function query interface** + +- HTTP request type: POST +- URL link: /function/invoke +- Input parameters: JSON format, {function_name: String, args: HashMap}, in which args stores the function parameter kv format is almost correct, for the function parameter type without key type, the default value is taken from the value value as parameter +- Return value: HTTP status code and message content, where the message content includes the details of the query function or failure error information + + +## Install + +### Environment preparation + +To ensure the successful installation of WasmEngine, the following software and hardware requirements must be met. + +- Supported machine architectures: x86_64 and aarch64 +- Supported OS: openEuler +- The user has root privileges. + +### Install WasmEngine + +**Method 1: Install using yum (recommended)** + +1. Configure the openEuler yum source. + +2. Log in to the target server and install WasmEngine. + + ```` + sudo yum install -y WasmEngine + ```` + +**Method 2: Install using rpm package** + +1. Obtain the installation package WasmEngine-*.rpm corresponding to WasmEngine from the openEuler yum source. + +2. Upload the obtained rpm package to any directory of the target server, such as /home/. + +3. Log in to the target server with root privileges, and install WasmEngine by referring to the following commands. + + ```` + sudo rpm -ivh /home/WasmEngine-*.rpm + ```` + +**Method 3: source code compilation and installation** + +WasmEngine is developed in Rust language, so it relies on the compilation tool chain of Rust language for compilation and construction. + +**Rust locale installation** +* Rust openEuler22.03-LTS installation: `yum install -y cargo rust` +* Or you can refer to the official documentation to install: [Official documentation description](https://www.rust-lang.org/tools/install) + +**WasmEngine Compilation** + +```bash +$ cd WasmEngine + +$ cargo build --release + Compiling libc v0.2.126 + Compiling proc-macro2 v1.0.36 + Compiling unicode-xid v0.2.2 + Compiling syn v1.0.84 + Compiling cfg-if v1.0.0 + ... + Finished release [optimized] target(s) in 3m 41s + +# The path where the compiled binary files are stored is as follows +$ ls target/release/ +build deps examples incremental libwasm_engine.d libwasm_engine.rlib wasm_engine wasm_engine.d +```` + +## Instructions + +1. Launch the WasmEngine application in a terminal + +```bash +# The wasm_engine application requires root privileges to execute +$ su root + +# Set crate and log level for RUST_LOG output +$ export RUST_LOG=wasm_engine=debug + +# wasm_engine listens on port 10000 of the host by default +$ ./wasm_engine +2022-07-28T12:32:10.007200Z INFO wasm_engine::function_store::local_store: no persist json file exist, restore end +2022-07-28T12:32:10.007255Z INFO wasm_engine: WasmEngine listening on http://0.0.0.0:10000, waiting for request... +```` + +2. The next step is to package the compiled Wasm function binary file into a container image format, upload it to the function image repository, and wait for the WasmEngine to be pulled when it is deployed. + +For the production method of the Wasm function mirror, please refer to the introduction in the **Wasm function mirror production** section below. + +3. WasmEngine provides Restful API interface description + +The following uses the `authentication` and `hello` functions as examples to introduce the deployment, query, deletion, and invocation of functions using the curl command. + +**Deploy the authentication function** +```bash +$ curl --location --request POST 'localhost:10000/function/deploy' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "authentication", + "function_image": "127.0.0.1:5000/authentication-wasm:latest", + "wasi_cap": false +}' + +status code: 200, message: deploy function authentication successfully! +```` + +**Deploy the hello function** +```bash +$ curl --location --request POST 'localhost:10000/function/deploy' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "hello", + "function_image": "127.0.0.1:5000/hello-wasm:latest", + "wasi_cap": true +}' + +status code: 200, message: deploy function hello successfully! +```` + +**Query all deployed functions** +```bash +$ curl --location --request GET 'localhost:10000/function/list' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' + +status code: 200, message: all deployed function info: [{func_name: authentication, func_image_name: 127.0.0.1:5000/authentication-wasm:latest, wasi_cap: false}, {func_name: hello, func_image_name: 127.0.0.1:5000/ hello-wasm:latest, wasi_cap: true}] +```` + +**Query authentication function information** +```bash +$ curl --location --request POST 'localhost:10000/function/query' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "authentication" +}' +status code: 200, message: queried function info: FunctionEntry { func_name: "authentication", func_image_name: "127.0.0.1:5000/authentication-wasm:latest", func_local_path: "/var/lib/wasmengine/functions/authentication/authentication .wasm", wasi_cap: false } +```` + +**Call the authentication function** +```bash +$ curl --location --request POST 'localhost:10000/function/invoke' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "authentication", + "args": {"arg_uri": "https://abcd.com/uzid", "arg_body": "sun", "arg_secret": "755d0845dbc22b3ac376ae73c82996b7"} +}' + +status code: 200, message: {"status":"403","body":"

Auth Pass!

hash 755d0845dbc22b3ac376ae73c82996b7

"} +```` + +**Remove the deployed hello function** +```bash +$ curl --location --request POST 'localhost:10000/function/delete' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "hello" +}' + +status code: 200, message: delete function hello successfull! +```` + +## Wasm function image + +The Wasm function loaded and run by WasmEngine also needs the management and distribution capabilities similar to container images. Therefore, WasmEngine reuses the unified management and distribution capabilities of the container image repository. The developer makes the Wasm function into a container image, and WasmEngine pulls it from the remote image repository. . + +Developers can build container images through isula build or docker build container image building tools on openEuler. + +### Wasm application compilation + +**Rust Wasm compilation toolchain installation** + +The Rust compilation toolchain supports compilation into wasm-related target target formats: + +```bash +rustup target list | grep wasm +wasm32-unknown-emscripten +wasm32-unknown-unknown +wasm32-wasi +```` + +The difference between these three different target target formats: +- wasm32-unknown-emscripten: In Emscripten mode, the code is compiled into a wasm application through the Emscripten compilation tool chain emcc, and the wasm application will also rely on the abi interface provided by Emscripten through import, which is usually used in browser scenarios +- wasm32-unknown-unknown: Wasm standard mode, wasm standard format with no external dependencies at all, does not depend on external interface capabilities through import, usually only has numerical computing capabilities +- wasm32-wasi: WASI mode, wasm applications import externally dependent wasi interface capabilities through import, and through wasm interfaces, wasm applications have file directory operations, network connections and other expansion capabilities + +In server scenarios, only two target formats, `wasm32-unknown-unknown` and `wasm32-wasi`, are currently supported. + +The specific installation method is as follows: +```bash +$ rustup target add wasm32-unknown-unknown wasm32-wasi + +# After the installation is complete, there will be an (installed) mark after the corresponding target +$ rustup target list | grep wasm +wasm32-unknown-emscripten +wasm32-unknown-unknown (installed) +wasm32-wasi (installed) +```` + +**Compile the function samples given in the experiments directory** + +```bash +# Compile the sample function given in the experiments directory +$ make apps + +Building: fibonacci + Finished release [optimized] target(s) in 0.00s +Building: hello + Finished release [optimized] target(s) in 0.00s +Building: authentication + Finished release [optimized] target(s) in 0.28s +Building: authentication-wasi + Finished release [optimized] target(s) in 0.00s +```` + +After the compilation is complete, you can find the generated wasm function in the target directory under the source code directory of each function in experiments/application. + +For example, the wasm file path generated by `authentication` function compilation is `experiments/application/authentication/target/wasm32-unknown-unknown/release/authentication.wasm` + +**Manually compile the function** + +Enter the experiments/application directory, or the function directory you implemented yourself, and execute the following command to compile the function: +```bash +# for wasi +cargo build --release --target=wasm32-wasi +# for wasm +cargo rustc --release --target=wasm32-unknown-unknown -- -C target-feature=+multivalue +```` + +### Package function image + +1. Create an empty directory and copy the wasm format application file generated in the previous step to the empty directory +```bash +$ mkdir build && cd build +$ cp target/wasm32-unknown-unknown/release/authentication.wasm . +```` +2. Write the Dockerfile required for container image construction, as follows +```bash +$ cat Dockerfile +FROM scratch +ADD authentication.wasm/ +```` +3. Compile and build the Wasm container image +```bash +$ sudo docker build --tag 127.0.0.1:5000/authentication-wasm:latest . +Sending build context to Docker daemon 1.787MB +Step 1/2 : FROM scratch + ---> +Step 2/2 : ADD authentication.wasm / + ---> 897a9e7a1ce6 +Successfully built 897a9e7a1ce6 +Successfully tagged 127.0.0.1:5000/authentication-wasm:latest +```` +4. Push the container image to the container image repository + +If used for local development verification, developers can start a container registry service locally through the `registry` image. +```bash +$ sudo docker run -itd -p 5000:5000 --restart=always --name registry registry:latest +```` + +Push the container image to the container image repository: +```bash +$ sudo docker push 127.0.0.1:5000/authentication-wasm:latest +The push refers to repository [127.0.0.1:5000/authentication-wasm] +720b9e537c85: Pushed +v2: digest: sha256:a7b8e58e4b9c2abba6a39636dbc904e01c4cfa7e1d4cc6a97f8e955e148af41e size: 527 +```` + +## Precautions +- The Wasm target format needs to meet the official WebAssembly Spec 1.0 standard +- If the application requires WASI interface capability support, only the Wasm files compiled and generated by wasm32-unknown-wasi compilation tool chain of wasm32-unknown-wasi in Rust language are supported +- Does not support setting resource quotas per function call +- Only supports single function running model, does not support calling model between functions +- Only one wasm format module file is allowed in a Wasm function image \ No newline at end of file diff --git a/docs/en/docs/WasmEngine/overview.md b/docs/en/docs/WasmEngine/overview.md new file mode 100644 index 000000000..04ade34c1 --- /dev/null +++ b/docs/en/docs/WasmEngine/overview.md @@ -0,0 +1,3 @@ +# WasmEngine User Guide + +This document introduces how to use the WasmEngine lightweight WebAssembly function engine, and introduces the generation method of the Wasm function image. \ No newline at end of file diff --git a/docs/en/menu/index.md b/docs/en/menu/index.md index 43140e2fa..ae0a25e59 100644 --- a/docs/en/menu/index.md +++ b/docs/en/menu/index.md @@ -222,4 +222,6 @@ headless: true - [NestOS User Guide]({{< relref "./docs/NestOS/overview.md" >}}) - [Installation and Deployment]({{< relref "./docs/NestOS/installation-and-deployment.md" >}}) - [Setting Up Kubernetes and iSulad]({{< relref "./docs/NestOS/usage.md" >}}) - - [Feature Description]({{< relref "./docs/NestOS/feature-description.md" >}}) \ No newline at end of file + - [Feature Description]({{< relref "./docs/NestOS/feature-description.md" >}}) +- [WasmEngine User Guide]({{< relref "./docs/WasmEngine/overview.md" >}}) + - [Installation and Deployment]({{< relref "./docs/WasmEngine/installation-and-deployment.md" >}}) \ No newline at end of file diff --git a/docs/zh/docs/WasmEngine/figures/WasmEngine-arch.png b/docs/zh/docs/WasmEngine/figures/WasmEngine-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..e29f5a6efe84c2254f3679c300e07ad3cfdda0db GIT binary patch literal 58081 zcmZs?2|Uza^goQ0tq^UZ$eMkOWk&YhSO&w)*fSVopE0&Ema?|Vz9gigBzwt{ol2G{ zTSS&@k*y?Td+zl8{r>;w^}L>!q0ijUz2~0uzUQ8E?meel=17ARtmj$j=;%%$40Ta- zbPP!Fo56exv@|Q6siC7|a|zJ14)CG4d3fXLMC5h;dlG>{+=>1HBJ#Q-P^g|a-X(xc z^aYQg-G}Jv;pTyN{qG$V0)ym7KhYyp}u+{DDGb;83{jfBkU;yzl=IG9^+y zyuEQEP<=%i2q1MC>*4E44E6_)NGtG14g#9xwZRj3p``HNBSlF;9JFYWNZxoX-r3kA zfHqzpCL^x|nlBq0TA7-NKy|>gw}%%V{9}N3@gmZOxRPVMoyl_%Kw#7A0{IwqX3#Lac(%W$Ny_G8UcI&j_{x4@)%zqUDF^h zALBq5TijKuk`~PJKZ%3zWPc9;*FW(7cWT<;fDjV?zgAa#kcSK4gVss{2>Jg{XIhKA z9#{rf4;+Dv^8v3t{s(Di4{tqRXDrkNVH2zkzlwGD(E9ZFNdG1i(SwO->Cip^ zOzGf}X5mY)33j(IgL;`68U)%{A&kff3$Fm68QK9D4}X0k(i{Vxz2pOJ z;ek}7nFYnvKu1B_hhU(qXJ+V)AOIq0Un6VF5O*}e3ypWTBwJy8wNRiLZ|RIww1yZF zNQw{_ZyS=2w+qVK+uFbwWfV*_3qgP`=2UYN`2br|ps$Ow8Ah$w;|+1pqibg;q(`xukJT-rVX6bQ;%(G~AQvh?$G z(bW$&G|+}w7+Y)kxEMHVDHB}fe6VnDWPpvKr-yBbA{D3L53zQ!a-k|2>F6jMWAwD} z`XOc}NWcLGjRx@QLrqZ_Jp+9r+7@a=(`ppL&;xCW1L$CoAzIc%q#kIr@+T`glhMkG zCfZne2-?@x+z0LzfcHWB>bQBEd%*o+y1FoB4>JUfU0;+B4f9|>@JG?wBM5DUaUq(U z!xT}z77$ZCVo->oxeo^I?G5^(b?_E2Dn5kdqNt?}mA67^xdtgAeG$rrHX&FXO>r?O zjJ2t+vZB7ctDBcL)=kb7i_j&yC{bOVl@Xp)x1eCHKrMVQ8e-(_uSdpelhJ`jfUu67 zf;Yq~(8bil$2dSQ04%OPo{Ui+em~Hzs=#;b4@dQn0I;g*?SjACC3Hk>tHG1|+h%BE-f5sq5`*Y-yl~AQ2!Y zSa-6ku_@k{W^4b|VDKC`6h#Udu4`>bv2}w3W1$}u zq-af*w+&YIBAQ|?$<_pac{z%?Ry4-KyuIaMF6QRmw7p=VXY6ebS0s~2U{7oNxVvKE zL8bv-;Ehe7ktYH|&_e2&85=p{wSzHM@<S-q@E{@4L>U~CcxZ^jFW=~JDX8G;mQy_U1bkTA{Iq7BI?n$pu3Hd zkvrVaLWx9hg?hUydIb_-?m@KeKr-=ngUex2NK=%T8v*X^p`Zi<%@ln_XGJ%nGei%9 zMY|ZgQRR`kfkdC+K$IE9NKamYAm`=oh6mIvycLzS-AvqrU@&6^n-D6_S%-?W@b^p~T6bwUn1=tXj1C(vi$~49D#>hb|wa_>V6ojB>N`xu6+Q3LYx+D(@0cIel zWlgp5G?R1p_X|eRmIPx4@ue9+D=(bCpOzL1L)A0URVH}q*^qUqzO>zmGxyOYT6miK zQ1wDEHWXvLzJ-r%Kp>e24Gtk1gqV8h;Y@?b&PEE>!NCFkfoNSLpmP?+5G^GWb3=%h zs}TeqLQ&8~`gu5$Onq#8e7r1C&iZIqw2!q}kT*5ZR#8h2fyG*fU=;LlR4c5vwK>Jg zO%a2!wRC~O5D>JtJ`AR%1@}_M8Y%d|j4|d|f_Z?xCBztkv+yy4*aY~w0XB_D1S~25 zqade4^zt>-bwvidyXj*U72xi{CeBztV`GRn0cHkOw)HfETe-neWMvzSHDJWeUC)zX zY6zh4BO+1CN)$J1Wo;zE&DaYAH4K8vg-~_pb4Cf2y%5G>Z$0Q5mQ8!P!KYsneHAXeUbMkF-SMJJe~ zhsR+J+_4_IJ~~QN9jX%53Z`rh!F!OrbgcAjAUJ;$A0>TvZCfktpkRWot|gMFXz3$o zPDLA00=2v$LEdsmZIXqL4Mxs@WE|}3B9C-O`&t_j`I zgy`vc8^~dhUal}NoEKFYPXc3f+!f_@Jq#hpfFLM^U_&#-D3UXk7H4UD8p5bn9v=GM zekih;t(Ci{POzt|yQv=9P#5Ax2J9&ilwEDHif&LHB@?I)jA-hKF|i`p(o8nNgCy_c zPXSNn5IJoHg+OahR~<{Vl9mnHmSBm*V_ghvD1N#jx(IoH%OJQJ0_O*KQo?9c-Cb?G zf(SlAP(^&8FN_MNamBhhD+8Nq=H_i8=VIs&LnsEClI8tj+FnQtsIsT6qOz~E0ouw0 zud7dlVf_5T7_v7}$yHa!h9sxtY7pYC4>!lcjIaTw&NimLSYJIePd}(DNioD6Kov_AiP9 z-~T6`meR6QD!rYFSYnmvfl{tn_%}ntwA~s`{vM^RnqtUO|aJj+(8ktjxD> zGej}43ckJl__6a*Ugy@R0|~)r4<9p2m=vu=kd!XD*-F!H%nc}r2!e&N||*1~w7 zNu&8*evz$@uUXH=u_V#4FeYfCJS7o6l&6F4REsIrlLg8I?|oZnuuRH$&j~GC?K5{6 z4O`eF3zkYnUg2OxpJu~UTBX}5(mCvF2YUUV8)c6whg!8+e5y>z`C`qL;%OA%{a81| zL0Dgyo@_OHTK=%o7p4rNZr5s%K6y<}e@;7b24Lr!?G- z-TOcrpOJ>T>Z$Nuxad_P_pQhFziN-3i)4(7X_@~0Dy1?s3rt*O#Mo`wI72*<(!bMu zE_Ap-yh33bQ8sMuIk+Y~)c<9>S)eBwhzVmfG8XYaoJ^_o%9?ds!FUXNMq~|o_`ft* z43)|WD!(stqgvKHYtSbmVbGiM!hi<~VM)>?alapFwEyFsQ_jkg8WhbQ9bMm&ZvNUq z@~QY)M%7K*2V#m#c~&fS5CoS%q~=L@t$)$-*9LR^)keSIqDkL}D~~C{IsKpeGWL1r z4Xv!=6|NkdFS511E1Ew14Bmg-2C`_9DcxJSEDLQ{Gtnei26|(SS$xWswy%RMi)v}@5Z{7P>uN0vg zvzRJ*(f~h$%&z?70%MheTLG_;xdahNoR>uwui*Oht-)W%g{mvr1j0!DkTzRfD zwq0*ISTPn3|B;wtT^g&P;X*z)_&)Ho(&6uivlk|WJxuEnEAI+p!^3T~xCH2vf0y3D zAO6V`se4!1|GVm^Z}JEia&+-p*Plr-V|(q}RabV{Yi>d50O;GCBelzD@%JB+^u^fI z)2M}UW^YXtJHKocFK@ftej_%Nl#zQZ#z)OY4v6@RQAsKs!MgFXz;A)+iRTvPpAJ|K}1SY&p_0#*JFPsQ z_I@m*hh3jRSm4F<)*|X&rnq!pj^Ix;Z`_5HsO8)jexJ;58JnbIa#x7P>?)ikoGiMK z$jxTc)W=am{Y%RpT$xs5;w&|1#NaXQa;oA_9x42wxG)OghY$i}7H>O6y9B;35~j$D z(rC|MW))6@Kjle2#$rb4OQuf{Dxr2M?d%Max(p|gPTg16jC_ZYa{}xJeuPB3>EDyr z`%QfM=5!c@IYStO_S6hsuzQ1b_$n(NsB+`N^^(Ts?u0orBcoDG|Myz2wz3GoThjGV z26)8Lj*8lB0TjHB(8(#x`IGT-j$jiTCml0(p+%%PXS8ViVk4h1LLos%^$b3G)n zzQwp?fxV!5NppIZMLJG|o{NOI-gfIk3{c^57IS!PDBH^j;VA=#Q^<&z4<*35GH73K z6BiiC5@(4K1Kg~8V~1}u8cu0|9?K_ydZ-HlQu1jgHvt7hK;fuIdxf}(JIRTT*L2gD2(||8= z)v@$fg7jS5iFC2tp+^8(eSp-?aS?9N$czFMw7x*3&alJ?0?y366*IDcx#9-R4?a3u zgNZW%6C+wch_+n1Sj*ZP$PWXC2mslv!AK7fLO=k#XNbzpO3|dy!08LZmx9g*K%zGj znhe5I@_>}OPG<~*$<$bEbJy4Qyd=A_W~)_x@|`zt-)4w^+KX-OOtqX$X}2+O{X1yU z|LCh+hKP)`bb68OhZKkUt!_nZj!YboBWAbbq-YvKp@ldnIe)sRdltG&lWT*Q!>D=J%Er!xamF9qAnT3A>( zJ~_Rbd^xABF}AVfs+QIxSNuZSom`Zn4J#{~h(_~Ad>8XsetxXz@ncCg{NX~;aV9A< zV^vA8tLG&cl+uk_( z!e{p)dOMmY>(`&%!_=>#f4WOy4wpJE4h&ipy?p(kfRXEBe17x|br$LgtvD*-k!NSy%_fXQBMiEd0}?GGwtj|`dZVWY40-maePC$nX+8wy>qf+L2wKg z*SF|;dda$gQ^@q=BN98Z%{EfS!`@XrJp9`eYBFimKrggyXZ6a6kiYs>0Szff8D-@V ziM(T*1GB&G^racgEM63tLD`^xJ3CHJv*P zIZM#HuLC_ZPGa1qW2nEEb|3D&BInv+W(+t`Axl~_jU3IGmsMvARj1w`i8k%{Q;L6A z?>~2^{7ky>OT-NI*PHw;!@EmEAS$4Iix?!_R$n$uVds_j=jH&&y zg)zq0v1zaF8^1`E=-mra9PIT&9%ndBfPR}>^Bhz=-uA#3zP*|1W39#cZ z{^{zr;z4}%ZQ0}eH0Oghak^6X2%EclEq4?`-_1f_p1ped)bmTw-TyeEVFA zV$-RhnADJ`u3FM|g zF+ObLt89W))l}rr+!AkGX65S{n2D#x{xn66ukL@ug`bb;`(Q*FDzOMkA)G?O zHeVO?yqIYE9UVo~U9lY!5q&1VkAlP0b6g!ZQ^ z(49pXejp?Fd6=w*icwkPUsanw3zJaKafLbK3fDy=k1w@Nd;`xb1AdTGpt+xmEsMv! z2Us5{y>fXN2al@zJ3o>6>>;G?GorXixA+Y5b;SLnv8lTKHnGX)(Av zT_Ssvx27|v?`&6sL+D)WBER82_0`Zey&V0uXKQDrQ!Q0$EHS%PUlh|?t}7x672R|- z6o;du(|Kdi&5(pjPQ_~_+Xg$A!hddB+<}*T&ySmYo-z1qgKZEs_RQdE(IirRk&>nG zM`kesL%5ZYfH`zKh3qYf;G}T#H_3m?oUv~#JcXn`_cp$*GuP%z=G$oTu#b(YRw>qx z&kvRx@GLYh3n{1EOPac;#j}4ahoulBeZIS$J3(elD+x#XLH1+{S-X3Si2b`+;>f|doxN)stb2K@e5BI*k+|!T0@VG|KG!zxa`8K-9JdMl{4#}k{f_B9<1?m6+k&9I1B+~P4_n@8}RtFsjxoRhmPlpot| ze{pm5u)gHx74Om4b~X=^hzs0_*qPR+A5>;z*gK3+-z@I*g)HPe)=kPaxYMi_%JKeH zO?+DO;b=*QjNEE#*HKvXk22+}PfEj|Kx~@6H^_7abC>b0^&I3$^qu(ZD4bohn!;k% zAj2Pij(M~?B| zOI)~iSiJZ1vj&5tS*E2*7w}LrSbK7YOX+Tw$6Dt{rov|d4;}>Mjl;H&71oRXewbgX zG8Vjye*FIXOibqMAB$q|Pt@Ga$h+q7sQ)e7{`Pk0>>s=G<7*=4l^11Rky6I1Pe}?3}2JxJRP`S%F4KrsvE33XkSWl~!X$efVsuWDh z!7u*6%jI8&%1(NCm0KivDCtkTZq{c#l3P*P-Aaqp5moMruJ}^!*){v<*N45Ud~J&_ z?)0V|1glB#hyQiR5?;7=@K}L3Y<`OaYZefYW@Tn-F*7!pIgyFWe_+viw~b|Z_0!g* zs5rX#ncwDtT%W{`zaJW9(YQ@(Cd@)^`19j@Pz&|lUrYwoX9F}$rBBN?GwXN)>J3Yh~PiiU(F#J z>D}D*V-Pm4v8Sqfl({tCEOiRG$`h-@JoAF*U5rv` zcKS*E5BC+!Rh%|eqB}WC;FNgv9JlV%Iprt&x;_tNxxAEbHqR$fT?aLJR6Je_UEBVt z`F>?ISo5ix8cI6P;|{l!D)GZ#)YQfiHtvk}D%pYeH}d>{@RfB(sh3Etx=p+O zE+!B0SG|A37|`;Sy8suh@JiTyAyTh7WZ>AZ#mvcWf3xxOz2f-elT>_zeUJrK z%*nTVz_25}R@pLWNLV*P{+#FE*!C^tn?6U|3#Ch49gAtbKIwtS#?<}(FlDqk4QVmO z;b$N0=2=~6T)Ugu&1RNp?ls1Lty+_vfS3Hi<)-YZB!8e6viK@7Eo7&3aV8!9;!6`N z{m{a@?!gy4$5i&eYZ=%DLqa22MpnzN^q5fXM;%sqex`AGV>ogIE~P+jItf%$1^!l~ z`h0${Pu?%hpZz?E74O)&!GBI*C6Oosn>?s^0dL%2qTp?!4dvOyq???w+Lt*FOzuSn zUYV|i+J)dE+k+-L^0E*MB-u$eRx#PuSZjqDu57;$V>Y3^t80|E_afz^D#m)@JCMRi z>BHW=LWPTxH++Sz!i`#(XJK|zn+ax!4{{w7p z@i-qTo~|TF5>twu8$LiQdhONRF+V%sk(W_?t4IbW<$8`+E<|Y;jw8r3^4MSgEzGNu z@Cg%CLcKKX6OOTG70Y{6m6ueUd#U$|WX6+qLAA|sm9G2Wdj8V0aYzYMB8kle=ejIj zKIUn2wS!7*_s!D{IhLZ6V%Vz@NS6IUhhc~$4x?jcC)Sd)owX88`2+kbw;xYNciG0`EH_mncbkH-^ zpUWmYOJjNIuUI(v#QlViuqQ?nj|9DFsXP@mwC7I$^n&zC4P`c_fOI>)S}EeXoZGaw zAi)^NiOE)4lX@9&Be*C13EwFP8_J4xUXJvU^O;PaC$!;xN z{N+NAOJU=1eMr)ikT(8tr^*2d8Hg_UkNu4K?JY*AB|dG=3efjXl#=`LM$9gxkB0uO=|M zufoDF3rMV;ZX3@(>T8Itg!%lA{M5{Q^hWy2+TxzloHwOyy!&}Q*;jt|^JK7XLLbVM z4?**T*n>rKdg>opJZ*a{82HqFMt?KyElam+#jKMF2zL7 zFIq_|Fi^g8`?l-mWOf?*0+V@LU@PTuZ91t9zO!&UuxpET!K~Gpy}RMG$_#w#AUk#N zUTNRg7XvJNby=Or5Qft<3p2a24fhyOay+#Rjh1E4DaJ{+res|_4k>OmS!*|&FU~x% z5T&_YGFD-#jGFNq8m-hh^5c*7aC@{3N7=a+wrlvcM|0oL#d7EHRz`5Jopo$$*khP` z__e@7Eo*aLxHXc6yhKVUL0 zgKTO;mfo>`$i;ib9p)=*v%W>_E+RR#mE#0eIQBCKlkK-Ezxe1ciEPH+YuEPfa*16& z8w8yhKDt~G`sc09(z$cY!h8hC?o5cMc4k`IGhg}Z&B;3z4wBOaW}-LPq9Q7yAffZF zBClFHhPf8b&AIf2B`-H(44q z$1`oczv}B@*712J*T&UJo4}VizOp^A(^|>bRM@;%jk0OpWLfAvKd@XupF?|%8EKFu7ZE7%}cTiq~~|GOs|9~kZXqbSI6i$?)7 zOdOGsH48VFuE*7Uo%{T?@J*kN(BI-2r=COrFA)o|TW){uGWP6vZ0ZTaCU$27_+tK% zb*^5j%VS&pvD%OuU-m1$FKFe%8<|KXR^Lf6zCP_gIE9NKjuK&Hm{No1wpVj|Zm|d-gm>7t0TB znTEjw49Vy-2YY9XykM_lt5%*htAaXw@5SWQ&m~S%AGtQ)hNBuX>GP(%8Fj_Il=zm| zh1^xRXY2FElAhtqXEU_?YDL|g=b3Jdsr~$(WYl=@?sK^0$HhsRuUOQKg)5OYRY<#Q}t1#4t?y`(Irl8j=~yKtsH)Zc%@b$#V?QFnwK{o8vik{V$U zxrw&CQ}t^Vd&fRA)vYP*J=0Td!N1S*L!$$^iSpWH* zt_L-xd$*PG=~eI4p$q5uuZ6dq4;s{}X!(8n4#jV$zye;EUAg#D-6_58Z89g(mIUWU z!V~DkqBY>FN7K);Q$opYoPp@;JCW{DE`q}wI7IYYBYvZz_NB}Vg}*&d-nint??^;f zUjbwG?w5-~=7~+OH76O_*?6|qAywsJdpp6NizkseQ}GUWtqWcRhvZE%TMbb}gqk;d3jm=niC&+D1MSraqYp zpA)K>`E%R2zO#g**&_H&Yb7t!zH{A))Q-y9zq4h$b7i>1?%PAWeBFWi(~KHoCjA1| z>-?hkM@CX|bA<>FVfE)VaGOlnZSCpzS&NniY^y78@}>39ja_;%)#MbY#=2KJ5w`0e zSad~~>z!>*apBsej&j8n+^g)-bpKk7Ra9wJ?^1h=cupAefG;X2hWkyM{J=yYUmu4> zO!OD0OKmJKY~inbhYEW3{UMJMYHJdypCD{dRx#`6koMNYyBx=2$B2!#$2NZyCCIlJ z7xnS)d}}8>aj74ME+wBGREn5EU0~$mlc|hur^M2kd>pa3aUlS*BB%zh%UAz9)$L)X z0dCyJ(LRYo^@HXMnU06=i-;L7>z67d_4q{>N=}djE*yKETffyAA3QH%5%c1@P_JL4 zX4@2#29xzD=`;5+nR`PPus!wl>WfhhA|prN=LQZJi03RPFdRSI!&tGqJdtcB=@;ED zDmSdEO!undor)emvtw^ z373na&;Je|jsMB1Tk-ztwK4a(A2Bo5RnfJ6-qqb^{PJ|&XWqg2;3dJ5c297s7W-M9 z?QmSxb=_&#nysUk`Fcu7qE)Y#KUoVib2cmov0om*ot*T%qZZ`e(#dj@*_>5iRIO-!iMIU%v7zFsxsD6*%*$n5CaBRJi%+Oxpi zAvjfFH*>y0e%f_n-+9QY0`>LNn(eFk#Pxa0uF{~PY37?pHTKGM^Cv>yhvwKfGlTnr z^Ou1aWzlSKYP%r^03tObri{^MU7gao)v8O19EN>xj2rL zrvFnn4ZX45s&#*0a@+c;DUVI>Py3E1B=ThX<(zT(+qIk&58O9&#IesgvasL0`Kvxr z8vWaH(SskxIgzreirNu&)was=+Lx#8MH>Rv!q;Cl{QTCw^qW{9@BUu6Rm-Qs^U?|F zxZg?+GedOe9#+V6Cfu=(hN-(vSB0)cywat7H_sSTit=B0hN~&s&4UQw#Mm+v?|vTs zE_tcvGpkbuv*b|ER#Vd1yb#UYtv4O_X}A3PwOlQ=H#;xxA?}`incp~5`EKrgGsc?xG5PV&3Wr|Fq@$b65t(h`R<>Pz zb1^K+vKm)yUPA<0tm4nIBz|H&CVAFTdq4Z4?r*y50aIo%7o;)KQ4z@}`@R}KUn?2t z_O*Vw^*i!3%aO`j1vPH2t{xq{%F`) zN|uFD4rCw%eEH7Y1sMo2kX8tbO1=ehG1q}eyYwJuQ_Bq!3|nX1_6=JS!RtNdY#WfX zVT=KJ3C#+5OD<+JKx=xmtmHIHQp+`3-hvmTBEs}R)`xI83nYp(lV~Z5{y1Evp};9x zrpCFrvIpc}9)OI=ub4CKDReBgAhq#^T^r<|RsjK!AF$EjS{I^c71L;Q!+@^zAnS9A zbGavtu`LzMOR1Lh(qj-_=LbFh90Tc+ypw$Hs3gOx5@AU!Rob*nKFAVvUW!{Sm{Xpo50kn}kRGVIzQF=TnU`h2$u$i=V#F3sHK zqyQ7ffT3jpz``^V&4JbnW3!3zYC)cw` zU7gzo)iNR0DX8;CFB4!Xa)3ETu90fbYCh#E^!*%F+vkI;oI#8U%U3UrWgycehO&)P zgBt&Dvd->+iY31cG8!0oXH359lB<7{R+Wa-U_-UDn&VQScVAFMO#kV|Sb<3Z$*P|2LN^azzP|pmt4vWU$*l`C8M8q=;T! z|I%zES7y@r>P^?TK!dut-}fmCWM?$XRI&`s-CG@S5F~r~X)l93Jc3s9@GsZIPyT;X(mo$v{@IgIIk+eI6QNjuFQmuW znPK7?4IipTo-n?e(zYk%F}|Z!bU#S@tu)e*p8Xr?RQcE1I|Yg>Myp^QPii_H{t-!O z+B86v3~S%dlT%*yYS<}c5?NapMRS`t4 zPg~G{y(G=2+0=YdQJq#$@G`x=YDWd|$;=HWyWepNEu$`|+)a8OcqNwPvwT`DbP_t+ zw9In47E%ABz-ZI$k0A6E=xxaLUcFYUx;)GOcdiCL-l}M5!bi=UO{^fTDWZCL5@G;~ zTnbLUvAjF)EAK=H5}O}|NW%Wv%hvJ+Mz`4tFdN-ZklESVkuk~aH|;6uU19}}5TIcgH^&%RqDkUml@2t}aL7MCBXdNLgorElhL>8uga z3qd7?nv>brl2X2DqvQThoeYWFaK7xVXO3i#Dc1Y3%QxXVTcKME@P(~|uH%RnUIuDT zcLzMP&cVp|wiWbe=jI?BTiUc>AQd8=6L1t-9S&mhF14!O>??A}>&zwg!J1!c=5bHy z+xXK)MW0ls48{>8jJfk(Fgk^Fjn^5HSK^A9Z>@T0a8dkZtx6w!LM~HRuU)#Gx$nlE{`}y{4e`DxYSMP(xR9fN5 z$CI@Oe}6nd=3apYE?J?gwW5z9e0|G$a+Kx2cXcrwWdcTh%Ke6s?AwG3DuX3Uonm=u zj*SN@#oyXFG}0dF+<4A|NflKsf7;I*#RGf_jn(2i(u__KrmXogtK;&`1ue8%akDy@v*QiVC&0f22RC@99`Z;G)@ zaq938uF^$#i_K)S>$Kdww;i z>h@Ih3+krl4p1`#dwge^-yMGKAgu0Jmt^|L(nzJt zy?)#)8mZ)#q)R%klTG1JuVJag=hs$VeKwkTcNgE4CVug)%hW#~9k*g@ZT(D_yXRx@ zWOz-7V%W}H=Fvl3p+mX^S~a1M`5(;QjE+*5-xohv#Qx9ZL?@ikS+Rv{l3RH$RiX%I-?o zJOx!jnhfd4sbM=J`oLtM&}_@Yv38QXsestD^VDnr@BBy$V5RV-6EDue2Y>jc|CvR8 zfmxoqdikg2(U_~TK&pUY>wAR$Nwo?Cd-EdSN8tWdI$ft%Ue;h zP21Wwu@W1t`wwVVf_$dq(fu&NXb`k9*KAaI3@~CDoLHpg7h^uihCowWXaTR(wQ~PF81VrY zWMswdRdiWZRh7vXmyU$M?6Vm&Q|sk!A9un6SfEQ^ zNDof&j`=0>DSyL!A33prm^l7#QCjusqL?v4Ds7#}TBla!#$`CXX)0M3-ru_aMRcIBmKU$6-VB%f`D506cF*Ir*9rM zqpfqnFj}@XCWf)ItBWj|vmD3PbpC}dO$w(xP=pnZId1a+EFa@<*7~UTzO~Gn?<7DN z6+=7RKz!{rtnRjTawHwejdjp+h1oy+(Y{Ah#fO44?z9vA#B&56a*UkT4Qkh;gJMAG zs6af+$Y~_lVVU2)IcrhWg&zWQr>A+fLh|Nv+#NdC5<%cP&e2XrGw(KahQP6iPWhwF zKMF@*tM}y5_Ob-1KPwXaeGVMy82(=WH!-7t%V{ui+r8^wMd0<*ZRbuGyU}(J!|S6m zbiF-2rDjL{k08d;}N{`V;@H0sVVxJun_3`rr6>&#V5~Uf9RPX$HyO!)ax8_f!VvFTuW)7 z#Quj-EeWT#eDdMj&WnXf?D&5Y_d~2Hfa9BD|8e|NQ|LHttHQQ(gD1p&zEt@QKCG%5 z{MENLd9B$MkFR?LfBW`rXABFsu#ytyiHk|!_Lgb3Qs>J)^&dftvN4}td$o-@Z*w>)l&Gq>9#^M%Fg77*lQGJOdvW2?RoS{aTY` zpT=RsIJsL|OFQ~4aIl~>cEC)-!P(h)_V15!S^10iI}G;r|BMl_xUXvE4Zm&=_@NKi z!FRB)lWF12YRb$SP7`QK4DU}`1k$IzYXS`Ra*b`ywS%4hQaf14_eVGOGQ{LTeW3t- zJ!7xxhDqJtuWp+C4a&E=Y%lO`n)UR(WJwdClx@sMvRhgrkBDe!Ty^WYXR&y+ZYDux z_I*4lMRRxf8bD%0!-yJ^MPbg%hU(q&vm>Gj4NxCee6pqA}bt zA53ijck@S~8@hwfKfZ5(5cSWLc`*Q+{|4u1E~ z%CG4g{C^c>P0W7`mr7a|A~!u=n@B0p+>E};sDwy$n>z3i!1k9re#P)%BP)y>b}vd6!m_w$xLFwMA;Kg!C=OGi8CiE!9rE z04J5C`HY(aKsayk}&<>KCtldmg|o6w4TC0;ncWfgfa-;*T- zuj*gj_)*^coI+As`|_&ztNU>S8ZcUBblu*-$fT_`?e^xsaCSMa^fjJeVl=hpwRV7=}VWio|@(P7JH7I zdr6#B&rVQU~;cgz~8%vf-aG8{C)q5XPKT~@4JK1o*$72=8|E4^szBCI8d?sU(j!z zS8>M%jY6SfIB|-=_z7mUz$U|lK0Ah%a_O&()yPIOw6XS1(M-V$lb@I9!ChD(^CCxu zC{CcobfS^ENgg~u<}WuB<^H@xC0CG9t{4GKvNI#;`kg)|IH^2#bvLJ;yCy( zIx9N+?E^p4$)6T2%(0wS|NZfuL4i+2mSUp~AuplW=JhtV^oTo@BmpNmnsT{U2mW2RasMwOaf;ZfLOALfRK<5OX2vq{SIKbz#?Bi zIX*ftSVzEfCGNwMQ3JA6^ef*_R;cF~@vSip-kO_ezBrBB5~sHJ_6D36LpSbvPjY(5 z{+4XI`e-AfvhiToJEo0tv)>KBoY|k^tPHGBSJ;O3lRZBEFqk^rrAS5J>Tvg>j6=2a z-6tgK+@fE9oy(5Ty(4i6r;FjoubmRw;hSqYXgP4=vmW86{cNk9h+WHnS@}GNH12F;Bot#1`VwLKAPuFetg_JD%^+jqus=v$fv%P0MPu;$J~Rl zwz#bS<9}9@<}-k%0}tyf-Szi>2+*-uod*aT>2$}?qM3i6w!2`VYF}Oc@egJiEkNk; zgPcG5i?8q6;YV`Ar4uhctIEj&S0w+-2_p-AIA7$-5y;nEJ5J$E=YKlzAHkLd#^2L9 ztG|cfC+bFqz)Fj>6qn#_e+@!c8 z5)%_M9UG}dqw}3!*zyMhP?`yxTU)N1zwb4B&n2N~@XV1l za766}ZdkhT0rhzU@V@B}2v0CKZ-Hw8IQY*8Z+f*DF6q*>9drJ^yVjg3((uCZuW&~!P3@frf%Br$p*0X=Dr3`rrW;q?9@2i%a7smP5s>GRo*DN z|94aJED;1IMgc1mjduITKE;J4sQs}nER6~CeZ44J*evVVVBHI!i8u0@>*+CBoNR6m z1IN>haY;pgQE)9fg$0&8;_ZhX!-vj{PAt@^NT%5=!h__rv{NDxNR<_Z^viF0-rVAz zdvxO>*%j(PZ&EjxVaM03@$0=%)S?&!>!X4Ew2fdSNC}%uTM)}{(jkygY1?zxM#=jOeM=)YatRI!Atz)4wPZqD;FdG1uFy)L~F{~LIPO+mE zxMs^xNX+ZnCl6!#)mPSOsTC16iNCn69 z%Z?;YrXRp6i}M9fgcRCh-V)z)4_AVi=JM5w@88{-pxYtgAX@u1pG}mQETvsiK7i9zV*g_{P}-{KD(44b_^mq{G>)O;14ikmatzkW8uq_XE0(}A<~ z?eNVZY`0$wg?g~F&@HWpsnU>B2jS1$|HIc?M@7}O@8g1?gdiOX(j_H5q;xaD(2aC= zryz*5FoeJm3P^W%NT+n?5YjCTzk|>F_`aXDzU#Nv{5726?0wEY_r9*{zV7<~sjGaF zV)=L^0oq3~0nuk`z0hnxk?i9G#1-_A1KgmeOjM<5t>u}CC#T0Rm}IfEy7X*I<603P zvpxFyXvGvy%FNtucl$#&Dw*f4u<+T|nA9abm-Xbp(Sc+e;=4eH(ph0nAAp89^)ck+ z`n*$abE3GzARyMv5zx!$_~EjV6~+FZ3~4;kz%Q@w8Fp^s8z>Y?DvD`|NhYLw=`V8H zT8^~DE|7*orwXXaao_`HmOG2x$39|w+nu^m^Q?q=gdqL7p-ES3_}Nh zod;b=<~U_?)Dm!LYF9XIbP@Pmyrr=HM0LBI8J#Ws35RJZDOd%NW8$Sn>#;niyQ1G3 z^JG+uwmCMk2SXh%M}A#r2NP_6cV~UUY@C~^Y~n=;i;zq1T8JsN`l?qNWU+zh*M)&l zx=TTN5e;A=927esuC*-)G3fHr@po~IqP-@A15*HgsDa@L1B>HgREg95Y z1sHf`>@xi$5Ve@aujn^!6PD&X`Dz9ErVN^|e;+Iv?Ay@6XB3M+*Eu6fB`qsGpvydy zQ=G3_Adxq}$|*>0+)7=LrEHqUhICfetTa;T+ARTb2y=@ z;1e^6`y)Cl6p+Ad@4PH%#T_2=!uf%Va z?mWcXXY@3kscB~rmyFK69hD#T3?T~?iy$ytWu2qh{v4y5LA69*kMwmPzyZk}0N{_< zoyH3l4n}D`SO++r65^BS2|Hf6NW3IlCI`3nr-5cgzK9WQ(uPZNaB1-31Q#6$4Z#zh zi(uZ~>+vey^Bh*w-iww?zymyppK!;q&H3M32eaGF*RtDCd?Sx_#6x5Tx1F<;i^oU++_Zc) zrHTe29p}AAe{Zj{rI9CkLsLYK;WcN)BbtxvvYM$5zR$p>-9sY28}UbdFAWHuBciD@ zf8r6q0#9%CJY38}Bp}BK-0+JoBUAvX-bg*VlgDD}V$_V_e;O&pa#5l>5DFaj^I;Fo z(0P9efG{K)gbV+7y;wQ9#-7il`=3JO|BU_*Uw9{*p(_4O9D-w%ZC53pml#W)!&AV}d&Cy6zw)`MU_ZMv zWj%btd##}5T$bU{AKLuS=rs|QDV;`+T-VF1&(?;D2OkenSYWpL_+Mfs-R$vcmF<*1 zmi3v)$H66IWh*Pg!B@Go;#e+fL;O2gX-mg4JVJaK8IgcBb94Srl?4V0lBrAD#Ruc` zhH-(SAdI_1R!_$xGh_-D2AO<7K?%*v!x^0GeLTtb1+XyuxvWT!17g2X_Vy3N?KXL5 zzv0oqxBN*wxSqYk_aw^$0UsQ45|(v7kbOLn+?0Pjk-{1C+R_pMp-uiT=?P3}jX8DU zt+Y*fy(ZB;5u@b`PS}=l^ka4r4j#iVVTq|L_?^36n>?6;p0M#}>HKp$-*X@$19dD8 z{R9j{!y0~y&h~EyOG**lG!{PdGOpK=am&i{*`%9_A z`-X<9&zoK@4uqY12O_>23yIdh`%K6DmE&_4>Z_=;vTBR49{;^qfJFK^J)Y)zsz}BE z)~D6d$+N)=KhXG^Bu98&ZOV0<^3rk)A#bwuYu0#yrUavSXw2UkiY5q8rU^QEY=T`U z$A-^c3zP%{)j__8-QX=Q<2>!;f~jWT;Mcu94}|Z}Cq}{WAYTmJ!*78$FY-m6@zXz-q7|xV)pu5u-%~#zx^*}6>gnfK%=tYXD%R2ywe(3< zE1%}?PuiSH33Rm-wR5_9R~I}-ujfwLTXtN|*YNs3cRpRu5%d%a7Q6{kC7x%Iz+8*> zNWHt>%#oS83I*?Mjv;ce;h=~ig1(bGcVpJAuXVAXdDu!i0SdMyrn*~Ix6(W zC}yO^tfxCADy~;N9MgFym?ryp^6iY1<(NrcqVDfQ-5YLOwFKQ!P8n1dcm;ET^tMJQ zw#FG-*qaK6`Uc-H9FgKzsrM@WX8DFgK~MtUjmm-5Q9;*_e*xG&Jd+c~UXD-niD$G8Ld0$`y+L61XBw~$Q>9fk^> z+Qt`|&{2`X9tGhdjW1;mL%CfW`Df|r5At;?x8A#?)JvyM#kuX41+4b_$dFs05OsbS z`S$JY)fH8KV##U9i+jw1&}wZYh2Uq%Y-o=^QJE8D(yAG+rw@qIz{s80(dDR_*(8~L zEmw?+$%1-AUOJN`FnprZEXnVZ=-((5wKU++SAWH%v}Mt+b`OWFHKf+DUvxi?T5H4y zmlXHLB6R1(RhXHsB}zvIS@fHV6>yJ=)~Xv-S`F9tvSF5qui!;AB?E<5h@j+0oBY21 z?i#!WYJ0NG-wmF(-uxQYbJ|O3k%63TLn=)BWs8V#=>n9<4QYZR`~-79jLfdeTOjM` zMSkl|@{eH*N8di#i_+z7vioL2`09)-uoLADe0AWK&{MrnmTpnypck!Z1spxs4zX&8u<`3PN`R7p{_N&?bb_^h~e2Ww;g{Z`X?P$<}w0DiY*= zbU$xD(**dzhVH4h_HjVe^>?ge_ZOk4M_HJJ z2_U!WwyQ}2n(7D@A5&C1cOkIZrh_6gSktI8*6cuCE$*aVO^44pcatA5G%BUNXAM$O zT2zx->DUJ&uA>qq+K|gGKQ;ONuDzJCX*c`rXje9+hB~UboTHa@b39kqP)ibN%F$6x zpWG&V7wG0VNxrLXtx6;5RmE3dMU=pO;t9sr$`?!C$1ELJr#NAIGFwxaQLCDIZSuRJ zd^HR!~+QeIT?Tyb?Cf2#Ge-Pcq56HQ0 z@V#JGF=GsMMD0;o2}-rYasrB}m?lye$dysieJ5jwre>5M(^phi|1y4ZN|9jp)VhIy z&fIpd$U)T0Ku=xcl6&i_?cF?p$r;HQ8+_UEh7QYh2tQIG7(6&cktM!A2yv}LA~E%R zSDBUsGC=j>kYBmB6Ne6Gv29YJk0TIj4z1fW`%Q(6+J12aJ7|MehG&=hY~ssj^~@JB zK3$|~!v-upoJj%*TuTwv!=qW?=73Fm=(ANCPL5CWK(v}5R@aQoO1!I{JWA6mrq`&o zfB?8gfc^Nhum^T&IntK*M8s@FY~Z{niE(SFTP9@6lp~DReCqqOUcNKI&;$-cAN={sn!HkS^g9PP12O|T0IVMM z7W2&sf$tg%qS`|jQjpq1-skk2)NiQExn5udZk?YZR-Ky8PkjHe^MPw2R8%9VC`#iE zE8A>c>2#y@$S%o#aeNi1@>r(A3DcdfaACcBNd{=Ua?!qu7w0~q40KT4mEbZz8{(fzFsiP1+^qTaAY8fwK~eOXBp0 z+%IboRFA+z3J`~Bi#(E*WCYN^Y_E37os5Kbv;+0Im!W}JkX8l4;H6QzcGu=8M>RmlGos`@{eHo-kJEEgYvdlf^y#~_pvFzG%o6$^DgHoq~ zZbeSxs7siJ<(Bjp*Jv&G$noJN>d;VSNR1sV>wA~9F3GiJa4UQH6wn4t!pT`~tu=sh zrlv$X`^2(|f<5Q%P01Liq`>;mM5n0@{_(eJC9kL~Ez2NPRuSS-*VLZ0IPZ{t8aO-2 zn%v(}o{^<#VUWd^Y(I05Z6|DJU^>WuSzT7*BG4$@^ab$xiEC;YxiUflV^CI}<#N5vA6I)VBJxo7J1_rj#d^NQO0ZkgfXm7}DYg}L1PBJDsL+(L11f6VY3urA@W+W7P*AkL(XOG?%xZK|ze98dNe`==MIR$C`hqoVHS z=m(f&$yO@*iM>{ZvPxrP2ZXz-M&IE-h7+d{v|5Mpu2xRQ^e~ z_JFI-anmDDjZr`feF;rVzH(fSeNGB!zzNwEe- z;jgx{uVsS0RpA?9*liB)I)dbY3%ieq1CVYc4A=W~8R+Tb-`Nt%dHLX$RQTGdndj-( zD)PBVeYDr*&x=d;h)H?R-ge?9T1fnj`ib&$G@~Q zV2vl4lLL7)j(RGehAWw?LPrums=b#=_t`EDP=CPM#-`l^s3B-|wBf%HRY1xhiBoi}f%qH; zw2jGkGd@7T=}qKJQa1%+**Ay$U7@birU#!W4M-B57YIERQzqDYh7Z-1pZpL4>y82a zb)JtYg%yarm$9^C`8J3mG_V^ljfK&@(als->>YTV(?UrJ3x0EI;Wj(^e%R zO|u#q1M@(_eD=BQ%6F}(rB!WRR+-dSiGi*qvWo`M2|Fo#gWm*~`eQB=)vcByi`)~a zT|E`PL0^KlGfr50bs4ps`PHoM?xY1EK~Nsw5n}%dDMdf^Z>#wUJ9GQ91JgN$S1k<} zcXtcQQ(ruK4Ft32`L~A8%f7khI9x?%)Es=M@Q|Ki zYQ;blHa4?)vNj-nJoKX#@D~q$r4+bGV<*?1GPw5Z4XSO3tfgbXTFDpkqwWPb7FgmM zNEdx+#iFp<$E^F57o$KP3v?4*No{wlM-+{_3(|~&9R2y zN+~skUd5p^EevaNTkM1X6l)zpc-Jwdueqb^Vy?U85KF&Saznkw+W9{d?U|$39|-JF z35UX|lp*AuPZQ+iXGi+YQc;o3E3CV_yE(;pejf!Y9Du}|X~e{cUGD0AE*jW`?p~#; zmPDLQ_hf^7Lp#R#WE8ju2uzHVOR;p;1CA;5eZo`X)&tsm8+hu=yUi+kMvU!rEA*{& zIjd8YGhS+7M(mZ)j?v0N%P_l62M*qWPNm$70GkS}5O`f*9z8q;Q^n^{F*MH)maIpx zr%%tu#V_sH)yMwWDJeMb%crBcKiDK)h->eivM+S?ioX@Y z+k?@uoefp%rg5`YNzm|=>h`(Cv6WRb_h%O8RfB_d{9UFv0FWXK;(d7&8F|nbmtVv# z;q4z+E13u~qw@kfTk08pjLi`@d%VM2s~LuuT~;^F zT--nMbD583^DW#NW(2A!?V0eqx$64LY@QXwUFs}j?P#S?yKntuFF;DeLYut%Rg4M5 zBWhTL^-r2QZ`HXM3cD8#)fx0hN*=W^{H~kW7jIe2tYbY5U8j4S@e6_L$&zmUVH1lK1K7(3JJybqA2T`Jp~lsz z*?gIud9dj#9$yV1@WVYN+2+%V4=13zzFpAk5pI62F4vM~_t{Y%=Wfs6Y$fYDY~Ow; zNTn87TzjOd?Y$-L6TunLP(R+t$grsV#MF$%Z0Z)+2lKkKy>V{StKgZW@m&&&-;djw zB!=J5yS};QAElpX*BO*QByx8H%^iI;01x~sI~k65_E0rSjx#BA*ky8Roc6r#=UcjK zfc~_~8&cET#YA!QoJJ)Cs2C7Pvg;Zqp6LunMf$w}>YYh{@3$j)Cv^_4>5RI?qgnyf$VqkDWA;#p7BefAef6 z^mc875Z%{HtsR{%5I{2Yg`1w|h63Fb_`7k18$q;`(*c%;<`T(W>o(>rFRv^EuHOQL{0>$kq0C9d1tS}QAV>-jyiS005!Ic0NS2Uh0Ma{PUD z=ToItZST^$(D8vh&+0+*m+4E?nD)ZVW+HC0E<^j%9EWP%O)JKhqs&!HGDlY%(Imfj z+WF2KBvGLFv#(AQid%3K1-hTc6^uY=7Od)II0`y?P1NOg;z)GiCaz{_beU2Hzyp65 z9(5H^aBeiNkh(fJxa)+g@J3j7Q22-~3|vU%I9QCoH}#IQlMfdRBx~L*tnB(|>Ru&l zqOic1my3;emLk{PX<;PoPyk3w-V4p%v!A#dxTq@uB>eXZr3M~o^;U-6~>jV^i*c@tDPEva1e;vO)Z{N`FhjAdbdN8E!Q2o{5bJ^^GBc- z^saX6c{J%tknKXLb{s$YCplMe_jC9zJC-lo&-UJ5_U4tzRxKFj>S~I?(7Lp=p+i02 zM}REl`)cq0)iVGaWb?Tb(D^zCOrAsq}-Vm zSMUPcQ6sG?nUaRLTLTjMJby2#d^j_-ezohE8aBaK%VEA3rVX1Pj2P%9(Bw6_76lO- zpuvfi)?xTS=t0X7KI;@lr#qPt?}A<&Q8>}SDwo~sJ8a)E9|m{!-iVxRfDjekt?RBI zZ7u!iT*d1-Z?j_JNgG}REl(TrGV?HSrRqliW^tZ>A5LW;Pz6GE213652U)--!#6c( z%KbEjKYzx>NU9g!B6KJ3LnWGSF8uNw!TZnGuT(?&sqGgBSu+vARD&3x)zo zQ-Mdr9!}n-=l>blklPzxoqUyke^5tx+ojdi=17Yow0*E*B1-KRAZc?9s4O_ab3S zNUU>h!_`$i>y<1>YjOSefuQ}bsV=zS=~EG3>boYx*+yfatqZ=H_4^||4weEj3w*m< z%{>7wedwz7it4^JB2WKuSAX+DRTWQ5NO)&&u|zTZ;?qoznpv4W(EW}3(GIrzyz!1V0?8&Hr}Y6wgt1lzO-h zN!9PG!7XmCfh_)&%YQ&2YC*pQQj~@aG{tRpxU7YuJrm1Y&_7N*ptKBvl{OGIhCrn8G z-FfRExvoZzUXSOoT9uyKZvMeM`V^UOKUab-)BH?NC6*G8EyC18a*|I(zf6B5L=~bR zdR0-&k^aFrD%$U<0mDTcbsDD(b1JbS7SEEjK@72xP?^ zX6HDGXCrP-06Mz*i)N|{3<>P1wTa-=C6&Sk1H<$NhFRv|G<9(!Sc{5O(aBKTTjugr zl6*8sCAaE%zfJ-mKnLS4h5l_ZdE_CQFT_+8*jYp=Knp`9oK0~^pfbC8~{}FSrAL=?Nlau1{ zuz^~y4@#5(n+lE|`#)@!7*}?0u>2!d0LIH>8jcFhG&^3gyZp%oc#drh>eLZl3zWt7bSKTcROV&>Cp(99vdLgGZ!GWWXBsqdVmN1!= z0c%)T;v9Hd=_`{|Q44t1gf%9C88^$z6>PrKs~ie^-* zBK4D&=I_sGWW`=pE@CCA_-jhUx^@WuD~m0$l_|)D$LFgVgDekG7kcE7Zn@}k#L1Hn z|Eq|hQQfBdXOZ*kG`BPqz$WsmHGT#j7uTO{&5U}r`-Cb;f3Dw~^;9dPt+UR$uU;8t zGLP3dA`V4@VP6#gW@fKALP~#>|Nko*{?Rf4+3-Qj9CJw`LT#M0DD;6&4%2*UD$tNq z)=w)W^-Uwu$!R>PB@Gi{fGHhb88^oYYF$D$FW@vR4834IrXPlzqyH68_gwiRhCi z&^uNwsZ@j!X6J2R*LbGPyKh}^f?k_<$W5*t(O*e(Aa@Ow12%RyLwf!VaF$?>ghwH*IAPKkIR@JB<<8< zg{i#owH$?~S=v87#zIQcrs7Th)PX#x+yOl_pR3HHNfzsXcdV$Z_%)a41Pdbp8hO2> zLGcV@qQbqzZI#>3WbEfy$k#r0_J2<&Y=Yf0+!uShGnpsrFSN{A*O==6j13U*=clv8 zHVWf5{if;J935jPzej4{~Ya2|7x2P|)6-@H>?!$QW zQR4^*)l1QMfikxVI%_#t88u~`>|s=lh7OU=scQ!aD1iRQHMID{ z(+SifjU*a&e(4n!3-qY}v(m`3P_n2yWEZSLA*?hasUvYD2A2h33RakCez4X-qe^+)>$Dwi?;tcz*aYy`BfEPok zljslCt!a8S9OKLnh{8Wnaxku=d#DUb;@`TP^yM$y>owru#c87aoy2>bR#!$kZrON8 z!kQR@s(hqECJ{%Ch12xvo~HCdJk8|O5B+}dSm=bFtIyw2P(}+oiUi=1~)-=#7L+^`8rf zMWdvxosXpYyV*C^`!FNF)0K`p&b-);6$66n3tb4;{JOVd&u9@G>Yle$S$t@7~PDcWrue`U+W%a5P&)S=V*PG^okSU z+m*JAWvHn5#c%%o8Q`uXL6q?HEVmzg(Z;^0!{Zv8qG+f4weM*W(6CRXp_`!R>%6F` zWqxde`q!}k4G=h>*fih`E4I)Vy+`F&ZTpaxa7RHraIxCy7d-;IE15MwHxrM_m;U zZ}~u_0ltEJ#a%b_S+HRL7vUy6Br@b@qYe-LQpcY@6aTDL1sd{iG96=VP1>t-{oR~Z zFG>#3y$}aBYWyP`M_-$q9}K^DCr6Lblz1Ap^RF@UN6mqa>r9f5#?F}%B z<#?M@yyhk-dio3n==}9>h?j1?LUK|s4$7>5(Xh|^WRC;)v6X{T@R)glv%~RDI97VX zM}mchr{izbfohI_oLyMNNSOAE5q;k%ef+lQVLw^$cGs3v zw-B;B`u@%vFpu3uk<#}Ms$IgUOH|0^l!o(xj>cTr!gehx0o8YZB`BcVY=XOwm;--QT7UW_y_GIcDxu zu40IluO4m|_ey^{5}@7RUHoj{EoXgi=%Jlx(jkf9_Vlo|M?R}#_V6wN;!|FP_aV7^ zB~^hYKY2LXHh7=7Y+Bc%JKov3OlZkYqOdX)$%huW0C=(HK#KcPfJZYx0`sxkYFy;2t+HH4M0_qVC^aoWVlD&ez4Rkb z%cVy0Vb>$I+cAgR_naLPbB8m(*>~xSyW(#l*gDalped1Onzpq-#lJiEeXL4AMf2M% zA)M+d3~4dbNL+h+rZ$NtNW8<9p&Y|3t(38i8zMK}^wIGw<&CokE&FO_M$3|wyybJ$ ziw{7~2wHP%h$wF_bHs;(@+jb1%53%7k)ik;x#;)&uF%&~wqhZD)}P~viuCi-!aUf& z`#EMg;EYrj)M}&BE7CA@ef-V9hQ*vkC@{L{|GlcCb;EJmK>dTYfA5c9yBCtEInSep z+LeoN4c$RU?a4+0&EF1D9O?Yupaph!asHTDh@GhVO5YCNjtgoCF(+rB?W59INxEnt zj}JFN@mtghIPojQ2UFS@r2W+OjGbIl`|4~}_yQjM^fg_9JMwIRhS@i)sJG|+EwH7;Z) zFJ8jqodUK1DtTtNB(7O9%1h&1qB%&!=guF84?UN{m5i4Fd14|4N2TC?RG<#d7t_yBdq6GYd zNi?sFK!I8tmNnoZ3ckTA`#`-+hWJ>gV`X$P4^*atL#@9RJRt$nRo-!8?_y0|;y~tk zCNCBqWU(%D<)Xt-oO0iNoIDTTfuwF=Y{g)sADM-|X|UG(h@)tIvTKos6}+2e!8C0U z%3)605wYJ}Yi#jkboE;)dkva@nyV5j5;oTCXxbf(JzkhsbR3hiptCB6T8pyMWk|Js z)h~ETP~@Qc4yuo%0yfKb{5P9PBo)W_$Iec#<8ty;tRlkr`x%Pbe)OY%4gGQDb+WMU z6k&ybkU#9f91OKL?rkUns+oJejAg@twoM3o5?;CAp0IJJXfM{gJ0b|pDSzLOA^bh~ zVU&%JU&J#Y3s0T*aPd2iKtp}cdhh3!>lY+ED@1=ia*u$B?fqSROm909&;|M}Hv9r!$TY|DjBT8&4v$3$nm)V3* zl8MG2bF#qe!UfsAicXEd`((-ZISGSV9@??v=VD7Aby@X643sPqJyxQQL(ORT4b=Um zPLWMrq2smm79`^2Xg}CyjzD?NvD)9`kN5VS1{O2|APp*>MQi?$gBBhei3#&d@ z3!^wWC0yd^y=FZeE`b;WCeLl(DkEHUu$!&N<%Gm zwAfSTxxa$3YAa9Hqu70_DoCD3=VPcRn6~Grl(We}+bvhtGseUdtoaE5 zL;N+Y?g{TK)Eln~bNd2hLvXcF{ihiMf6XFTT6wAjo_9LZ7{8WFJ-&w|cJNin7cP+I z&E$oG-Q{W(NSzm@5Y;Jw(AiP3UC92@A|xBN2WQw;j9vBp@8{lqj`G*yG_Y5i+K;r7 zcT%->u(6LQ+qYLtgDs$VMQ&!U(vixn+DAf7WzFJyKGyMg7^qivHZj7dfwE8g3Q{lR z((&+}$LOfkJ!Pv2)!?iZ&oli`YWW&&I^Yzq@CU7p@xZg?uxb*zbZdQL?8kf1OtnXK z8+*KUaMN;tT~QuOC9Y+MS@ozE^+ zkL|YFWOZkA+@@9l%hT&pA)(oibQ<_8^RIftV#a-!Vi5&+tCMgblyN2lbk#DdZ7b|i zzu73a7w-9 z3XU$qD1m{H4&r`eb5=pUYc6$b)B;ef6%g?pX+H}GVddIiN(=CDVb&U1&Qs($@*Ul6 zKpLycxZi!Fg}EiF!r``6Y>?Fez9wt-c*k zoHR=BGu&?C4AY$NB<`jN;$aCIGAE#-p{jz@$H%c}su7;CK4+lRF)Czt%s~*P zd)z0a(46F-vRwCq`ZfO#98Q0 zvSRe|MMHO&y&Zj=@oS43$+*DyH;p$+_naD;u#fMPNCM+Jio5fh-NdFvagZWvrLWgieEN~#5Y)W^p5!$I7 z^DVaXHs7<30Cvj>pgk%q)rXMf^O9*%0kIkDGxJWlF0F(=QrJz+NaiY7nrP0hCuJqC z#EXJL|IG{zt3C}j3Z#i*-0DCjCFQZfPPiJ@MLHiX!}D2# z>+h3V`Owdj%K_~+>UUS)kffbZ7wE)Z>Ob{7(lyRdDrK( z8Toi@q{VX=+x*`4bt$}@w=V3fN1@47+J+QH7)G zcW^lSBZN#(Ipw_9YCQ`q^LZRmrmO1blV=K_%JMQC2jQnbbL9tqr3KmF11v~jcQLvINNWF{;M9%cXBeRDl z!`czCOieP4%JiN#T{U1~8P}qWSiipV7`KG9wCY_vxcX)Ni6Z}7CH^&y#!n;4RcX|U z5^j&&AefB(&!K=ICNTNm!^j67p#0^d^6LkSu!;E;0Ctr0_ga?-HwuhJ z>a)3EI3g7qQK6Rfpqmxtq-`SXnbc~bmi-yG{aRx8mwn(0Y-TuiCMki&a~s}1@hHxb z@+4~+@yMr-LUugLmVgsi0c0A43yeyh;&AIU;dQT>Ru%4ZR#x$Y0ZrHUB{dRqh74P% zck^7t<@igQz?KQmojiJNU42)`ed{`bX*jv>r7<*-zl)YGEkm2oG4MW31G2g`}O%n z=JuS1_G6ig83ry%=F6>MXhJRo*9KBov&T7&t^Z*B{*(M$bc^^mCIw-AMvBZVhadG; zL*@kqRG2419g-_bNN{JVDOu3AeYi$MSC6#(Y9Xf2hQVR#h-(|jo<9Y^ly*Wh>fbS6 zO(yiNNn?ld=U*-OX1~Re#IdnstrVH2@VE)C)W+_bpFM^UL*F4T(xK|#XgDRqD8!AVD<8+7JkVgzifjo+EP3{OpJ3!U(t7%@|>mDAmA$|`v`yJ(ZDpz5aF7m6jX13O;m&9(e~r0xDH zC;hj2u9&S3tz@RBXdGXbn}%Z*BR9kBM?N`=)fhfq<;=h_(~!mcDBHZC#A;o7L(aC7 z*?ObG{u-)TGyZP|PN^uRm)DHsn|p#n^-0_C4N-o5U6n!`P=&SaO#)M=WxLEtmP|{> zOB$(Vhdh>FV=)-9!kK`#mJ5xL6~I@APXkW8zYAj$?8g#>zc4S-{E1G-3;5sQ5i}*E zU+>15g!+mcM#V!C&@!5{`4l`XZDI4gGNII{>VyFmv?XZwbLt;=o_=Rkj6un$x>S>n zh~g6kg<_PGOmWk^xF<;q9kOJTt?XTTV%{k-cR<%4Si>@)ao!I}Eqeo+C#wi|1zw4Z z3MgVnh4rnNwAOS14wQxwJ0s|H*z}fV%2Hpb0%gTz!jaBj(PcX1M~5hb1m70d^<8Eu zT9NCQ01Q=HV{uV45Y7*DopVWEzVz`wm_5*?0P`sqR@Yk0{UQ?X^Av>7V58HsE0H4`ACwU^@ksCmy|!YF|S7b zx^IM`!KU-n8*6p)$AZQH&@sYTac7botGLyoBd7LqjGtOG)-;S9N-3Het7=B_P3g?HuFMw37W0<18b2emVNhF@#qo}^!H>STWi1%HFPlO2*vK`@KhPec z)0#B~HcAxMe?l%xV;8K6Cg3x91|fJZyg*rVOQ}p4$GP&CaQ5*&QNKBV-U zKu(h`ty}ZBdZ&miS(UHgv88Znp~J8bM2NYNtO7&VBcx8rsSTTYbI0aBnzLbSe%&G4u6H0iqvtIe~J+Zf0<^oo58?aB~=`Pv;4e^)V5w9LOV$)Nm)qn4#w;%ZS zAs&>cf>W7lm8|4Q2eTuFVIIBVO>I>K2vT;@W~#m9Me@}4H+_bS>*Z&Kg9TT<8lf}_D=rxK1x?_}Vm3O?e}0yrS);lOLwxXF>>6LOcz^#I7$nG5O+0kr8+y>3jT|YHls6w(&<>Rk7O#(4a#g6{@bw>vOoWZz2xc=bq<65PC~_VLF$CTv1bYp(~| z(o|oJqFBrX0nv=P1Byh11%5Q+b#^^I7zbV{wB-ELO(g#D+kFOijOZ-&+I;_HS$}d< z<7R+DW`2&xiWI}=va&3<_Oc~O0H}nS8g}!-S@*3vvH7eBqWXV;dm*>4#dB27)K*VH zhy%dj3;T-jWfOmcm5CeITNmbKLvX<1&(&8K6si#BA=J=|B0!OdqSZ1>sVdMl{r|Xo z>!_@{_FYr~DWw~vyE~+%8dfwtj*sIi`qu%E zSN{XZR3@quF_eT4pbvC1y6@KPS5mQk0J|f9V26;k)-)+9>~o0nFZ8)Z(DIRHK?FEu zC5E4teYX-Yx20$<7tQFIDR>r);zA-mf05F2hFCwBQ1D$!;*=N)?w5)XdMkrYR%Ym# zUC;%0h|bqo^k(EK#RJ7k zWy%i|_F6IQ z?TOcWHv364S(t^Pe(ZY>6x;kNSv)FhsKh--7#8XNiOpM`f$Y8grGO<^`a{tiusSP= z*#M=6b$zub{%&w(gqL3`#g|gFQDgnqMS^}2Cos?w`*|!e?AKjg)XAdN*^CW^c2`rP#;48Vtf*zj%uvM)pZE&Jcp3A zm@@nmoyVK#$P%|OcL%!jDA$QNm{I7jPt0Q9H9lfoAE*;3#1c&ych^^54Ym+L&OH{W zFG~XznT87ri=2p-x`sc#whVgVD?4PU_vncx@})qv;eI()<55@Nu+@u(f;WGV53!d7 z-&?Vjm3d2W2WM^{7BgOmwHzDwB_y=wkqaZ{$s1*jFkw6nJ;7OrqDG^)tskIHi@3{v zH##RS&v!O_7%d}>)vScA_5CkLSv`~#628#)5^b7lN&RF9Z9j(O1+B{GSi@S-no99u z_FPz8Zm%NYwEA*X)J3v>$7ZM?&LD}Az&Ho1E=}o!yK+8>o*u#D5^cOO zU7i0B7ymQ7VS;-J^m$Zt9TDlf2Md?&enOq-OAcwZsGfvZD0SJ&64r|Z)byIrooXD9 zUM@WZ2yz&t44ZSSN{P_!`dJE6T5>L0wQArp%Oxy0PuTfhw@;_wEj2hKrZHPRfi0;4 z%4_^_=DmRsbwAH=x%V3H8h9SGv_rh>VZ}%`T)?Vv8eKZE^j-bS&(xLJ*!Xj52J%jm z6?IUL_;w)p3TT1t4?DoDLgLV~SDZedJ5W>!O zVi%rb@6KSb?Ji~EH#gl6_4LGi_+^rkG?Fte z-jbcRvgV$3cUaxcrVw(pN#ZTw-Pb_N4=w1YjOLI(N~IU2&Dg4y%TAV;S1IRCKpgUv z!#60}Gt2@I8hm?yj-hgak4Os$jsFpNSWgJcA81T@mTtTEGvjyO=S8gnCjr?u@VCT< zNdL~BM63A{`T(#W!zOV&%1(fQFYwqh+>HK!cw8wGwv+WKWZJ|8~#7F$w^Vh62Y4Wg);sII{cI-q8ln$!G84d#(<>%17OdZ zHW?3upgRMES${$)%E2ivdUi49_SiEqWLWnlhgw5{Gps!!1yTMT_A{|h1UQK^PdYlu zh*sjNhtc;%Ht%HxF+SYTsTL$%;{C zQ5b$=!EbxZHEmvSFndN=_I{Y;B||UsGp$;VnKD=B7Zw7Tkh779s%SS0`ybuCI{W62 z%UGQ&7PqVI0_ops7zj3ez#esl*UwxjvUu-bO+Wt%hSvGMAb>Oc9IAY5#z63T6nok= z?3`15r*GzbT3)Tmgc$MAb0Tkacch31x{A=>cek5ui(i-VOoJ=1Pu;QKd9Yg^k6%<> zxvZRzoF9KT$x)$23*6sx?cMk5l)P_=uf2MA2Id2B#jDB{eqQ}t$W1pmCcvzm=7|gF zM%otWYWBn53fjoS?iA*whAWeNvU-jX{?(@`2ldh@_#34)o)pdVadAo8{7-Y+=r8t| zIF|J+`M<#n6y0~6LdrEZ;D2!xKaN-F8|#1Nuo{nSZKbpMdS__X&(1x+o`^L6Rn7@F zhUd(S@Vr-*`sWZgl}l*xDih7au`6RE{1vn;ahLq|0w}AVDp7N>FLy?ohBb1XJAU%# zrYjzQef?SBoukTpjrl_NGQI#UlXk_Gp38dg#zMLG8$tDS6cpLQGrEp8%SBpZ^0g^1 z69cu}P!*<91rECDL)K>XQl2R3z-9-3x+|t-+okKl*_$id}A)7hST#mI|6cyu3N>#9Uwp)%G(|x2gJ!d zjRgDj9vaiU#rvO8@HLl)VGOUAPF?P6)`?mmjHazDYBukR__MY&8m!^?)z6Z)#zG+( zVck4LCB7dRm~>p9jQ&tnid4C?rDJq)9i6pM_{6;Ye$7(MjRwi|$w!9!zKI~Y6ndM>4p|d){5Uu@vsK2QD zc(}IC0o@(xH+~apevPYwf&*)`J)!=e)pv!wBJX1b7qE;MLzlxK)-X`^VZ-lX>1JPH z=@xs*TXNLCKf0v}8kbsoV~eQs)jpbK^Cxj)hIK%v!!tKJ6YHB7Ef#mU>iL#7(*X^T z^IHC=Unr9AYHkpU78)e#SUR(Nm%SlM2O9{lpF3;vFGz-)_sLmDOLxyNdB+r?=$3jR zNjndT-dB^_9{mcZ7dPC?VPrNL!`g@)$6JqR9I`tL^m|RxEE>=+$8!j;neS1(EQ?`6 zlTNX$Y;Y*xJGssmlH8U;jIwVCmiC=KA133yjH;KS#*Ai(@_)S;=Kx0d7UK3 ztJ4935Y}MrchBO4CZJLBNR%KkSbl*p8o^X$RTbro*ltO$Xesx)zS;)cd%KrZGnv(< z)pGmj<^JeJQJo^4dAbL&Y;yXsH|jtXxhM8CBha9~M!()IPK-9`+`GKcUz^>SHRh7T zw+j^*En|T6CFfcH^<|uuIc?rFnQcR;|6r6Ozb6WRx~?6S3&NhmGqmnY^S7UfJePML z_S4_YvJloPu$BInPrQF_es-7RbkQfL>y0%QI98vWtyZ>;rOJTqjb}Q3#S*KL#}$i` zLP^aSR%*2HyY%q5YnZ8ew(OI|cV3!UYw@E!nH^WuE=PeORjtMr0*Hnqj+NqP(V5!D zs#%q!g4n>TRKKPuu%K~(?X+h3{W8-!Vxyy-|Mkg{ zF@5*Ur;=_xseQ$!#{TPm88kV&=H%7gsSgdKn@s+8l`a2hH zEUD;*6;&l(`jAB&pY}iuN;4I$K)syx4mxM0k|{w)3Yns+4vnPqB~7Cb?~5&^yVc0{ zs68>V=uwYi4blnHDK0MaKrb*L-4As3@_cLL$8UXtkUldgb}H=@+|O_*NKeRKz>3+T zW@ji_QY83n=?h76M<7KB8?{;JXY6^Sq`pAZ(kLpu!=Tovc0A(Hm*fc|Quj`oHb-gU zjdkO@>~<3qlZ7VwrrmH{Lw;?N7HD{#9AzKKZJ_9Alf9zn%iqq){xbHpW;Z`Hw1bLu zF)exnmN6qD#=he0YUk@#Fnbzrb;dx%+)%+-I0f_8CohxN`p#-eVuH)D&03d;1@CD_ z8%~jv`A@863qsoRC8u2C@E%NYn9UDmKVmV!slgH2zfBp$6eV$2z+IPylbJRKw}S*Kr; zKg}sp@1Jo@n=@I!HR#-~CS34w#^TSGiTmW!^%Yfi$*@!XU6d@k+;5wjw}rsNfIIkW zRv%}HtYMvB=c*vgtlsX&t=8A)ty;0#w&gq}<|>2(*shkD8X#^Aok2$n3FvNeNV)(< zT}m;P@7F}wB-L%;e6%Bqmt&}&`59|p`Ss?`SV>v+*N;QzJP-K=On6EV;Zz^=V9*l@ zN#zs)wGD`cZW{R^5|HI$=Z-?vt9VGQKHt4?9)4ysWNs2DyW>g%q;+9CfhxICtn)b@ z5pc;+F9UKuN?kayvs+@)WCHgkg!P0gY?j7yE3I*URZINSm>ntriQ?EmbwGOv*X zdNp*E!@5o8)5=R1*>)vMHM4Ava4{IOK&C$Yfg&(g>9t~(E}*ta@_e)Ph(=>d?@p!T zH~gKXYQ@;OvN-S4F=aUC0BQ|$;10YbXmstx&iz$Z{azYO5dQS9DbXeLmqQ6=fo;9F zZ{Bh}vkp__dKO)!teIg`zSRTW%>c?@*;LEWqRXMn8Os~PQ&xx*-OK{sfO}@PF~1lT zx#nc$?(F(svfyPv(?O1NdIhe}d=N{E{DF!W(dnNtp)>&JN)b2s@v#lKi@Ii&Cp=|g zl!eU>d?m0kz^4v@pu{80iv39iKu>VVAMR1;OF+4JacBi8})8LU&nW^X{*?Fl)~>T`ZzycxfO0-ez#2^Fn`IGq0q~z^+sg?6D4~=iZDi=nco! z6PL3lvte9uwP@WaudwS2rRgC{pDoubdgi}82)FB_UI4Xy`45?|veClNbwrd-q2 zbrllt>Gwn!KVa?~8~ZKoCd4|aw#zsd>5Rqq>{XsSz?WQRBccT)mUDBr^i%c{6$4y} zt8WhN#dV^0PR3GG6wV8isl!v9^Mmq;bxssT0Cpv+>M7HZv-<&Ux5vbU{%J#vq zG~cf2;)D^Si76rRo!k<`q@(c=vB7LoHo6=_^ku*OUT6BUXRSrse2M^;|!gF%0%5T3e>%4yZBb<5#Npk;d7HKIw z&O-#ZzS}*Su`7^=?4vX7U$!=adt%0? zbX)u5_s26x*)PsVpLq-Iq8p6#oC%2JGqlkzmR~zkcCncQk+_uEj%#UL^u+{j*pj77 z92HeSjsj|?>$9bWW6xQ59lw=DJL+%-t(9Ag*%7`cPzPbzU{-j+~`war(mW(!7sn z(~Q5j_RFi_2unPJjmC>8h(2!`+Dg}^5!sm2$qa` zotP2G-Xd{bYPIa-oWC`pFrpqMUv%6I9UOO7uPO3+|LO;}`*@7a5m_E?&ab<$hjaD1 zvtp}}-00|GcR`W6N(||s?P26?3KqPE_^@EAD{;j|<;fV?vJ+wZqzjw!mQhqzMADPA zLFRjrBOwPMg=a?j+Ps>?{Sll+q`BUqrhh4Ico;{ma<^OTIi)k6RU=r?tANk<`k{dCFIY-5(fiJfrdqZ{$Lak;F*oa2 z+nVI&+?nT!;U=-eymiZ`EeDlq{)hATt5@UemJx9cpJ=>!CD7#-6o0~;ZtLpo>HqF% zH#mD~S7R<+WE7#;Zm_qHO=&ht6;MeinuPq}73n?{{X)!$-LPxBQ0~4j1clI z6Q?beIp=({RruQ0fz^AAjFf}y3@rpzPHdwTEli!-3o$nDdo-7}SA>^V`Cd0+y(L^s zPt}}xPLKXO#ui7s;%6#PMwXmga^n}_t3#WbEQ(EqN>_6Bdg*t1S`=f=CJ}ri_j+Sq z$hc#;Jz9>FK`N@A4O=%jEMUmyZqR8EOElIY3$xhYz$^ljTMKhf# zxP!%+8tw+;XW<8Mf_fp=9Ybt&OQ4Z`h4^+l+2_?2TZix1HYI%eN>9o7);?crhWjgx+j`MZ*UU`i~!AhrPfd9=N9N zcxq%Yaqs7}J~MIOX1|W>upTx6V=F}kX5k{i8A z5E(~&tByPYW$~hZY{Dm*yWQb-<_GxUaoKj*-30ERhCS{0AB*7id%nOp7{4nn%FB!i zLW6e$Ukk{Iem3$YeKXrQkTIL7P0{L5D4p>C$SIw$UAe*`5+V5^lZh9ch3~?31 zSG^tv!+U^KcME{}K!SY?(9>j?W@K2LCG__u<7OlxLu((<_uq;Tg|16_-vm@!tZyn= z*A2UTOJkP&#NQtiT@$q-%Q&5h&cl+jZi(gwPV0~hI={+aCw2Bn=K^q2S ze?+&GPQZZ4-c@((^08R)&Fw9w z?9i#R`&IJ3L!lce&jBjxnx$o2IN=Q^`s%&m$f+-RPWfH;T# zPZ|qxuq?*LY2ZdMrb_}LsVe=P1^Z~q61e~<}dL@BBo+5fEXo2>r04Pm?CxK$Cnrr*3{bG{|u^WkNveN3uiXrY*7yF#j5}Wn$?r;v&Od-)uw;CU2C}XKmZjDb2P?WZ~f!wM!0_ov)?MA#2Y+ z108;1ovvM6TKDzv&TB6FsWo47su1>;s$a}IeY1YY;)@|sgYHmeYdz*t&D(1{-ZGO0 zOxfr8IZxAUSP(o{aIFe#t_-KQ)f%js<*;4&fu(%5R;>Nkd)KAj@KWn9OI(gUkg6}T-pd87q4Wl-RJbfAV~L*{HlIiAaU&?Y zr(%X_TR5b$E%7xis$(yhz0KTTM_53+aJX#wX1s5GG3Im3RNJnwu(+{KYYF6SSOii@ zTQP79t-?x3U7497)dfi-s}k|e{y?FMCcjjebZ6uk0cR;G%E(c$v`$yhZNIJ7y**Rq zic7y*QRlp2cJ+57w7u#G?R3+g7A)SNc~?!Fu5bM#w6nPV8Nh(-$Ee!m|8*MD_V+hh zA(RHAtCOGSoS9kWRC@gx;PEVq*%L82u(^NCfuuZ5d<^)`!JQ#D?}p5e_qy-e=DCb| z$Tud9YmIi<#=f;3Y4KjK>=rx+=0T`@I2>cA?tM#vs%%)o%0a_?K zc<1F)S0oY+Zp0cHZ(N0HQ)#^qSappf*;?$EPYo%mz6EHf8+X)uN*^4SPma(O|u{I{6z5aNNB1Oy7rjLi2XAaIyVI ziv4KIu0%5Lg+6NoYE1RI)fFnRzxgt#H`xyLY(xAI%Tm1prsOhU>J@YP>SyLTT!|hv ztkM{&?2eg4P-#J(2W=qY5PpHU8cP)z*J=F5ATX}OLSjd(zq0yb_M(AKY(>Ie=kvAv zOS+lxviY0`ZIRB}nh7C3F{SY&OU-dTrYQ%WaiAHk6XO}pnV7zf+Kss0^ibW!`&0M6 zS%>k}>kp`@do6v!X*t53uUuS*_zEa<5$n)BXJ0(`)ltuVUcu=Vq|4zQDae?s$fa&F zL?w+&nv7|AkMdwppLhPppq@Zbjjt1Zj>%tak)T^~RG84|3^9vT+I`)^7mO<&iJC+0DmwxgIO*sQRw!fZXPkBWs%OVtL&&Y9`{p{nx!m_wUd@$>CXrdcO)Z%KFUqOAW zP{zBqyq3SP+Vzfi1tu2%5_L~VW12w4){!K|vYNKdU`N8GNz27TIp`nRW{81Tn%a#9 z9L?ItzV)UKiJ8n*!<*?-gWope5-jAn>3Gx(DZ|J68wYil)+1ACSt(C=QC1oVtsUba z-!B3u%*wSR;W&RB=8WVzT+%9btd{WGqUunRG_+3PH4+ig7^x5VrRB%$F`ecQN)*Ja z7k7mX{7XtJc`Do6N92yRhAr=ZZrRFy?RkGFcjOu#ZxOL&#|B-A7YKY)_Xt6q<}<)@ zglT;b2NW#D1jKzdl(Fj+OWVSGCi#90Qg1V$F=f`vh_+Odl5}}_W7FtR9D4L4a#M>t z@?gf%eG(tSr#*}cNfZflNfC2Mir6c@x`s3t`ANL6JMNCPJXw6i-><*{(+`IXEDx1F zeTRH^0dRbBAtA5X`+JTG-tzKqLt~IK)o(LDNd{gu>U6T%d{JIWv$#>oPE!#(5{{+A z_N(Z!QoUe(k_<_gkQk{DSqME=b8O*iZFgC6;D~%DzrYc%gjwJv6$YdJ6>sjl+hq$b zZpa{v%2M!YYHf4viazQ{nYuHZyxFr$&h?QGP=y7wF{*BFLdh@FDarr((n#oj1GDur zVDO-P(5GKMdeSP8@$eT%PQqJ<*Zy^8v= zgmLKX$kN3bUHV;C)Hf~bXN>)kknFn;&$rw_J}HbcNp%^tHoJ@ z#Ad&yOb|fML`Q9?2~XP)ea#(r$6OxS{~9OeA2EW*&9)u&dbc~kA~{{YO;YQM@aC*B zdk7zX+_m7D8i%x1sF$TUO={@P(Z^(BOIB`D^6wfAN;j_%$uR=AIumuBu#XC-Hi!G@ z->Oml!_M4(J$A;z2&Wy_Qjt72=ammT${1Du4nW3I*a?qbt@BRR)U$LFAF64PbmH z>0;JnM-EY^{Nu4^lW3(}BC8tKI*EWMK@jV3_n%NZfv~;gzq}pn)3n>X;32ZIc}Pk5 z&&T%{+QDWK_vRij{9m|i7D`ADbbO546Mx~%cNl^+wuqpd+_TF7>(g5l`^P=*C)c{oE0?I{ zooK&V;OKH1>ds`LH^yQoH8N{{Oz=jGh28hQO9P-rbW zg!@F2oRwH^L1}^}IS{8pww;^&J{dc4Afmx4sC-5t(63x;XK*p7?TFVgkc=Rn6y8P6 zGIO2Z`tRV1p&e*&UD~N=dp5<+I{{{hW$yigQB08y1RP2Fk(OdZ%dc5cjsHf}!1DU0 zB`dE-;>40EmUHyuhGoEvVlzq!3k)zZ*{F9})m{ZLa;cpLp;GjI@e9VMWryqF~ zp1^$qRi}H=cP!%nzCF>)hv>qUyt3iPc#Ry8sm=0?2ao(QBtsm6KUEnkO044FMr3J} z$iQz90xC)W%~x;x>@(?_d}FJk&E>DZ_!w;=@t{5ZZ37xN{)ai1N=NK(@P*)mx&rz5 zc(PyQPeF81+EBr9d1_06O{S@agjsk-b550+A`vk585C2On-YS6;`ui;2N%jBF9?DB+qB*N#+%=xf)krL z&P)ew`4)WN&Rtv85h#EBvT^clpZ?*{KK*wXiG1Hsz6ms)l@pn+o^)b!VfJ=6dYg1%Cqvk&q*TC9d9eGK zPT?!w7^BlZ#dF%md{e!{9X{<~Vr;XX0^?@l1OI~;^A zuFGIj^S^S3nkP*3rmc7G!Q{_1__z`v1RuTy8{JdjQD~!nq8OOW%_^(UnP6wHeCQQ)dF8-KwnkQ&|=%VM-2#RqdRUY`mT%16vrB(8ni$3N7lzwJ5|pv0t~0znAvK;tdq(a`<}i9VeeDOCQ5+KM7J`pn3fX~RVNR9!5_8RPl=ps`VVNgXff{ZS_ zuF)M{O|U-#{1;d=;ph+ZUV8o{n!7n@(Owqj<-E$URxDJ#=ak)HQvte%#7zCpj)6_* zd}-~e$7U&O7v<)&%meJX+;G)4$sMkhT4tA%ae3R}3PQcMkmieX(#cliilw#|f$&tU zVugEp9o9>{hd5rF2cZU%Vgr+0{6R1ccB3_Rj{^@}%sgH##UPMT=2CS4Cdz zj7!qrYdf7eBr_Sgqy@#Ff@M-mj7;?aw7KRbh#=rV-g1LIBJEP#JPBltt`~Pn-M-_g zb*OLOAR|9XbMHo#-Fo(@0Xsv!YuL3}M0f9el^b)eZb{+rN>=oTqg7i}%?M^WLa&Ba zjK%R0^dkBFB5v zN2ykCOv}J;0G|_$*XBae&r8ilmi%!19&eQGKh)KTdQ5C-NtM4#e39YJ zsj2AO7a=wUMdd5ri;Qo15Qn*(=%7zGJvvNN?M@^dwx_r|jGs0LLrehXCd1vsY)8Os z2;pXHv!W~4c7Ci{pYXfGJpncDbIq5bDOYEn*@(%F>$Ke>^Tql= z)lJyB-5l15QY^Pq`tk8eMieEIWGmNI`o^2Pnyt5?+PDiXcwtigWrnAirCo#A_G{y^ zjUi9~gn}cVe`#e9EC2*ouQ@n`!wgeV_e(r`<~maIh<8U6&Ptw#qFo#j`Dk;euTy`w zVu3J$WiPdFs2CW^E=Q5WAN69NxJdfc84SPH@|x_Yf%|Qaq?O(%Ww+BO%;*_`wRjDE zzG#DZXV;}fUcIbuzy$|(VLyphhX)bzR;RZ?}%HQ+=@db`9+Qbsp5 zx5eDkw5VHBbI%^jaF1cow-l@;R_I{o{hzqQEywIu9viZq>p|gi9fxs2OY5SAwui;T znfBKzR?gVa?@XtmzA}Y zC2vK)i43*1qm1Bn9b-BNE)Th9=^~B=M2-q)32dmaHZ+^h z(I1avecIjY!7yl(+P%Qyb6R1iXBpcXWL=B2iM^3oUp!$$T*IpCNZiTeiO~!x_0|c4 z(Y?xxa^Ze&YJGEBWXAQb50>Bpk75|A!HgbE-UP0^24HPNrhqEg8NcX8+h6`%)2zft zz*kF2P`}CBc=X-*Q;UNzewo9MpC7oamXSSfc1ufGcY;p$gK7wxpyzq2;LyUSWl_ID zgXjwL2-0GJ=|CMgyS=&28vb0rMrFT|=XU{#CSHZhUpls(u1=V_R;HLY=Bt|emR4=J z4!4gYU2ab0ZGV2_uia}yL&nF)2ui2`MTwdpDzG^3Oxc4NeHO2UOzbH*?w9)tX4Ykt?>tw z1~NUqhpER?)BuI29xwXE2$A#rAzQXI-H;FT^(%qYp3bk>=S!=(%+LdwDH zMCHep^yxOLf$E!r*dPE2zWud9q9lXIQ}a>^%3WWcJ$5xoq3~1ta*~f-5=Y&C1RaXS*5-c+3Tg9>l<( zOX36(^fQeiZJwm;!{}GsOvoMwD*gu)zyCb6hYdrtVBJ*)kfZMbNh_&pn|b4uCMv8l zz?j7VV?K+$eqvdAYR)-`C8s~stm+eMWW%MI-t}sv6uO+{;UZ$dgm4jo;VuP{F4Y>u z+aW@qzpK+=?wiH$wOcURMok19F*#F6kPQS-@1>S(szoC!N_8U*jlhU4y(VhOL$BdG z<8WGk*=1xR-wmf2G&y@{WL~p0l)E78rolo`d-oC)CZpkfVZ;c8145|PxL-KJlKcrz z%&TWT+++K@pWIba7LvGgps5=(<0txf@Gzm%Qs zAN?cp#elk_SlnNYCr>{4QR9($*4p)WsZh8N!uYpzV2|4)#P8?D?ctt3iGmjAGBf@? z3<3Z9>6w2H-q61YHsGmm{P(JU`_OsejEe6Va!I`yJidMNf{y7&0{@Nr!v&RIBF~~q z?7)lU2BBly2PjGq>zVwEdRuuQs(pagt3BHo_OB)=Drm=V!+&$A+;^GgihXh0x*sg?HT;dcE}J?Ry922J<-e+> z1St?&63Y%V#>Z~Q0cgRFgKzzqS`oqqmhT6S<;ujrqn6eScFUxQD9%ScL5BYdEU^1%C?I-T3ilI5j@4x7BaeHEsEx`{^R$|C$BJ4tRX$w-dm2!trM+ zK-z^5=YwjL-eLYYg%VEyV{`6f^2-xA01N;l^PB&+9RNKH=HClirNJxd_$@yyzQ3QP zj#vNw0ip8{ABp-O)#|UY;Xf=bfB!%|hy~fxiD@p6TJ#ez+W)sI9Ps&*|DOyYDAK=L z?>whktV_#V6ceo^hI=B^Fxis9R?GuBzF@no40=t0+SAV$k=k+(?bI-D$tZFX@sg)` zl<#J4bhxVeto*BYd0H_s*0wHsGAVwovKq6^ zAj9X1k**++As>P{A@PDoegYT3|Fp@5`!1f9cP{|zV(b{ap|C18{e8MhOyxIay5I;pByUM zGVoeTie~7x-$;pS_xZBdh=kAWsE}H$UG;ME{?y}iA5Jmqdr(y&G0*798l$RC^q7g3&&GzS#O>*Lv*I+t@@M%r{D zom^V$Mg+-TYR3RY{kJT4cAZt&oUXXl78=psO$U|m6POv<}VVKGta3QTEd*G@H}G zdmoR5H#W7^q(g*ln}S39BBI^D+MO3WW=orVh}*@N5*i3aDlpX< zmdHl3Q_*te#GSrWZ%pSB21Q^GPCtO2hx|*-mr6+@fODAZCF0HX$Mu8nnx(X5_Sd)3 z>Czx6IW}HvltlV|Sr~TN%=HH^4 zvm5p=F>29WAMBdv)Xm(AH^*m3Otgt5Z26NEPsjD}YSJr1Am+%!u zY3XElJ@r>F%)W|F7SEoy7MwJ7`3skIS=IE$q8CU4*EDYDcyGkHw4GTjLECI)G8?F;@);rxBUAwtGATOZTsVoTCkrY4B~3WpUmcR9Pq3YvKYmQe ztEH5UC#RsO3y9{^G3F6*hdL5kqCnl@jm*_)}@F?=;1y(Tj)TK#=dcdzD> z!?89}o(ny7;Im7YjUml%7Kd%n{_X6{hK8#{$ncc>hGfXD4?CIlfSD~6+6ZHJigWK8 z*Ge+rT8;79)#O~+4BqPm>yzm9O!+lEIeYQY+Z31llKM@jO0&tQJk?eTwt{v|I~@(T z&Em>$DlrMkmba5M_gYuYy6aGt`-ZBQGlVKF7t7=Z-U7#MLpC=s^cR~jjx&Y|$NqAL zV`y0pnvF?Ljz~53j5Hx^(xtCpuPn5>To$ce-=8cnuX^H4KQAQe`pWKXS0Nue3xp3H zw2O?9f{F!-9f*7g(IOB>%ig<}l-jeuBVTktIv&p>+outaTjl5* z?(bwpS`2??Z&KLbaJo@^#AU`TH-nnUNI>a)JCZ<1yR$Y{Hx=mO|ZU~1s_XA=`eOf873>!kZ79M?{d6zrfOZGL# zp0W9bw)=@4^XT(jumn&VoGjX%bv+9Bv6yWqo+avCh33{f&GarJ;ZK!T?+)K?UUSza zUm@W70qK3l=XQSDyP}k86N~Sn$x+h%T%LEe?>RXf$8htnw~g1OiH&_LWT)XKJDH!Y z^OIGNtcyc(H{1G4RD73CxJ2hNh5aQ3K|1uZ2$3%=IZ-c-sE8zu-&8GEj~u4~Gqk3B zlGDpRDQN{o#mKCzRc>I`IPXKO>kG3xHIYAsfp0PfxwXm3Z`ZXNx+>KzYchAvMbbw{ znI)v;jO%^7o~%~=_XcuD^2;nSsb$OLLH{8`wgNKLX4x^NiwYa}Il=YG6U;+Nk=IHj zV4R5Bj1@tfcMs(s=z>C1$e!8*xcRv~r5GTv00z)v1Rw7#0!oIG=rY>LVm9N7coVv^ zQ9j2x;vcU^+(UDyuY-?(?Z1?wKLDqd46GpvUz3W5&iv=I1UNUTZ@MD*0IA782!<&X zoK2Fyrs*Eh;>AP#zZPbL=tr0*0|0{|std;>5=8cTcrojNDTBZE^{4-zbw{wNjXGOh zI*z3u{cVnNSkn z;Tk;{As!iFT~Xi~S3)Vu_lQqi1CF>zWT>=K+3-EFzEuW$;uBz_xfuryR)3cE=~HJENw1l#=?{e_7%C2-Z43O&m zX05my9J4VUr!<{rf!>`x4z6>p@S*1n@;UsRPnxXK=)iWwaoeg35lP%@ zIOUbgD&`xyVJ7ve#US`mM+8_ImXy?Mv5xo6f~VB*pkGLwl)){?0a}}H@0DNeI8jE` zbHdn~Rkgf_)COHkV%kO`^VJhz1xZ@|gQ+^*M)iV-G~0+&Pj^4t!sUkDq^KPX%Y}qj zqJrZ4a)+Yw zJ%+#2F7_gN+B>7Fr(|h-tRTfHV4%QXoM?*iX<0-YwaZF>!i_x9)G)|Sy6=u*hX%ED z6m489s-B?1o=Jl>+6vjX1u6HR28yl0@d!{4E70d@#nms=e;U-T^iTZ%^bW`_v-*n2 zi|582PF!%+9TNqjCa#DD)y>l-<0hj{#<21 z5Grl22-RzWB2nNXkMe>W9Sr&@hb&G`!`TdVU40(?i7AvcRoEdMMO-c`$?oTBX^>~P zw}PjhPRei`MPqbcJVQy#D=DWmkMFv_DidES$hVCIqr~w^I`4AC55Bq%*-kp5BS-Xx z7^RPX>p1P~9n`0c6toVxBwFf!JMf0fl>j|@IHCeKstw`W{;eDzXBX<^%G(adh9}=T zary096)JJg@Cm;+U)xWbTsh4R?q58uA+5fZ+`39?Z%OwU9oHGi>ZuC=lW#zuL2Y&; z(^2{LMXL*ZE!y}ifpm+#7n9+yOXOc3zR>4M(V_k1(5X<3wDz3g_37QKr+bbUDug?U zf?05sC_<7e3qneEFq33u`!}#g#|&KhKgi^7;hCq=_~a-|WM36{Kmh|7NKY(1 zu3WW7AJ5oG;z1Y&?MAR;0_qzb`>>r1Jdxw-N6N69AIsCaFDlFk@O36>-bWCO4<@xp z9?x4i=j-#Td(&iovRnIQF*H-B2t)r#!TEi}55lOLog3@0cfcN#J`v)+d_5l!a98tm z6wYQQ{7uy<{!|7U%IxLvw@$Klb?u;B6UMnPlUcEM+WqJ?+!de_C48=$#vdP>V^Ad8dCQCPH_&PRJvc=DdKt| ze(5!pv0~miw6A+G)W-{6?8mA36nSzoVynuvaC`HLaQv;ELQ3e4TS*pyV~Xr8$>j6g z9DeCuMgG!b;o!F3mPKM24vf1YvPIwb zp{IdX=-nM}5XT5^I{Uij{FdvID;tE1LrsnBx~*9)9%J-*@hi?R%NEVCvA}p<<+?r{HE^rA$R2VdhMO6xmGD{4ATa|Y5UVC znkp^rvLk-SeZsbUTpOiAMo;lWmG~ikS^8I|vK1kmB9)!8g}$w%*>{olCPv&Rgx4=k zR2r9wDHi)X@7|!N^69L_yUrEf=IiUBnrohQ_hgI_3eQmrq1CP& zglBa>4428=DFX0+76oz}Cw*d@E{DM{)gA2UU5hndUPTtvXzdK25T9{jV;k8FrZE2v-|zA4Coi()9_ z^#P-|tHU4o2K668F!iTZJ_(g9J(WUWacwoZa8Y293?Jvqvy^K~_Yzj1NhR5k2{yu@ z<%=Rc9ZsxrA&pWzjJ0a5^0a0mj%EBh4AgPB=hF!`WcYl)3X?3#|m zvO(arGYA`}P|c1t-pI@6u<8`J-N=(W9_FFHztZHh47H`PB^!5Q`@fV4-o6>1VY<=j z2d+EPK>KO@@XkCDhPswa&FZF%wyB=0tQIB9t!)jYL-Zc3fg$=4ktlId0N=}#aJ zP9f{KGA>5`QIeTumq}6>a}oZdKrq!q4I!Ip2Sy&G)ts3+&Q7+QO5vIBnIc`=-$m1M!4KWgeH>)H4^FvgB zO`zh1{z0PFs(9SM=Ux9&y$rICNG@D(^O-ku`3c-|rfP;@PaR{tmi{QgDO3Cz3&Y}4 zbH6}7%xkhIK+q)W>6V!w(jAWkr|8c8m>1|)y8#1vsi}ymNf*^ zNZy?7ve_jso%jDbx3kt$6CULDJJXKw^j`6%#eeWeL!;)ky{UB{R;t!v z20=Z@&v<%Q;j}v_6^m=>%7wRer@1c_+cGdsLo$8n+)74Auy|Z)J}&C50j!I-Hum}; zUhUo)db&d-B>E@NKyTP=Rj>mjVc25Zttq;F!s8%e8XTro&KB*b4fZ`49y<@CDt;As zq9IR)UpHLZ{_R)f`~{%Kl>rv7eB(TA17-T&&9CPky!{=*CRY6IdvkWx(YoPeIezx) z+J+a82KBwLi^We5wh*NJ(Ue{3hDxi^fnn_Vl}5&itrrh6h-Aw5 zpr$%ipG&=B?2&_#Mh`~%Vo4ja2uEKi?ugQ0!>7cL_{#7_b~xS{uoFQhQi*x$``d6M%pC=yr?QQ2u~mT>eS{ zesI;&WA4)H8d=Aa{PI%NlU!%!aKGi7N<&;Nzn{1=;O5(Jemce?3bns#9?#iq)y1tV z*I~_Oc75*)KV~-#dWZ!B+c6LR0DSb}8~J$Kf#Ct3iOE)T22l?>2{%dx)Gro!{K;pU z&9Z8hQxi4(F*%YRfP{L#K#juN01c{UW>L3ae$f{`sE5vQH;bEPVHbQO*8(%*<7Fn}S%r{FhTC z`zkk@WuS|Wdc0wsvI+*{L~Lm0xNbqgHR-e?PxjpkyV0gI8Y(msR1i+py#8`n_u@TQ zPIRdF)aYYlz_nI6h3dVsW7N5}&OBws^X_WwGqN;Fz+y}}(u6;ayjcxHQFt9Mm(}pD z7w_~s8wC_t%bn^7hSJ0O|MzJdp62+leRy{3ZC7|s( z)+l`QT46`0uidv&?bKTn#&gZGY@T`BKHA`(`VTkb=2Eu8-t4U$cyurzTJ^>H<4i^M zXznYfydFx(vw3y`4}&*kSa@o*Ge}=z3>d`%d*(@wy?^vbF7fbmE_|n6dKI`$WT2sCC9^fUN=jsV1{>lYgtL0zN6IyWgI?!N{)+jb{1=HuATS~&~?S|#3F!8 z1q1C~qO#4p*VFz5*K%diB?0cA1VmK*el1S2&EkpVqq{vP+l>DMh`(b}yNtW<Sq90zGGSj6!9X=LeZ#aNpnxKP zn1DA+QoPax3Xn??VA2ngyz>Urz%AQyfLj7f}L#ACw-X zlES%A{JqKFuvwC*~9{aO^O;C|W zRhn#yywv&7)!H~(f<{P~eo^mSAWVpBX{9%{J9KtvG2Fw%y4QMxD*e;38vr+vXWaTo z5E0y+6med3W5~Ll)gzp7+(?Q5KwJKi#rOA1%+8)vds+4NugI-k_hZeuUT-O?S~B>> z##~#>xX=7jA-Jc(?|JBHoNWl0-k6J^Rk9v(PalmdDs_B%q}^U(YGz4XtIaf$hNSc1 zhlfu+%Ukjfu~n2%AGnG9le<(jEb+KLXH`B^$>NAm(0tt5CiymWLd z<77~exJ_T_dv?N)s)JsV)Tg0WJtO43hw*YjE40ahZFb_}qj3@-Gn)@ZAiVRkeVr8> zZ;Z$rw4$IleH%{?c*ID22)BiZ?&;YN^0n3h5toc7NOsr5RI3n2K!AB^S9(@Zzj%PB y0#1HGKkvfSwWKmFjj?;ako9EnwlbhCa3xOUDDt+wO25l7PO~(}ps1#v5B>)u@fL&t literal 0 HcmV?d00001 diff --git a/docs/zh/docs/WasmEngine/figures/icon-note.gif b/docs/zh/docs/WasmEngine/figures/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/docs/zh/docs/WasmEngine/overview.md b/docs/zh/docs/WasmEngine/overview.md new file mode 100644 index 000000000..6a573de28 --- /dev/null +++ b/docs/zh/docs/WasmEngine/overview.md @@ -0,0 +1,3 @@ +# WasmEngine 使用指南 + +本文档介绍如何使用 WasmEngine 轻量级WebAssembly函数引擎,并介绍Wasm函数镜像的生成方法。 \ No newline at end of file diff --git "a/docs/zh/docs/WasmEngine/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" "b/docs/zh/docs/WasmEngine/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" new file mode 100644 index 000000000..03e6492bb --- /dev/null +++ "b/docs/zh/docs/WasmEngine/\345\256\211\350\243\205\344\270\216\351\203\250\347\275\262.md" @@ -0,0 +1,330 @@ +# WasmEngine + +## 概述 + +WasmEngine是一个轻量级的WebAssembly函数引擎,基于WebAssembly沙箱级安全隔离模型,提供高并发函数执行、毫秒级函数极速冷启动能力。 + +**WasmEngine架构图** + +![wasm-engine-arch](./figures/WasmEngine-arch.png) + + +## 接口说明 + +业界流行的FaaS框架一般采用HTTP协议的Restful的API接口,对接后端的函数执行引擎,WasmEngine引擎也采用类似方案,提供了一组Restful风格的faas-provider API接口,提供函数的增删改查功能以及函数调用功能接口。 + +详细的接口定义如下: + +**deploy函数部署接口** + +- HTTP 请求类型:POST +- URL链接:/function/deploy +- 输入参数:JSON格式,{function_name: String, function_image: String, wasi_cap: bool} +- 返回值:HTTP的状态码和消息内容或操作错误失败信息 + +**delete删除函数接口** + +- HTTP请求类型:POST +- URL链接:/function/delete +- 输入参数:JSON格式,{function_name: String} +- 返回值:HTTP的状态码和消息内容或操作错误失败信息 + +**list查询所有函数接口** + +- HTTP请求类型:GET +- URL链接:/function/list +- 输入参数:不涉及 +- 返回值:HTTP的状态码和消息内容,其中消息内容包括所有已部署到节点上的函数列表或查询失败的错误信息 + + **query函数查询接口** + +- HTTP请求类型:POST +- URL链接:/function/query +- 输入参数:JSON格式,{function_name: String} +- 返回值:HTTP的状态码和消息内容,其中消息内容包括查询函数的详细信息或失败错误信息 + +**query函数查询接口** + +- HTTP请求类型:POST +- URL链接:/function/invoke +- 输入参数:JSON格式,{function_name: String, args: HashMap},其中args中存放的是函数参数kv形式的简直对,对于无key类型的函数参数类型,默认从value中取值作为参数 +- 返回值:HTTP的状态码和消息内容,其中消息内容包括查询函数的详细信息或失败错误信息 + + +## 安装 + +### 环境准备 + +为了确保WasmEngine成功安装,需满足以下软件硬件要求。 + +- 支持的机器架构:x86_64 和 aarch64 +- 支持的操作系统:openEuler +- 用户具有root权限。 + +### 安装WasmEngine + +**方法一:使用yum安装(推荐)** + +1. 配置openEuler yum源。 + +2. 登录目标服务器,安装WasmEngine。 + + ``` + sudo yum install -y WasmEngine + ``` + +**方法二:使用rpm包安装** + +1. 从openEuler yum源中获取WasmEngine对应安装包WasmEngine-*.rpm。 + +2. 将获取的rpm软件包上传至目标服务器的任一目录,例如 /home/。 + +3. 使用root权限,登录目标服务器,参考如下命令安装WasmEngine。 + + ``` + sudo rpm -ivh /home/WasmEngine-*.rpm + ``` + +**方法三:源码编译安装** + +WasmEngine采用Rust语言开发,因此依赖于Rust语言的编译工具链进行编译构建。 + +**Rust语言环境安装** +* Rust openEuler22.03-LTS安装: `yum install -y cargo rust` +* 或可参考官方文档安装:[官方文档说明](https://www.rust-lang.org/tools/install) + +**WasmEngine编译** + +```bash +$ cd WasmEngine + +$ cargo build --release + Compiling libc v0.2.126 + Compiling proc-macro2 v1.0.36 + Compiling unicode-xid v0.2.2 + Compiling syn v1.0.84 + Compiling cfg-if v1.0.0 + ... + Finished release [optimized] target(s) in 3m 41s + +# 编译生成的二进制文件存放的路径如下 +$ ls target/release/ +build deps examples incremental libwasm_engine.d libwasm_engine.rlib wasm_engine wasm_engine.d +``` + + + + +## 使用说明 + +1. 在一个终端中启动WasmEngine应用 + +```bash +# wasm_engine应用需要root权限才能执行 +$ su root + +# 设置RUST_LOG输出的crate和日志级别 +$ export RUST_LOG=wasm_engine=debug + +# wasm_engine默认监听在主机的10000端口上 +$ ./wasm_engine +2022-07-28T12:32:10.007200Z INFO wasm_engine::function_store::local_store: no persist json file exist, restore end +2022-07-28T12:32:10.007255Z INFO wasm_engine: WasmEngine listening on http://0.0.0.0:10000, waiting for request... +``` + + + +2. 接下来就是将编译生成的Wasm函数二进制文件打包成容器镜像格式,并上传到函数镜像仓库中,等待WasmEngine部署时进行拉取。 + + Wasm函数镜像的制作方法,可以参考下面**Wasm 函数镜像制作**小节的介绍说明。 + +3. WasmEngine 提供Restful API接口说明 + +下面以`authentication`和`hello`函数为例,使用curl命令进行函数部署、查询、删除、调用的介绍。 + +**部署authentication函数** +```bash +$ curl --location --request POST 'localhost:10000/function/deploy' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "authentication", + "function_image": "127.0.0.1:5000/authentication-wasm:latest", + "wasi_cap": false +}' + +status code: 200, message: deploy function authentication successfully! +``` + +**部署hello函数** +```bash +$ curl --location --request POST 'localhost:10000/function/deploy' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "hello", + "function_image": "127.0.0.1:5000/hello-wasm:latest", + "wasi_cap": true +}' + +status code: 200, message: deploy function hello successfully! +``` + +**查询全部已部署函数** +```bash +$ curl --location --request GET 'localhost:10000/function/list' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' + +status code: 200, message: all deployed function info: [{func_name: authentication, func_image_name: 127.0.0.1:5000/authentication-wasm:latest, wasi_cap: false}, {func_name: hello, func_image_name: 127.0.0.1:5000/hello-wasm:latest, wasi_cap: true}] +``` + +**查询authentication函数信息** +```bash +$ curl --location --request POST 'localhost:10000/function/query' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "authentication" +}' +status code: 200, message: queried function info: FunctionEntry { func_name: "authentication", func_image_name: "127.0.0.1:5000/authentication-wasm:latest", func_local_path: "/var/lib/wasmengine/functions/authentication/authentication.wasm", wasi_cap: false } +``` + +**调用authentication函数** +```bash +$ curl --location --request POST 'localhost:10000/function/invoke' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "authentication", + "args": {"arg_uri": "https://abcd.com/uzid", "arg_body": "sun", "arg_secret": "755d0845dbc22b3ac376ae73c82996b7"} +}' + +status code: 200, message: {"status":"403","body":"

Auth Pass!

hash 755d0845dbc22b3ac376ae73c82996b7

"} +``` + +**删除已部署的hello函数** +```bash +$ curl --location --request POST 'localhost:10000/function/delete' \ +--header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ +--data-raw '{ + "function_name": "hello" +}' + +status code: 200, message: delete function hello successfull! +``` + + +## Wasm 函数镜像制作 + +WasmEngine加载运行的Wasm函数同样需要类似容器镜像的管理和分发能力,因此WasmEngine复用了容器镜像仓库统一管理和分发的能力,开发者将Wasm函数制作成容器镜像,WasmEngine从远端镜像仓库拉取。 + +开发者可以通过openEuler上的isula build或者docker build容器镜像构建工具来进行容器镜像构建。 + +### Wasm应用编译 + +**Rust Wasm编译工具链安装** + +Rust编译工具链支持编译成wasm相关的target目标格式有: + +```bash +rustup target list | grep wasm +wasm32-unknown-emscripten +wasm32-unknown-unknown +wasm32-wasi +``` + +这三种不同target目标格式的区别: +- wasm32-unknown-emscripten:Emscripten模式,通过Emscripten编译工具链emcc将代码编译成wasm应用,其中wasm应用中也会通过import的方式依赖于Emscripten提供的abi接口,通常用于浏览器场景 +- wasm32-unknown-unknown:Wasm标准模式,完全没有外部依赖的wasm标准格式,不会通过import依赖外部接口能力,通常只具有数值计算能力 +- wasm32-wasi:WASI模式,wasm应用通过import导入外部依赖的wasi接口能力,通过wasi接口,wasm应用具有文件目录操作、网络连接等这些扩展能力 + +在服务器场景下,当前只支持`wasm32-unknown-unknown`和`wasm32-wasi`这两种目标格式。 + +具体的安装方法如下: +```bash +$ rustup target add wasm32-unknown-unknown wasm32-wasi + +# 安装完成之后,对应target之后会有(installed)标识 +$ rustup target list | grep wasm +wasm32-unknown-emscripten +wasm32-unknown-unknown (installed) +wasm32-wasi (installed) +``` + +**编译experiments目录中给定的函数样例** + +```bash +# 编译experiments目录中给定的函数样例 +$ make apps + +Building: fibonacci + Finished release [optimized] target(s) in 0.00s +Building: hello + Finished release [optimized] target(s) in 0.00s +Building: authentication + Finished release [optimized] target(s) in 0.28s +Building: authentication-wasi + Finished release [optimized] target(s) in 0.00s +``` + +编译完成之后,就可以在experiments/application的各个函数源码目录下面的target目录下找到生成的wasm函数。 + +例如,`authentication`函数编译生成的wasm文件路径为`experiments/application/authentication/target/wasm32-unknown-unknown/release/authentication.wasm` + +**手动编译函数** + +进入experiments/application目录,或自己实现的函数目录下,执行如下命令编译函数: +```bash +# for wasi +cargo build --release --target=wasm32-wasi +# for wasm +cargo rustc --release --target=wasm32-unknown-unknown -- -C target-feature=+multivalue +``` + +### 打包函数镜像 + +1. 创建一个空的目录,将上一步生成的wasm格式应用文件拷贝到该空目录中 +```bash +$ mkdir build && cd build +$ cp target/wasm32-unknown-unknown/release/authentication.wasm . +``` +2. 编写容器镜像构建所需的Dockerfile,内容如下 +```bash +$ cat Dockerfile +FROM scratch +ADD authentication.wasm / +``` +3. 执行Wasm容器镜像编译构建 +```bash +$ sudo docker build --tag 127.0.0.1:5000/authentication-wasm:latest . +Sending build context to Docker daemon 1.787MB +Step 1/2 : FROM scratch + ---> +Step 2/2 : ADD authentication.wasm / + ---> 897a9e7a1ce6 +Successfully built 897a9e7a1ce6 +Successfully tagged 127.0.0.1:5000/authentication-wasm:latest +``` +4. 将容器镜像push到容器镜像仓库 + +如果用于本地开发验证,开发者可以通过`registry`镜像在本地启动一个容器镜像仓库服务。 +```bash +$ sudo docker run -itd -p 5000:5000 --restart=always --name registry registry:latest +``` + +push容器镜像到容器镜像仓库: +```bash +$ sudo docker push 127.0.0.1:5000/authentication-wasm:latest +The push refers to repository [127.0.0.1:5000/authentication-wasm] +720b9e537c85: Pushed +v2: digest: sha256:a7b8e58e4b9c2abba6a39636dbc904e01c4cfa7e1d4cc6a97f8e955e148af41e size: 527 +``` + +## 注意事项 +- Wasm目标格式需要满足WebAssembly Spec 1.0正式标准 +- 如果应用程序需要WASI接口能力支持,只支持通过wasi-sdk或Rust语言的wasm32-unknown-wasi编译工具链编译生成的Wasm文件 +- 不支持设置每个函数调用的资源限额 +- 只支持单函数运行模型,不支持函数间调用模型 +- 一个Wasm函数镜像中只允许有一个wasm格式模块文件 diff --git a/docs/zh/menu/index.md b/docs/zh/menu/index.md index ba9380147..dac22055d 100644 --- a/docs/zh/menu/index.md +++ b/docs/zh/menu/index.md @@ -222,3 +222,5 @@ headless: true - [安装与部署]({{< relref "./docs/NestOS/安装与部署.md" >}}) - [使用方法]({{< relref "./docs/NestOS/使用方法.md" >}}) - [功能特性描述]({{< relref "./docs/NestOS/功能特性描述.md" >}}) +- [WasmEngine用户指南]({{< relref "./docs/WasmEngine/overview.md" >}}) + - [安装与部署]({{< relref "./docs/WasmEngine/安装与部署.md" >}}) -- Gitee