From a58279558de408fda57cb08514fe6ecf92273d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20G=C3=A1lffy?= Date: Sun, 12 Nov 2023 15:03:45 +0100 Subject: [PATCH] doc: Add NetworkTime guide (#102) Closes #91, closes #85 --- addons/netfox.extras/plugin.cfg | 2 +- addons/netfox.noray/plugin.cfg | 2 +- addons/netfox/network-time.gd | 11 +- addons/netfox/plugin.cfg | 2 +- docs/assets/network-tick-loop.svg | 2 + docs/assets/network-tick-loop.uml | 18 +++ docs/assets/network-time-settings.png | Bin 0 -> 71341 bytes docs/guides/network-time.md | 152 ++++++++++++++++++++++++++ docs/tutorials/ticking-in-sync.md | 3 + mkdocs.yml | 5 +- 10 files changed, 183 insertions(+), 14 deletions(-) create mode 100644 docs/assets/network-tick-loop.svg create mode 100644 docs/assets/network-tick-loop.uml create mode 100644 docs/assets/network-time-settings.png create mode 100644 docs/guides/network-time.md diff --git a/addons/netfox.extras/plugin.cfg b/addons/netfox.extras/plugin.cfg index 8d57738..7cc1f4c 100644 --- a/addons/netfox.extras/plugin.cfg +++ b/addons/netfox.extras/plugin.cfg @@ -3,5 +3,5 @@ name="netfox.extras" description="Game-specific utilities for Netfox" author="Tamas Galffy" -version="0.15.2" +version="0.15.3" script="netfox-extras.gd" diff --git a/addons/netfox.noray/plugin.cfg b/addons/netfox.noray/plugin.cfg index ee4a273..46b8157 100644 --- a/addons/netfox.noray/plugin.cfg +++ b/addons/netfox.noray/plugin.cfg @@ -3,5 +3,5 @@ name="netfox.noray" description="Bulletproof your connectivity with noray integration for netfox" author="Tamas Galffy" -version="0.15.2" +version="0.15.3" script="netfox-noray.gd" diff --git a/addons/netfox/network-time.gd b/addons/netfox/network-time.gd index e8be5a8..ed999e9 100644 --- a/addons/netfox/network-time.gd +++ b/addons/netfox/network-time.gd @@ -1,15 +1,8 @@ extends Node ## This class handles timing. ## -## Timing in a multiplayer game has two important jobs - to make sure everyone -## moves to the next tick at the same rate, and that the game time is approximately -## the same at everyone. -## -## The former is handled by this class and its signals, and the latter is done -## by [NetworkTimeSynchronizer] in the background. -## -## A separate timer is provided for network ticks, making the network game -## update rate independent from rendering or physics frames. +## @tutorial(Ticking in sync): https://foxssake.github.io/netfox/tutorials/ticking-in-sync/ +## @tutorial(NetworkTime Guide): https://foxssake.github.io/netfox/guides/network-time/ ## Number of ticks per second. ## diff --git a/addons/netfox/plugin.cfg b/addons/netfox/plugin.cfg index 3ac6c14..94b8376 100644 --- a/addons/netfox/plugin.cfg +++ b/addons/netfox/plugin.cfg @@ -3,5 +3,5 @@ name="netfox" description="A higher-level networking addon with rollback support" author="Tamas Galffy" -version="0.15.2" +version="0.15.3" script="netfox.gd" diff --git a/docs/assets/network-tick-loop.svg b/docs/assets/network-tick-loop.svg new file mode 100644 index 0000000..b82c474 --- /dev/null +++ b/docs/assets/network-tick-loop.svg @@ -0,0 +1,2 @@ + +before_tick_loopbefore_tickon_tickafter_tick>0Ticks to simulate0after_tick_loop \ No newline at end of file diff --git a/docs/assets/network-tick-loop.uml b/docs/assets/network-tick-loop.uml new file mode 100644 index 0000000..654121b --- /dev/null +++ b/docs/assets/network-tick-loop.uml @@ -0,0 +1,18 @@ +@startuml + +start + +:before_tick_loop; + +while (Ticks to simulate) is (>0) + :before_tick; + :on_tick; + :after_tick; +endwhile (0) + +:after_tick_loop; + +stop + +@enduml + diff --git a/docs/assets/network-time-settings.png b/docs/assets/network-time-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb7815c3874d62cf9e43f39fe4e3ddc9e821102 GIT binary patch literal 71341 zcmbTebyQVd`z{QkbO{JZh)AP=gdp9W(vs5M-AG7-ba!le)1A`Y%_b!`U7O}Cp67jk z=b!V9bH?Ww$YQf%&U?-~uIsuNAqsNh7^p<3aBy%Kk`f|{aBv6#aBwe{kr9DU+W&gL zfrEn&FcTJ5kQ5evZ)?!sSt1ibZ_j`Yhu(7|9xBG$0I}uN#+tt)7jf z2;$;9Uif)rp9qN!!ag++kTg;jnyq$09*$i0I{ABV8fE?(ciYkHwL9%Jlbg8*&JX4* z`T_!!8AiX%aBZ;VZ59!Cyf$b*4$z-+o+e2WPiyw zva{6Cyj!W8S!Ie&x8J?ger2On#k|x>{_&5kj_&tut`R-T%3vx9?Ch*xEc6wxLE1Du zLMfxTe2?UFOwrQhYH!0y&^;rMhOkR1qby4PKO!Av_D(!RatoQq=?uq=rB(&8e(ci`WR zaI+8a4aHXCy8|2?BgOLmjqok}T(heFr1{%=;q-6s5=&hrux}&g-m6egT zBb>0kk)ETG;d>V|N7MJ>lClbFKQRg5;NHVYiU=yZE*?N!97$#tu1}BgB}?LKN>-?b zs%FAGI)8K^8W?;|!gqgHc>@HbA(5t(dA0B>STG{ z@#Ev~mMaZX&ARZ+F;1?&jCA*%(bn_fRtND;l+zBE3wJM785tRS0Re$Djj}6IWby!P zA!PDyw}C_FP5VYm>e!;T?Ck8Ek`gHG331jtfeC)ya;f}VNq2Yma@7)9$FC%)psA3d ztv`p(()6hRy;>q$AxnW)p=73T#@xlm#>VN}w{IC!d-u$?%JAJK%EgKH4h{rOkfR^X z5XK_ve;yftt@~$9p-dHlF!CL5)5xA9U-63!d3kx=LIqlV63n2ynCF23r+P{@YB9!1 zUuTT#%Y$EvPvZ$Xqf#JZmNt&A9OH$nkf z0bej>S4G_QD@0q3qP%IGHSq5|JfYz17cCVpKXLE|Eva$e1}d9BA4(H^8JyI5UO?IG z_9T#M>yU-~Fx3hAvgSv;O%H#*>09~qa^#e;Seuq1sQjq7OM(I7Q`+4%q?q5<<`+1v zTF|WVBIs%BLG6e_>ERVj>Gj~&>eEN?gDWSqJqKVu|0=DU-Fd%GZ);tKgpy2>nHFwcpi3Nqjvk)N z$@>148+5ETPxQVl)*GDq6YF;^Ud)^!a|=A; z`*h3q{iyoHEBY2iR-Scss$&bT3LDTJ{|(2hDab(Q2$CI-7ZyynE;iHpNJK~fwNRSP zY?&sSo6N&6W&0Mf3v-t1*|H3d>bGqaWE-HrV_~^TWM$-gmxH(} zvYzat-CD|D+;Ff_$-4uxPpA|?f)h3A94njxQ9dut619g0X?!G$uTa|VbPkjJ$y~3F)1?H#8mN=p>t&)A+G#4Wkrdemc2HN?*N@Qc;!ehpDlNor2hb$y->G3_%Qq>5JU!*##aG+z(4wO_|nBu=~^*qeO=}*&&JLTlN`7I>7ilnc04A z(SAMA^RYV^Nvir4%rsJ6nnO8_23ELmPg+E>#)V8<+E+gXjV3>#AO~XWf3SDLuXKWF z5J67%Zt2-ZZnZ)o2~R zmwKLfmuF@QB}FACJlLEJqd5zRUPQES#uCFXF?u^KRa>&TSwm5hVuaG7(py|~*K8~> z5HuXc7LR^FSJ}ERB4!(TF0UN4oKI+$@6So+Rf?7`hHRH5DT_5mE3UKumB zG~(n$1=?I#+GE!2#~fFrtEYzr-8k9jT}GC9raM6`kBfbHmkoknlDAef3U>|y^rm_- z2FLe=kD1m|D}urN&KzN^6yKa?CdyUq&Zfem6UaRIEf$(;1DcPT1Hy1uvzw$o2$2Vz zymSa@L@0oqe`mE}3Zv%jPOMK5Mfm-0Lppt;lQ;7V20A@xw9jP;`p@PP*{&mGUKCh| z27&2AOK%ps*-N)(+6gw$?G+Xi`en!Xhj?R&<}X&&XcY||4jEvlS^;4+Z7{}K1gWcm z<+BUcWm2WVppr)cr)!+H+xX)%3IhcBmhX{D@g0LtZW%~QiwmcZtJf~6DcIt#tjb?@ z1nR-)9~;UM6HEMY!sascKXC~q8)34x-BP?$ZX4KV5I5a*iZXBZs=xIw)#dKKP`aa_ z7nU5&5E6ON(9u>2VA(^p*1UPYdQ89hGx5CA!oK17hOCmMFhKtC#^*2bpT>hWFbfSY zrcVdkCSyhuRbpK&_+;n-V){WvxjqBOw-9GQ0;A)*jxVUb(4^VIb?Xvm8U?MvdMo#y za&csn|29c%ON7s)Z*zHlsy9n&qW~1NpsRup<2ip)&t@_jDSlFvdy!ZwLwR)F>_hQM zmt(rIPu4>3by?_}JkZOW!u2 zD*QY3$I}}dN~m!m_or7S-&wX0bV_*gf5v|$LS%IyZ}o@c)>UZSkv^T-k!ydV|65LGd^c31dWQ%oVZN1nQoD@!UAJZ;g9eeb<{<~mN7FhWN2~B z*}#M%FqHqinK+@^brRI_y)S^z1aANJq*!`eoJG*WYP$vFW|caJsLvghk7xaBj-Tod zL?Oe)~D{=J^8B6<)AtOJ& zFAB3A!a6!5YLbX1n#E7_inbQs6i*KQSEoN}U$oEJP&?G^Zvo9s*Bf1s<&b8}^-dHI zME1^wFc3$pe7%Wrv8cSTr)ZdxMMl!+eC{Qm2?c0G;;!TjLljiwP?LR##vs3GyE74p zra*64_zlQ+$vMrhTqH{8YLI>2*f4~VQ_c6CkFMdhVgWy_*L{hoNl8bTC5O+(7LpMd z-T%^ZvWThS-fUV{mQy}8>ypdc@6V&AiFU}SyFt^FwXEWg_T@Bo<6GmRnHd>jLjyXg zV{@A0S1_R&O*oO*N&=av z_auU9BICzN-4`$UrAH?xbfpWv(kA+pEwWiG^`K{GWQK1HuO(Tij_Uok49^`pcWQQO ze{?qpbCs(6r7y}pxAGN5y7QwYt&9CWc5LJyj8br0%2Ih_R4OTPzfEP53>zIDYShc;a0fX^o_R^fx;l z`MXa{y;p7wb&roqx?TJGA%ayb^Ic`0C zQqW{p_K}(h;&waEcS$;%N435d!@QcMxIbSr`RnAdqAtAod3+e1@w*!efK41{l`3vu z>3D3y88>@eA96_tsXt*)dGw_y7>7Qc8ysm9cje8$*MbOYT~6&Z&YE}n`S}Lp8SB<3 zrFPwSF3Zh~`kc(cq*|MQG)0gs#|JsB@Gy?ve{^%B@d_GeiVSNz!>$y>)Hvf`n`3Gd zZuA$_bQ-(l9IF4$tXZo5>FRN|dwtRv?+#kLwmQb^5B=%UxV;Ew)!odgZw{$4P$68- zRnH(FwUhsR&NLtdsrr?^h1ob8h>hc$Ap-2;D#lf)W&n+k$w`B1wS&OWd*3QXG8N&8 z;H7VdMn(e&oIqS)x{3LE$6{Zg-3j3^nQGeq)^-CXVx0eZ_lA79bqg_O__78@k37Uraaulo2iDDx(q{jx(|B+X^#Kqh}Ad9>3EcG|aEmIu2O zzq#^({*ICZU;zh!FSfb8{ejxQPJeYa?5UVW!I>lKE4b#lX1$SmJJP~UwrQdCY5Kr5 zoxiNSwZf(_p1j*gw|lUZ_Tmxs6X^`e!x)p>7K9m*rxnTV{8C%%;&7>f&H;@n(Gz8K zAz3Pwl_>9*-A(!&wk8aI^-kSS5I`d}*VbUs^8s+B)@grMW;P)`;dIO0aG{^zZ+xKm z!Pfu1_^mIG4xTOki+=nxVV_}!OjTXv8Fe$|FKi+7t~Uw3P7?@UX+{Y7d@bn(t8dkE zF%hYN4Dt_b3O)~Dbz{Gp4*Y5`We5H6t%2mnfxwJHK$9od{$#p=4(K^d`~%hOe#U@1 z{)09H{^wKj=Unvf3I9aie-EDv;eS8ca)hOceh!qEo7@ zQ!K)Bme7E|=rDDB0Nkn*N;?6a{5x)Nb(2%j zaqCC`Oy;p)UG=&)g({56=qN2&L?j?vnRa)V&35gebk>2@QU z$Y3~BH)huiAu!~`!6TGVHRd8G?}STo_b4ha&u=QYYT?P4Pcp^9#T|e3Do3@XQlre# z(b2xNf-rT&xpS6)wO|W-?x~`0%lpF3~|dDx>I@{k_0Y z&X62Wfb&-p!U*d9eP~g65wX%uLTr3U=Xg&>>)ki{-kqDLK%FC0a`<)Ho12@nRvZ3b zswGAvO%ckfGg*p7!N^#`hq(!?aMK)Y`qc|b94_p{?ADwmORDtoB4Pnk)6+Z$o~^B| zBI2SOo16X+YuGIVIUi>A!Y3O0@X=`uEoH-(1v=*qrFWK6GQoZNmA{h+`L}&PzZZ}e z@V)XIk(SDjadR-y+ub*YtvqDFoqA%V*;lcKM1|$ImC~Cxp<8RtZNEc2Jt!iruhn?Z~tP~L|D>`-7OFiP5rRSf(bI^vntJHyE zi5~On>W6cPXN5ZkV=REn5PJhb^C`%#OkT47E@?i9_X442 zdWPc+#_=R;rQOBJ%ly2{owhzWAFhZ4J3{a${6z`_-kZen>E#y}P8caMJjul=L@bkv z-%4g`YF%vEo{~T>8qPw8=swXGv^{o5{OKVW$!*LJ3>`Gb*LFsEe0&^E6%RYuBi(Hf_ItD^bZPFDNUs`nyH2X8X05cjV#TGb9{&=Oj8;W^9BS0CaQC zK|_6IWrv>{Oc~+kw7lNHE%C34s=2^|`@D*yx5MqmP}K<;+9P_p zIKLFlolt0j!SVLCC9IFib@|?0xRbIL>|hg)t7YKfznNN|ldW20YGtt_p~Ht6gg{0{mcaOZc!%31HZ@i>OH~?J z&fGrK-F>d;#6Lp90}{tWAK9DJQ&PC3h6Z`DNS}kXL0@Pv@IZ3LgtI~VjZJ-VmDLwX z4EV#wtUz1=!sX=r^srIlr}vEPy$%_|LVg2-65<4S!3+BNc{Sm;zr-%MNUM$Ig!2`d zZAL%AvD-i*AxDH)M48MCNQp}$z-9(p@Tr3h#@Y~8j6&o%OdBm~HE6mU34~;_d=;`4 zY)?fU)E@>+bUN357>}j(%5s#h#kW7E|LUd2XVU1ef9DfS#`B;wjE@HA0`bOux*ZE@ zxdg)`GI&Cej@wgXs_a8UhZN}Jd2Z(YftY!cYvLWL1Kx~AI_}Z0J=t4~$RPgJN7k6B z?QwOU2~(Y#pAPR@&&sRu!%_q1&shSTNid5o%=Zr1vXqOGcrCaFVq;sHzHA$s#Q2o{ zZn=N)f#OecLTbc_HOMF_we1v0&XUGrL~i0y6K1;~*eH|CIKR)6Vgg?GjXr)jlLINN z=TC+gl5L~b_05f2!Z9xy%F&{{K2#ZR$h*F%pm_r zIRq-BtqfFN8tz!q<}2G1+jl_BBW!AFoxD!^b9+#8J0G4d zcgQ63gbeNz@vSxz>+0$nk0gnm{iT$W8tUbR;BIX0?lDh}&x^QgpxRY3=N|3P&p_tr zoliy2uMI~`bjk#BIgcvyrfhd!yys>m)mFd;?%A{M_?ycKl}j5t{M-REY$kNZoQje0 zSI$QEdFM3U0LchbhapRJTwMR~+bN!{0g1i@!0FEZN|FFmJUV)(ub(3+FMaw~DNv|$ znUj^-(W%;P$oZbldpLuWRNUu>r)LIdwXvd_uDqZgGxbylqu1%F9b0`3Ix?Pk4B*y= zA}^6J-*uW-$0T8oiJtFN7(sW`OJ^UEu)IY?MXNl<+S<=ScWzWDn$c~@NanRb;#&=gio#k*erw8>qL(-{I+&GJ zk#uh$8t@XD%*>k@87a58$W5)h_-tL)sR3?x^wg1FpmJhN;Xo2rBWQ*l2$!j{dd#B7 zP*b^{(T%IYwh8oWze{GMb^F~oEYuhgtCnB@iS>MYIIlD(6exwpZ!MC5EhCkmS5eqq z9a&oH$hFA5Q0c+MUJ|hpQ}u18-k&+y-OSvKikdnF@YVZ=hh%;i_E&*DY+pEViE#de z?=@bej5sZxv{-k-3ckf0(vsi#kXj-dLYyp+Wt6F&5 zayx0m>of5!+Do39KzHyqLX-9rV}40<5a3dxhq=@rSx2f5)>{k?=4%tLBIT|~zsiUj zeTk)^y5jFi0c`)(<`JsRg`usiGFN3bw4*isM0wO8EFSs%1K`3xD%I`2rddMTViRWB z!^Loc?LtxB-edHE7F?KD){0QQAY&)_7KrjdK>-GB+}s3S5Jot{E`IxzVz=tJ^y=QK zW@WWyqogzTS9`@PN&+#w*6A`!0llz=C^e;0z3k%ZYI1owRBoqLUUr1xxw2wU1xmC0 z{Mz_{>jsCEm4N|Cpz=^$9hb1NVRE{}0CHw54`gURe(`WTb?%T8w<;edJOk_jH|zCs>v&i?~d8H zs?+}b`IBUTdwYN;=sYrK4vLI{ayo2MyFmMizSD3&zj{i*N*jT^^R_zX2<7xNV|Kmi zRtyJsL*64jm-nc0n131Ad&=Fty$TA`bM!_mm-ZLxqPu-j=>M#YIiTN~ofM~i}voK*r9vG9}1-$*F|pWVw!$q-&NCC4QR0GW(5 zJv~XL6%RlD$I-E$r@gK1fjYTZE=ul1ccnpKKv1B2Q)@)Q@)?ipAy!8zJF#(f^6hPJ z^<>JC(=z=VAZ&Dth);YKkq?;AqIrBII*WYQWyNeTZ$3jv8`!vW+XwfddTtG&-e5vH|XSh@h{ z*xTLBYbwAmnGrKkVzsh5>{@A0v({!QR{e$Id=!YC+v41JH$bvB!&{P9>Sy9}M(o)1 z{&6)n%5@|7xmv;Bj^X4dx zh^f5`je@L-Zs-$G7nZ7fzoAp2$vr(6&R5-J{kdYrv+@9S)jM+JI_2DxtN>0fHf{27 zw{3>Jd}-R6z>9m}%ss;3C8(+Q4TYI`;^Kl3$!m}d2WNPiE*1q9U8G1EfG|jodfZOq zvE}8~Ik~x`X6{IcFBP;8AuL9_`ybfZ7tfm)EZ^1)Wh)jL?#B&0;|VAf>ZV_;9P!vF zE#^)H7y(Ku;1lsHE{-nXS3s63plssN#^>sq{8;Pos?)Gi|Ag=7_kxFk8H7o+Zu^xd z{>~K@?GUYsnCPxaaE62JcM8iZZG~|&Csv|EyC|c__0hoDRkA=KL71dqOxHS)c{1W# zmL?Vk3K*6`fO5=!l5$cJWWTod8oWtT&hwTo^VLgJBu5)4Gtuek>7EB1;q=^y{lJ?< z4{cn=M3=;cXbmwu)IhbyL;J@0IxiZy^X*Y0$G2swVTwf;s0#4tzZm`GnkHP*6?Lu% zBObtbra)*ESFt8_DXj=!Sdp@Rtp*)E-QAyKEJXB} z<7RQ@_cKLX^#II@BiLcF5-S!z#O(9+{NeJI=jUw5+R)#4q-Kxsj3AGnKj8@x2Q290 zQOmAGAWO3=c4AS&c9R{SxwPNwWs~br3>GWXYiKO}(t31+#!RHY)dv~|{_O=wGTqSu z*wGh%j^0tImH-h+eT>^5Kdcsfxi!uB64mu7SDw?B)<$4_r;)RIA&8Oor=0MdZ+V7w z;$587Q1cJ>jS2A7q9-ar1-O`NWXVa7WJ+)5K=12Ge*`?{1x6Pg-y)RIi z*xOgp(lb(#lSig3Ho>2p-rpwy2_oNUi-gDZC1^<0d~h1ROjasiU%<$PeWjjgRKaX> zAL|GYwdZrE7X9n>^#gv_eg{^&!?XO{6=w;F&nPH%mUo_@xeLx}lOJrCRSqy6OLpRQ zz3kz1Rwx=o1pRAyY&llYl$+cn4>LI?kig@^nD~v{d2U_>>V74Qx@zcSd9vNva9y$8 z5C%ZCaIGoK`W=yZEpe&bOUMzM@?$8)&-_)@qvS3iD4gk;N{vmY0 zy9pqYW%$WwCnSTc>XSgcZ znL}pUJA9#D4Q#g`E}Gth*(}YiPxo`U6d_Nd`#ACDmM}Ej!(}vbvF}XbJA)8w4kRox zBVfm_FFoP8(MCj!JV(6+vy9>@4^&SF=W7#z|b=h##RK2*Rb68wI zq--nRy#hegUQyZ$If(I7TZRk>t=o{RUO3eSb^)NymMC#>-+U&&3^gtgbAd((q)){7 zL_*qLtu%zwk(DL87t17}(t|DZaGiqtE;O%g&xs@mlqf4^CtZ5ZGsY` zmkMX*wJAxvv}aLoDy;70#&jjkIPL71Gmg|KwhUnJ;qTO=Jo0YDxd{5m?9-PoWr~zB zUE8lL&1{YdE0;;7`JjhiV69kgF|o~H7-0l}g_f;dR(%N{eDI<38WO}rsQ{Ke(|}2Y zQ{ys%96D-CfWd17$uTfF2?}PM+1G5%7CC7tIiLZhLZ=~1dUW|{uHC)TOVtvq?jN>! z7NGjM@b=!Z5{`~!Le4WSfMvC}f5=m&2V&y|Pu9`?KDny^Z#LAzjZITbD(Tx?J!pF? zIM|lxR@2YJJ$%=Z3v4lBS&7d1W7f3XE@*0RX3HtBW$oRD;NFe*QQ&W1TatTNYZS`3 z`OP{k!|-wWdv{+C4jF;8vvJd$C$NBe>pkZU_NVy(V}lE1W?;kjtm?8BAL8M~E3A%p zcVR7e#r>uH@TaSPRK{dGe3?A4QvG%XS2BYK#kW7$HbJ{~w}tB`klNEq(ShYhK^~8Z zkC)TbY^EvP-9J7mR4f7jP@YWs#@>e0hS;o-j3ZuKTN{Emv84yV&KMf!0eO=xOPbMl z!BVhDF?;S(B?&;q{?4x=LPIGT*%5*KgmP*pA|~Q07Efx!$7c>ar1cRFfTGXY9jKok zi7o4+S<)FmY`3n*U4F8T1eh(UGefYO3_w@~1OfT2Ys}_H*5b;9qyMYh=|yD zg#Ey_L;qFIbkW+*O2@~D2;g9#w&E4b-2vxRq2?>@4RBCwZEj}r0wKD0ZjK;c>dW@# zJF~~=(Ley%0UTj?I2!;;HOdlzc!6g^P6})i8OaP8byHe^z7!D?`<;*=bp9FA*PAj1 z05YHmkO25WV2U9qrvXHy*mR6ShqgX&v!(-8>I(#f+rgnL zOqqg}Z;6_HRNZ~qbI_C1Q}WO6;d~;Dh3fpm9S>{j>hx+C`bP&lbaTmRKmQJ|nVwqQ zzKLP)O6HHj?OQ(UBoEd{ICBf=xOr_}flSZpYUcQFYyhg!flJ?2Iyu!`mbHud z10(*bE)Vcq_`{jf!on0051FNfMP+@fy21eY0NCK!&IH7)YuWwk<)=VF@TaSb=chhk z1R$OZA8r2FI!at$MzbR)f)NCuYiskss#mM@Z&a2W&WHfRIyaLFt8ru=FGJnb^qzip zT^G)L(sh4TzwAm1lyz01^mWICkX<###IV)Y69VgIBPw~mD>!p9vc<*4o9n5|E<_F= zuLlO}yFsZ0re+-f&JO;STddXlUVoEIN&sU6)Wxd~z()*rj=cOa9ry@KW~77-aL>0# zdguCrt{(L!qdo#D3xMe#33RvJkSf;WTx28P;77;C1G$7TKdZs8+h%^|3ad)dWAcZf zPP~-MYH%Vz9Ckx|gkutY!mrhjJE;Z-KL$sI9TIC#8&f=~uYX5V$oW7K5*mInh?ZG; z6TY3GdUh5Sox<{_Y?cflYjnJS?zGYXQ2(eE3Gh-FdLv|cSqK;wfTaL-OAmlvK5f3ZE9>^AACGMvI3(UZuO zSCk*`9~6n+zvFR5`kwovzcl`^c(%g$Z?QkzitGhmX#G2 z@~br21=KWpE?)~vYzS3!$gI3PTD-)`P|BsPGGAd>tOL#3flE z+T`B60y#xMFS!`Mf5zhQIu=bxh{xhWo>SO5y0OU_}lmKwuwPn}#IiuGzcb4)@{aa8~108rTfqHpJMU7GaeD;t)3p#pwjBO36+YHAV z1{xks!g_e>)coRN40qf_zzS(&+)Ok;?;v&3rvI(_Fuo)@c|ZePAr%UsF9oBi0o3!z z2m^p?u5WLEKrg7|FjPUI3aC&25uS8kpyJ77CinxyEkNeg)j0!DhDt90dqb!Q=`ZP@ zQ#;)yBX#{>^fKRY7B1@-FD_${{}q#htECX*U;lfI{Qs8w?^S#hOrUY>I^?oNbN-gRi7`2@c{ z!lBg%&@^B(077RzZqx&G!1`*zTl)nYzAJ1W&pj0_#<{l;&_xX%zOFaj>(}e^mh1pc zx6t7BQDvq!SHrvFfy+rl+=NCva(ifo;#ovIeYI@A>9p+FRZAl~@w;T~JqNeH%i}rx zvCqX`z|zjb>NRe}-Q2hKo!oQ!vY8Y(#+wPB1=t2fQcB6_0^hLPhEZh86|ei!K8^CN z>BZ|j$hDPF3@E~f>)LFB#yCfQnDWDpedy{PLqhrNIrsaQ0Ii_+&^wax)O{%9gkM*$~+!-nlfplPB%li00)%WASr_$J2M}j!?Sc#~$ zK7WNy5S&iz_gWFtWuxNDD!v9Q!6_^q8Y{)ep8Yi&cE1qCY`K_kKnmP^hpkbHud%d< zB%|AQA?4^!`g9BP(3vtY$Z339X@+w>+B-%#nH=)Ttt?6gIN1ayO(92R%3tM->^2W+ zfYt%mFClOA*uq)5T9KS;tu9!hGbZnSs+lGSnrj+qHD+r`r8!gWu?ZDW>NIT{e}*xo^a0=>ptqOppt5Wn^=B(c;Em(sv9prI zEHqTEXua~L7pag=G^Vz2sWN>)uSrKl_$NN;QY(Qd5l(JKc@eztJa^tb+e%TXARNkf zjra>Yfh*|G(_=~vac0iJW}>aShy1d@9a4-tWHTUtq|1y|srryq3)5ru!E}}?Z}kL^ z+uM$qF=(WE_#UJKa^AU{K7I@?Gz$xE-$kr>efrf3KLxWKr2hbg3oy|Vx%VSBU=tS#l#(ZgG~Eel;L>&Hu-slnM6nW@f89f&H3 z(FYkc;x{NRJblqaizme;1yj18K>J#@-R6*m^8T`k23a~YXlhaV;V5ccjB;FCQ|2Kf z>SQV~x@v>jFVpY7?QT=ut4-uUO$Ct;NVh2oXsBUy;6h3cnju_l#8-%C zSKP;nnjEgHn+4nWe2fC_?a&U{Iz8CbkVyFK z;~E;&;bLgyg}`&?XS!;7>@cIVOX9kdTJVb9hW`0wr*XBx{$bCSz20X>$%udA787YR z1QVTaG(d5IL!hl|k8sW_IKz&rw?Incte)9zfLCOj@ofJ?a@D=wix071@8_O^ri_gz zw_I=tSp&DbQcamw{Fe?tusN|?z2b%+?*XlYqOvY`+2Jh35VoL?zls`htXz2-VUOXX zp{J8K>fv;7LvW(4*K57%syUMVKaRVeOn+Vt5i`j~yv-Y#}XCbA!DgPx2zo8fHP zE0hQ9hS?miPnz&;?DA)xl4u@A z!VqPYEM6d%a_eHGL%h^l-plrFO)XkWqf7PNo2RVFlGD<_#Uc z=YirhS%lqr>t4YzHpjOz@dPVw`FktkCyW+M?EFlY?)?(QkdjAam(e3hKgdlgGS+Z* zkBJ;6E%m+K3>p${ROy|4`AoNP(nXVb!Zc}KNw&qs#koD&R4@EOM~qr(etIu{j+Vqs zk+?OKP;q@GeY2zaRL~4EQC_;v(O6vM`AOs3qc6I-GY6xj{e{otg zNde?8)>ZfW*H=gU{VNYhK%eJ74M1(50J)-n#>95O&rL^LEc=*O$hYcj@Du~tgfU;w zMweh_n<6zNxpo>CyV&y~WLR6|QFCl!YTPACz3Eo;Llq-p$5zFZMumU>fiy3?p2(FD z*AS*2>*eJU*NsCdmyqa}yQEN<>#+ z_>O5sNV^S@zA?k*iN)$=&8~{|J$LmxZ}?0&UO_v$>%Bjm6}NUI#uVccTfbC*Kt3fn z)p=-df1t}xb)IniI)x?ZmsjSbry;JK<|?m+ts>)NHZzIqO=?3rW+~)w`uMx-ML5;8 z9wF(WWVhE(vo>d= zpPZX_RwI>~f-&pmxm^y8##RuPeU7z1HJ;h8c==ow*4eqsH;av}pLn0m0KE)hKHl*) z(?weD124A6Qb#OoS^y~`Xqx0XYF|%YuXV}ykBqL(rh>(bl+XSZ9vL+oe2L3-F*{}t zx%;f{Iwd);gL=p9YrulJHz(9F_z=k-jx4^dnh1#3i- zmB2%dPs#YDICd9>FRXHOXeE6!rPXasUY9& z@6xFK@b+5d@ABlLn7al&gqK%`!3xy1=covXNg}S-h0i$^gWal>i;Ej&7J7Pqepz#i z!9G~LbXWlNeE>1E&3P<+IE6D}jNLLJMfkZ-Oqb}DC{@dOCRW2`LOf82qFOiF_4vA3 zH@i{g8@+LKfu)@u_6_U&5-R$eb9{duwv1aKCiXt;_ zUe54(D?b>bjt!_ zLjfrF{r$)V@}$dke*}F>DKw9c;;EP?&Hq~q{wlIRbK8?$I3&{_2u!Ch?NyD zK$-JAJb=dc{6=@3fnxsy3sbh^W#;_TBnOX=O6uwddKYG?S|)s9R)7NRh;2Hho8dF{ z%asdNTCO312pL}Gix_GPX|6M-)wRLVxSp}0&xr5QatAm22nfka{7t%=TGo+QIGBc? zVjzuZNW;7r&aHH=cYA0|$NZEoYbun}!dF_35k)pthoRzjjrh`ENYF+a!@KEo$6;%0 zhBG+p(Dfq_3wt~CO?waR-O>>Pr4F4iBQt~Q{%Di9U(yYeVssB{aP3>Mk!kRkyLl?b zJ4~OmkuH8NzhfcSM2--{C1$rV+KcJYs=lY!(Y?e6NXeEf7{~Xfzo_pXZ(AFd83B^u z`@_JlZiORP`fw(9>iGB%WvMrSsA#!Zl@9TMA&f7W5jqnKAI=p`^$u>?pU!eWZ8g17 zJO7ItH4cG{{F2p7j`92u3%ztNSND9YQHCEo(7oQ`iAg#dOZ4xamjXBue{YSPno>Vd z`%@eZt>+^_JGTKt;I}D!0}j}Dg%5`HTnMqVh1y4;Zj%t%?qS=pD%je^k4apK8ZqoJ z+oM{KN&QyXf`nqmSCzb{d-uxO0V|)Z-SI=xo;fwo`G@HgxU^Xv9H!Pc?OByxKFxZ^ zG&0(cp9{9>n}9CvT?$~&0~^$Ix&7BO78=s)n^*s7qkt?}S@fKVBdh%9!_)IhuMt&< zpMDO?OHaPhCAH`NIWZ6*lP)Rmh2k6w-@Yb6t!syM*yGW8SWvz3xgf!u#pZ#0%i<{% zG9TijPC~DXQTB?Pr&H5)w#N&?4ZK0JodG|!464zHbd|UH0!#NVIqF)Rn()E27TWUA z|D3b?R{HZ7HN7L#4tcVlnT(#(W&UsxNOP~F9c~&T*fdu5wx?KVhCrBn4Z}1>a`fod z=x>66de>SD{6$pAzBg&nvFn3=>!S_JplRY}C%{LNdBZgCSHpaw69oP#ykd791v9cL z>gv3^vp&C9;4i)$^}Z0*Kyy}XHCjV>1WKdqh~Q@r7B542zm+16ESnm(w3TPP#J#&Q zwO7oT8}@litg)MgXuK(T_8>HFiL zS1u*W^2&2oh&Wnc-zf?gFV(NMIUOj^DK`_2?fyoPVeY0BVnoqgHua$dO9^d(dS<5t zH9O^s*&n*j`7&&NAU{`d<8ceLGi^!Ssf8=I>6gY=SyjQ zk1_xZ;K>DNpb&YzG~@90&}x_bN+{f;7rJr>N%HSx!oe=4g36!|CF)3ilYD!4ND8pY zwj(pr0L2jfGO=dcM0gMoHBpdmvq$XV7+b!n1JXx5dhGgzeD1yVTh5JUJQdDb{Fpv+ zo7j6S^#9DeZ8&deH&K3gxFop!nwqUM8c6@{L{fCR=cv5}gJ^tKc|(QI_5s*5>9W%` z6SjBvGB_LP3Q{=#JQeuwfA^m=z6U{!ruEq+|9ulW7)2W3-SkZ-h5q}xFG1myH93#d zH1Gz|zxUihGW#zx_kSe4Hl&ZkJ(E@p4`Si~s?2VM$o!>H(Q3e7a`Inen;Z8oiwpsZ z;{dPqbrnN3QSyPB5(|a==KKGz9`*I)-_aR^SZ#M@Xjk2U?0Y?`6ovZ^pT1FfQs$qj z2HR!78;chg6SKWkQTv^QjU@o;>;M|h=Ifuvzw`D(%e8we{qzSv($jR?d7W1VU2jT* zfo7LqX~xw{oH2<}6Q(KSZ+A82d4xc|Wnm(UAEh?RejQ1YQ7-`ydqjt#RjQ2?YaV3-$z~c~PVBcr_U2xpOD4 zq^ZUfLLs-re#Ddk(J@|XJ7uOQ&`K>x;c2S3(#%Ub4F8j;g#~ekFDMI8egNj`tx`;E#nRyc zzhi)GYCXn63af)VVY#MFnUnZ+XiBru?WK#t4_;aeD{X@=Tds zKLLN@z!h)iw&V2J+MT8~MhY!`+=J#q=cTg9tJflU%{t&Y@5`Oq++bvh*Vt&SuW;NY zg?zE!2e7?wg&A@z92`dl1X97jc#++bxwG!pKb)M*YBG8>$_*N>=yV_QzTP7^J3Di` zi@5QGZH^fl8nUq2!tI~ghew2)P8GaC4fH#&JhfbIc@r;%q3o1Q!l{oulENmIuj+7Z zN+^ekNl68=rDSWFWjUPBCgp8%>Ren*NlVkZI^gaoDrALAN=`Z3hBBS{=z8~cpBk9% zu8)F0s>LR`eyjJgw$3ltxXsMoN#XrL=z2?gQi2vrZcmDA}FXS|1dU}N}XjGH>F3x z;1=r+kr0a_3^ftPLPbSeXmj8&$u)4ivjm1c-icsm=lp?*Kl67hQZSE`hWGb?1}sO@ zRZLwno3_Uz@zyQgW*3U~_nB?29%ry$BTl!`bLO?B_f`zxR+gwPabY?-y7(8~{TRuw zUz#p7nf^$xf6L{dHsdv%13w3rHqE!~@d9NB5gQp9xwfy-++}#l;m@5eh34iEW zN16z`G`Z|a>{jCbg#>zPCZ!r!TYKxK-D#sCqoIWX9T)|&(1e40ek z+8>V9r-1l)swi2)FpYfu)t_BoChJXC!UYj-&+amb`}>FUq(PWGoK85pUN8#!_>^^F z#Pyw>u3xfC{X=7Y3j@(D_nwcikryj>bHt_hhcII2w8Z&DbiAk3epHjcXvoPk}4%2-5t{1NOyOqfOL1fljr;VV%+`2J9Sq!-fMP*V#MZ)|c}SJJG?JbU0r$n+EDi=@1~=&@;R1g{CYnrqpQq@;yt)#G&` zA+cX2+0=eS{*~44W_8zSNNWwFCyztVL|L(C4@Pl~$(;c(eqtR-87=60zL(7$qdWfB%j;UKP)GHIZ=c&+_u6c83=3>P!hU{8>{AWxnPx z;r;uJADVx>a#8a0_qVXhU(p^SP%PV7F+Q-bnP(Fa@Gjml`yP^v^pFs17Y)yl1+$`@ zqrW(aEG>-+Yzsevqg>=VQu&iXNrUN@l%zSp{L)~!Azqd~s^EI=BXkq6mAi1NW@2Ij zt=?B=J*{WY=(4Tjsi>&nvhFoCB!vFnDN8avtu0zQ20|<1hzPf_H!yxDHflV0@JQ7* zx@!Ep-6&OPW_GrA_qJ<)skMkM-!Uc$S8?Omn0(pHWG60H6^ijprH6Y1f3UO^C!viW zTaMC5WnFG8*XPv_&vwziJ$U#Kw_19vfB$v^0sZ{)8o%#yw`tYY1KI1H<>h6ImoLBjbS%$|TtZFxnd zIYjlu#Maf(^ildv_6zyjv9C}*AdWIiGfRVCDuQRE)sr*U%g;vzHDs; zNa-NDGKz{Mjz3d!pm>n^=6{G1S3*S$%)8rr#7J=$(#N(ceuTW9)8vl!e}~KD>ohQW zyCcMl(!>z*OH6)8=k>zaV?^fS5Wx;l*K(c@t(Yrl7@*+ zrjnV4sd%(3eR;&st{EgBp%2v`76o{Zv$Gd)8Pzp3zI?KdQ;s1q7#Iu8VD8@-cZF4? z{HoNFl^mS$e^Im z)MKlJY*DYwZ)gZugk$OnERX+W<%SuSoOz4wgOiCEiz}^+j*~KUgg$zm-q%;6dXqaI zV&z$g^a~~?kTDD<*-HnI@MVTCugMCE=}`V9h#dQLeKNILIU7L2Wy@?oV5b^)&Yd`a z&(oW%O5-(j7kWldtJOIYi-|`3`*iGNGK=rVMx8ZmShFviDN{);B+05i(K;z@mZqYm zrKPE<`6pcTtHbj8qL)DOd_%K{L+AP7X7g@H&;vZYqU$-083$+Hu&_tgal{)=#@t^# zP=NnibLMVOHvYRedo$0JRbnFdr+ml$TmN=uy%klLN6kX#o;>{a9e~;&s!DSR#_DkTS2Xd*>KLCt&&)ozI4o~k%fZ&?qSWk?9eRKP6#}O&az(>K7Jj$8bqVJ_X(_ryTZ3!u; zY&Dpf>I!IR+*6Ii`bEU_8S$&X$nVZUq&tpE0|U&5r6olsZeCuTg8YpT*a*YzcBSrb zndUZ856!H(a7|7fBhLRJy2u#R`}WE?jQk4{KD)#1>vIQ0$jIC;_#ZK<6D4=*>t-vdSFCAsH=|PIc*6rN zyHCFS(rc{_D|C1nVRS5Q(arYfTAixfH#`^$(uO((X$BSHmiGRj!SrOK+bW|d^5KE@ z$?Gm$g@u+USFP~|6Djv<9ITQ>RD3&F-&Z@GuXpN*^4cTn6 zghmmO?u%Msa(TEPBDE6@A(A)Mz_$d^`4`nPYG8OPZT>bj#JeEQ86R+>qoc2m*APwG z+#cRMe@;sTnO#?R*R$GI-288}u!)^&^xvPx+TVzjKw35Z>3U*-_P*Ix7iA}Z(`?XU zhq_Yzh4G|Pf@B~3Tyo{ioM~Xd>f(VkQG%FJnOMDyXr}D+1U4OxPqS`BgoO9w%}t_i zPiL?3ubt%N!(c>4M&|nJ2^+q0ap8psA|)^H85wCX>};tKWE%bbJ9>wV92F%CJ9BbE z!UwZDFR%B9vNp1^VGv^emW&Y)60VW1szt+M7$~z1q&=Py{)44gTNi6W`qgd65O&Sg zA#wzeZR_ej8ex;wFPT_Bs;W^G5O^dWa74_hD5<5Qs>&NWAv`su%!y}NyWFBk4~~J# z^P}CP1?{Eh(@&XTrB9XYS8^wh4Zo2z=`{VM>hg)8oP+D0k_@Zt!0XKF`3jH-EzWPH zjn<5GcYl(@w(a;9lCD3K{d{>@_o-^NOtNxJ46*ehG1gCEViFP#m%Smeyz_45JmnHa zdPq7f8K}bk4yFz8CWyuAT1^-0+_8*vEfw(n%a_AfGIHES7sYA<_PfO52dEbDOsveQ z#WJo7;if8F8oGuZ)fK(#JR571>3Xq94Z&;9QIR6A?dqmq$RR7)vf*cEQJ{=6^r_iw z&blS*QNLvL9y!GicYTX#Xpic2YVi5}d#~KqkKIqv?VE##b|)9+=VcFh#;U5WKHIYQ z2!OG&H@BuYGka*wIZ$DZx{M)`F|n~Vw6^*#wo*K&r(GP%WX43>kg&JsL`FvD;NrSR z7XQIOfq=8Zp2ckBXUbC6*3Z$aA1f;>i_6PkZTvkp_LbZNMcI~S)zv}u^b{EkL5gL@ zJr(;FkR%ROZoq^w6pww?n1Fcs?Ag>;;nXC-GKNYf%MwnzlV`Xs0Si)6FT)uq7dJPB zeB4U2m20*FM!Z6T(*GVQQ$w=G@$i#nSXbP1)sNWNx2C3~H4ZjNkFy*GB8gOvf5kr@ zPAmOvGG0vp0e)#|NmIwf%fI9yb)n^&6)Ccp7le+tbH826R9x3+xEF4#ys}nb%C9HJ z#!8n;t{)!ufvC;v!KTtH|#HDvOJj2KD10t)Ch>o4ZEtvE;}&$JJ^-4 zUv6&x5fV7`UvCx>DmI!_G^>dZWCu}nR~H>778dx0PfpLw=@vX0{PXhIeXz+w(IGC6 z+`@eORyl^4(-KyWT=&4%+J5k8Sh>L}&Wvd?GzTq=VLyM4*!7ueXjt@i zwDtD-KyIosdJS^{vY54lxca08O;ItiKEpgrtgKB9e|`(fxvFtC9Oc*YA3wecq4HlH zPo`~YX?gJQkpfBOO~h9?14Pz*h7_d8O(Z2EH6{^ zju{|*^~uWi6A@}B_RSy+EVbygxpn7AYv80GpNMFkY7=3s))KGL2W8J8x?%$rJ-7dl znV{qgEy2J!e>v56sj|3*$8Ix^C%NoZ-@k9(Kpz)@LBb?@^)Z;gq zJmv^-^JFKa7jf)iwa?8~$!GHbB%#0SXW}wLs0(!_#aRfkpvFj;Cg>RLX=!<& z&dh9Ma|8ZFkj7(ZS7~8+P1OE9a(J-Rfg%EK2gCg4=C`5{3dlK9($WUAg($?|$EGGF z-7?$uR-VpVm->vZs*1IHWcWeR0p-!7M|S12vAZ7LC@2w;kx4Q%1%<`GixTgQjL3R= zk<|rXW8fJK7IMNTYwPN2sq4GJeG9c`vJzSq7Fj;0p-EGT4tv+ylq8$URQ95=@3&j= zfvC#sjkN_)U0t@Qj*e(k%d%&LXJ@lg6e%^ySMQ%Obc9O`Iva0o5D@bcik}oL9!3QM zo?&iou6~-uTB##f$NqwXLYg7$Zj!2k{KU}Twp&lr; z#<20(sMA_WJ=Q$y5blsMEG#VgCQ+V%F_n9}is9tUPD8^~;Qf2#ic{nmKW=}4nLw z`smmu&%+4rXukckHb0B9(QE(e0R zni{?ECw6wQF|JOgQ)3xt_shrzM@6-K|75goVv|qhe;L8y!lIxso~>{^ilz1iAa|T# z3c<$J=_0O1@7skgi(#(Sb*<^5n!{@)P-zLxgP^uN{XcO37pr4jDId@B;a3b>5(7Fi z|8K1Sf3&j}{;u4aq6!8DKa)TYc_+@#A2hPN&w~GHh{J#Dodw>S?+`ip?6-wCJAq25 zd9l_vm-|8Vm^=j=jhqzof9Qe#TSu9ux4k>!8&CPz_r2F+iAez1s?>^%V?VZs2c}T! z^bq~Q*!cKMiw1da?kRhNE25vFp}Pwhy|C%Gwq9S}@)u|vW1@)UaH0DpoA+n?FdE@x zbTSVYFZ}mf$-33KYR%{8@h(SvPbA)d`ZL`g#CW|e4Q&UyMohRe`t)}Wcd1xe{mV~o zr%5>8a&+XXJ=r6w;da?QrQX2C)|fnc3_Vy+t=pe0*PT(}F;e~=$X2|-~FTE*p0bAMDvZzy@BP_WH!{ zEe*Av94z8wWDl7`xxvS%>LA!l&7sZM(<6ScapHm5 zz8TpCmvY7$g7cCSw$KdB*ivPV82Bx1+%K3_M^nHs$a6hK^O3EmU=8;YtOcbN}hBJgW zWZr>o7XlEHq_UJdSW@`!@qcwpNJ>&hhyFjgc+~`iLa$HqY3S%Qry@RzMsbi*P`s6r z8a$bmn+=YzdxM@%icdiBWufExpSDS8C^zfmB(8e!P2z3O<8KlB1=W{Z=TiUqGH_*q zmjCWj^gle+|IFRpz7VGWl7m|W0_enS)G`Q(+@q^%Pj~kQhwi{H{yB@TraDNL7_>EY zpL8hMr&}5tVitn$SDY<;(SV==&PD`6G0H!G&X{K-qZFph&nul6OuaHQ(ekQUd@NUb zq@@%c8jBgZuj!sW=A`_@kOGnWS*UQ-IeV(nO2EPDh!=>Jz zlvcQO|&yoTOrBV=?08`EJ9; zirw~QAP0fHFhktkg}B=u3_U$hsngwVO-)bPoi>j<9d6}ve5_mrNIThpC2aYBMV5= z=@4RwN%UuH>0MlAfDgJ-tos{Kh8h(Wv2$=>0E=+m$BR$Pz@UB#FHUa)S6ZQ5zd%(H zaQl`3(&w`#{9hf=Q0gvhZffgrwHTG{n_0p?b?5Wvyr~~Q!^2@{gmq<)LZgYLrDvSi zAJ(eme?9OMMX2WHK_wm|W0%7N`<73DXQAHgo0?0SP~kWyr~5!`T$CDW*u+5(zj?KwQ6=2VOX>oyn6XA-s%mRq9sGoBZWH_Lc z;u5tk2`xsvFnyqx+-q?rdO*VC5-HqFn^%)rW;}Tmi%Hz4W)=xJa$fD;eLjYZNV%2X z5DaS1^7ZAOxJ*3EM-M+8o}H~tl3Bf(k5OPgIoM~sSw>SakhR=E&-(JWqf3ojhlXyK zR8|XAG9`O!Xc{+U4X;~i*$|U#5b#>vo%C>j{_NR1=szPXD_WUv5C?uDV&St5G_a}PXS=d_cSV*OP#>l9*^p#wcnEksBt!yXq{e^q1P_%7q z8iOx@$n~lQEmSyFDg1}sm!+RFQ`5=>Y}$8`&JJrA5j9MVvvbBq zL|>K}GWaPRX|955ahy5)r-}M$q56DprTX23d}vl%cOC@fCs?xADa~M0`H10_baXw- zIB}<#l9tOShs$O-?llI|`EfmDa(wiv0`~S^rlG*5{2IBa2TEePFnfczurP1xMXY~7 zee?L=%2swZwxqYOxo*&zb?j23V^sjEt%jdUH4g|sYf8>=eyxO1x;>_{?(eUdqkDs< z5xx9sW1=*Bcri9H@lt;dq4x6X&U7K#VvD5e$NJfI_6}rR{we18>+R_ET-s;Pvctpb z1$iGkfh=LH$d(TrMdh2$qWF9$cN`sEE({8WK3hm|a=!ZUGv@R3p%~%${A@NFt*ert zkkDUNcI`h7^^ae_#j$lb-tZ0yp+JFTH45MI`QNkiva+H^7#@Q_iG@AwFW=YN#ybY2 zfFCDia&|mU5z^u#CLzwc+8RW{lhflr+QtZgoK<>b7hDJfSW|DZr|_Prk2+AlDo3Nt)!Ne z7B2iXkVYMMbYoq=N=r&|zjAg2knZx#ClC87EJyyWhDOj#Wzxcv3SNG0Lp33Ed|0WF zsUe_XuXc{F?w6z;n%g2hre;6RMe*3aK397e@2fGs7h3s;!W*l3dfGpVsI&RZGsGv&CP}SCTG#t{69i`KLxMg^RlToi>*;B3o!qZnKPKU5 z+Qkj(iaezAfQo8xWSx)B!q)bErc5EAr7A}8IVMOoEQ&d@c(-o>6_M1h57nJ{W0){` zQ?dr|dUg(M+G|?42xIvMMCUl9xj{W$U49yGQ4sHvS}ZUidxSad#M^Q@FJsoxoqjT# zmf*W~AE#li(TR6C;Oz{{`#B2j61PnIbo9TLh0FPmzst$Vfe_7EUde$Q|3jY7-cb^x z1R|7QmuQ=3QxnF?iQQnPmZQq+v8g%&32t5jGe!w?-|wi{Go9P67pc(;XTH6B8n))B zlcjh1;f>xnMEq@W|4daV3m0(jgW-k|GVT}VulXR~A%UEk%t%g3N~$4bQ17Ml1TO42 zyUpRV0M7ReG-KGqJ`%~hX+g+#@R))kB(yGvlI|jcVK$b_dg)s$S>sGk!2XJsLY)N$ z_!TwJj059e{FfG>sAwtV$=Zf|6B>Z=zkgpjbKE2F`c}XM)D=`1s{=p7$7Ca z>^RWkZbg^3kx|5jlAb5__m@liU9XkM(+g!`5fKX;8_g>b#{8|ox^dgN$GkH$@F8z` z$rr+Ov~>%dh80n;Rz(6$RiN3*#<;B{O#Dyrew_RHNN$bn_=(4QUps?P+9`BTv z5Eb|}9Q-q;!Mj_@V6rllp&Q!XMY3pM=5G6zKn#pPGF&#bKGa8y@ z&*CVI-L{VIZmq)!KI`kc326!Omf`V8n@vS&Ma2#%vZ&6KyGVN9c0QutIofNQ>!;wX9P9EQlgw{$e13uQ>cq%-xI$ZdVR7^QTms_W^LwvE zTvR@3DJUoqY*(lAl~S@XBnlv)?py|*g%Epf@VsuD$)euXOX{_N`|>x*6}KG!79!_f zHC62dIjE>vjexXJ-xiNU9@JLc6FtpMBb81EUp1CiR&WXIqZX+p3IGI|{$;+E^42Ht zg~L>e(!}z&^te#i^fST}?q(dT@5CW{j-puD@^7p1toGN?dV6~VVO`{~`3jpfi!g6) zYgs^9`GS?bcQ+y;Vs2xpDK#a9@Lc-Wu*3BG@4mjk?Y00p;x8b*;-tdks0Hw-VF{sS zQPwWHX>Km-o;5A*;RradXJ2?3M-af`b919^K;m`+HdwxH3vG+OW(wSRbzK@6HYCOwyNevl( zWjqU)fbOYZeJ1i~WktxL^!@Z^{@VF;+Bt;mkB8z9N=nLUCw@dl3FJ-*y|(<$5u1az;;ojH%LUtI6luKD@B- zCBP!{VaGwiQ7!DVmu*Asxb}PBo;S5p=UY#TxA+rKvVOdIuAqABeSQNF4X~&k1(-Ux zuB>!8I$nKah~?VrIxr}EsQ$gGbztBY#DN6E&k06%&L_rR&6qo$-kgGw6Jl`)7qIm9 z7GSSt?Cue*NWFZX`e8l1tV}M4vE#qa_ox!P)!^6$pc-|Wcv?_ABXF>*Lj^o<@8B%_ z{_<9e10EKs{V4C@Be>Ra9W_>}{C4ciP;?v|+Zl(&Pf!E5_w;BiF6V5ZPSAVZ*f~E) zg5vM^%2Dq7+zf=%g~8t1AMXFwWK($mttjOGpZ2T^AD^fQ+-SosW`D>@z*om|FROad zqxf%E*ZKsQ{zo`>8cT79R}3=de~ zo67Kz^nozOyouppHfIrQ`gm-gqJXS77W1b4_T0z<$>@gH&>7 zfwN+1`Oi8%Gb`(#SoY=p@$1_80yM21A`*v$A=V z)YN!x3Dfn}udXSdazUH%(V~M%Tl*{Zm_rRr&~Uo$z-u^(+)Wx zqMEw8P{X0u<(>QPXx$Ta)TE*C#vupc$aN0GYpAe!ueSxEgx=qlqpZBIjD0JAYRNN1VjrD-{55`4w zK!OaU+0^G+#A%DV%PYZG#W)GhueoHhUY2g6F6irX6zTGM1eW0e+jUXtMA<6wZtci9 zdEdf3f8}p_TuOzjG;G!FZC&bmeWs-*IKdK&&f=+3xFoo5UstgK5i>%Mqdy9Hi0$0w zuq31N$B#^twpJV=6f9MkwXy~ z@OfE&2-Nas&z6T)S3AYT#)8hNX=vym%dNvRoz&HDP%nwoZuJ=gsPQ_l-U`as8qx!E zP+nCrgo?swX=|CPgW(FLi-%OAIzYbMOgc~a7!=W8cP?K6q0|{=y$(Z`1dKcPVUsq9 z@^CV;kftET54M|s;v1e@oip+&RjPh5gxY*T`@y6w3ak>KRlS=q!pBI!GW+r&L~8Y> z{Cc{xKclpNn6>YMy+rG>CC6%e;v1TlU~p_m=b4xi1Y+HTwnR)4ZZ|c#?9Ba}8A8Rv z;&-pn=e{!o3MA@%zhB$j@%c~>FN7+ph&%B=!FY6)eQaL!|E#HPO{5~@cq#|-%orhH z9+=(*3CR1vEfq5ZH30zu7MQ}3Mg5*+T;4Ebc|ET8^z^9RZRDm|$_%E3M=SeNMbfj# zyz-9+&0(Qg zSXk)7Oe+iB{>5`WRRpp)&!wLavU74EuOyClIw4J?qFP#Bo}b@p@n!640l(5*+RFZv zpWe-W21*fPEUd<+vD?hd%%@Lz5q=6&f(+GQGL2GLXZReahMNd_zI-rN=J&UK($Y+Q zH{Se9aIh4Evgi{^RxCX|K?G2p-pK8kD17?U88B<18qP z(!m^k7xzkKkvol-?F-OyrCVdjZv2P7y zeYR_I&R1ldG2M##nTXMDkRs$zVIV%pS-9On>m)2J4E&x{IQ29ejpL#Ec5RlaBK+{XWg;qj zV?${|PX2_cA@F^|uptQWem69@gY;`K#e(99jHBr*%y*uaGiiMg#lA{QMOP zjgiS}t{E0v0(5(8FZD~x!nUC)mrCW{-e*;pLoAqXCl_^O^XrRZ#>(8=t|!l7kzN$) zBZAh0Mtb*g8G(1@7Z+!srjXDuFu1|55w>gh(`H;qNDkxI;(2j%@E)rM0!-fD zzrta+iaK3ot+BQw1c=IN*uJv@j8JnkB?4sj(1lw}W{3d#CcJ$;xhQBE&D4^n`JS1D${!E+tX!DQ^m4GlPE~tI( z&E<*FrSA0Js^!Y*MdvoE{-igQ&8t&PZUALUtEztNv^d~;0igbCa5vZ=I-sJ@G)6M7 z91Mhpg{s((eU9Cl8tv%l$z}51`TW|>Bzy;Gx5w1f;msm)lFG{Nd4YI?r19C|X{C!Z z&+zj)Au^lx0A!D+W*2vwS6dGf3Iu3B7!k;87szR;M#V$%7F`JHT-9hkyj1@7z>;d) zzLu7#6+Pa!_V)HQ#rJ1Q-14(Un`fNwSiK>C?eYfE@rblMm5B+u#8||TN^H$41$Cemcv$V?mN7=Jl5_o6RtOjb6yI)=AdtaJ=l63q~-yh-j+{Zeji=w zZEo%KjTkGBdXpMNZc~cY*53WAw%-z(f39{sp-HMTW36Ik0fkI7lfYEl~w~pWlrgtGBm;>oxp2hyT!)R^W?29+gGhEDtp@D zQ$D3iLLiN1L8PUng?-)5sY45ZyrBvV;7X^kFdi{bQL;V+oNT&t6_CsbzHMY>l`LH{ zmHeHRGc?)lBgBplncF@?o73*NErA*z=3Y8)cm>%VJpBAEze!5gso1S(wJuH1`u<@Zmwzo2lBbxIvg}v*8(o{Uy0L7=gbB z8$INfyVI(x-KEoeKj)w6tU)&5N5UF2$8+A^lS^1tsxc^glXj z(qs_hgT6Ep{1D5!%fOB7!BAHo!q%dxt^Xm9RE6MW2A_@&4RAM4xEGpKs;Cs{FLp-- zys-#AvoNs+f6GAA7u|`8WWu^#^t2&`MLRNXgX5w0{T^w#gO#r4Y|2e{oEgW>|9&5 zsMyH8Ib=^;_xL=V>&qo1AQG8%y8&B!XBY#((-&-1pPPbISmQsP#JGWx`){D^b0@ur z?W@NuPJI}~78HDGqH*si_|#zKt+Shk{l`)YK#3a7vu8`!wHI5p?Y&53ccUUA`ljlh zgAmbptUQwMdggJ-e|(FO&Cex*-Lon7=?%oPFcZR%d;<#ER(57ceg7|M2dUV9V=Fg~ z&aa&h(BJ1={p0$4yS4hdKfS3brf%yh(A&EJ{5GOuqWUva z@qY(N(}7jtaXc0=`Ja!72XrE@?v$}chs$Ow$@QAop)*VI^`2~k zuITGC>ti7I1r!xuA;8`@P##3Ki8QfxtAR?4klA@+(azBxjCI|Wd{>&+U)~~Et&PRa zH+tVK)FXqSSKl(>ed2lBMezVbsQvkki;_x=xD`~W;1HOfOQfg_>+Uo*A$qYG`M20~ z_*STJ_tqRw_UR=Kqy+`}FZBK{cy-0F0-Wmb1w2>#^{w$1%UueY-T#>iUzPSG{m7v= zClxjIcG_QnCETm3h-OsdtY>UNcm)}#MNx7x(zVM9miybIy^EM|`NK)YWp2I@xY+st zyXlhPv8l?*g>Rnyp?}%OU!9Shiw4tYwayMq#%=0Abu#TQ*Y%{PJiT@2ucEW`}VtkMo*UNt_1@je6fCxP>mW@bBt^hHHIL=Xa4+fSiIgcq!= z^Zs&bP4zR_Zp+L7ytQ5<;ddj@czwxoltKnVEn@o zj7tdUhRw_Z1d7j*z&LxoGbmOjCL{#H;)SK94+~zt>;XSRg%w$j(}6;`sgw{d&kxDZ zlri5_xqr#pN(HkKXiJG!vZ@jZ2?z@G0Y`Y5rAW>%r&3Wt#F9YvrpgBQ5h)@R zf0L^d6(Oe1zROo2INooWyoPRbKSDw}0X(@;b-CuvrikD@auID|KYPKI$xO8-Mb}QYZsBjn|$dyc^R5PpXJ@jEo ztxlxkLV*tilgpX?bHQI`ZBR20BvtT<;4u!Rva_<1FPsR~ME~ssIvT{KR8%csaZKpf zH@C6Tg`n@yT5Z02UshJOQY#_?zvv_#x$+Ri576GY#^eb_a>@~}r+B=-ZflP^=%06w zj z_A*qMCgg5lhTKZsJ3~XlBDDw~{=}v6^mHbm)v9-os&4S?kMW4})2Jx3=cCavzMQ># zp}*FP{lmklA;TIPTIZw0BC)Vu>8t^{YIoOtXkP zUf{sKj9&ka?yu^;u|a%wICJN$Y%%m~@@IHwrz4pFxGtdrN01sEFj(CZAEffPLQDja z0fi4vT2LMi$Vfa%xazll)X2z=;xJ0!fZn#Xdl(spGm#<@$hEr|7?$2xq(IwJgUUZ8 zRWDy-kWFgP(B%OGnf{cM0qPkG#1buIZ4pq}z@iklu%-nW9A9Uc z$s5r1#z4MTV0%r@e?+Pd7LsE98B9=Ff)f^PqQ*!1Bful%Zb6NApyoaS^cyI--T8Di z1aLye-Uv7#xm9&Rtam)Jc)4fg@3g$M{MVUOSXiXJt7C)<2Z5a(uO*P=8@LE7D(nIJ z6ScDTb=lVy`#X_J!DZ|9!let<*w{F0KT${hy7qRliGNTK`HJSkSh)@ta5qpjd81$_ z=!m#>iHfy%cTxkHs6xt0h(&U10t^>8KraZ13;h8bW_u-#S?sIZpfd^2+S;n9@Pq?^ zmNJ<~FMC#J%h=%+b#3h?@Fr&r-QPjC;DLnfqSS$&b9grOO_hhe^_7U!3lJv0K=uSe zxB7T1I)>9SAhj+xV~`Do9c@tnOq}vdI0U!JFQK6|~0F=Up*25kig)bjM%rD^5 zCQH?!0j}xyR}Bw^gU&qb4yYX{#iCgj!gX%W8t@}#i)f|tTZaEx8Qi395S-{#D}x&v zo~Sqn0@O2A&8=8wSYO^x@s*QIMBnbVu5KEO$$&f~4j4{eT(&Y1NQb30Og7X!(HE_A;+Sxa&@?n2}ecb%pI|V$?A^`n?+oSMC z{=dq52FVlX{V$y4tF@7JXdap}Fo3CUEkF-sLB5Z=Z{Sfdq6=V=HLTuyt59v_#ehn3 zpTq4ix)j8VFL_ntAT_@ADKg4(MayW3FF}Q<()w>xB_I2bs4)0@z)V*~KxmG;L1gk@ zT7W(Bhe?mX(+BwSPmqqoo(F>MLN1PX=x~O7?&6ndnU;=@@8H*uo|@u@X1PEQ25!ZJ zFNh%)2w{-b0>R&3AuTxLcucQYs^8;I=8|Rk;`p4*Ra4uz$=MFVak zhq>itVSqb#_YX5Iub^!>E|{GWHzzdB%v#;9oDD{bznNZUW()%Qwj3I+mLe3=0^z;C zRLtm=?b@@F!;fd`G!LQ18Z3Oztg@Z}ASt*5jVCH&;i3Lxb0rj?T(j_jEk8Ikwh=cC-ku)PXYuqF{1F=>A|!+cIQYzfHZ2hP^hzFW9UW9)SOuZ};`*Y$^I;P+ z0?5)qha8f!^k5GI9f5=3pJFdHRR^T&pt`=xr8K!tn*R2+(hbB(cfkQ~kKrW(aO@V~ zTIHLCQ?7F_(7xe8J@C}7*9BrS&|-CKT+P7%qHTp4e99rGm;Y19rvo_O^4ni?K}$1ZAD87macZh>Pu zSw;IcoUY;VrdLfwE;!5u0fCQC4NBEWw!@)5>d+4Ckao-=i7Bhk_94vn4t9MjNAmpq zQHyhPP=F7-ax~S##}qL7aR*ZA@9o-YnPu!cI)4zfNlIfkWm5~2<&1HjG)&GdEZlm8 zfsVYwlUoGe`0F&E@4Bomdp_kQ|Oy#kJolJ)*n7g8Mz2 zn(_7X^Vk@x5Fvzo#?;fzytT(pz~5!A+TaGZhJWk63{{ETj>nWt4jZ@ESKj&*o@_@C z5_OTq=SQF1p1f0&-8jy6SRzk%QJ~M{N~dTXV%pp>JaTPBLwh>AqQ++D7Zo*u5m#64 zl1j$Ww#G`dv$v<+fTWd?!NF=Q|HVBkE2~KNPw|l*Eyv0fBaUB9_}(76Zg-p@99;(o zorv1aT?vf-O6)H}N0t}oN~qT_9_Raqk2Gw*@Nxxb#dm(h?dsh%WbE4pfA1)i=+>CL zHoQ3B?owTKR$3%DFegb?)_fw_J-N(Vw5es zS8-AXqrVMkU&Jw4{1oGgXUeL#3Ml5E+PH9Xw%>{r5{*17w2n9}HQ}-YO_BZCI9^W# z9#m$xryj3^oH&_-GgEYAp15>dRK01sQ8IH43A&Ho2aSD!dSYQ#$JzGMxsi^}!`mol z@t@K_a`*-D3J$39h5p|OE)`+EaB7b69#m#vm@%QU;gpuw$2i)ONLy;cYy{j)54lh{ z)g(nhS^0Zi9pk6rPi!k7ma=WG^(fp!hr>4jrew3u$j&M}YPq$9_n>g+xNfY_M!6J zBwDPeo_C?RwYZe8W5NyyTQOL*xSvt>N#RgQqqVJAIM(j)Z#$I;#wIZW3LX-+N-LHz99uw)$8@(}? z%xwa!%k|%~L|zzIEda1n92dQfqkY;&NvvL(PU#<5(3G#^pw1cQ2fV zPfl1;-=05n??FvqFq6!sfENM$6x6m;s;=QSn4$X`vC4o@Z2C~3Ghb3!MP=t;=XbA! zn1aG0wcA9c3AIYql<>JtkR2@P-7p)gt)Zau94RlE;&Y*R)Z2~Z+dy%BC^K-IKSs=A;>->`x5qdc#p4U5 zh}_;>`S}O2&V+;=e9L8e_0@zc2wW)eAiV?{Te_9LoR#pd^r*GDxj4fl^bk+ilAdD2 z*3sENPol&mnTl5}vrf;-ifZnZed#h4Au#$!UH1{eotO674e}s9ZF?2d2oWoey*G<> zoxr}=T-AQp-s%+zw9cuY?uHVV{_^q1dkUgX+T0E`amRdTe&5ltW_u%h6A+yv4^A2* zx^=&Q7m+VC9)4(Y{_xjG((qcjnA0Px^_QGbNA}olnUFrR__$8Z^6AcmQ*L(o z&QtnY!}!j^7d3aoebasJ*id^LM)^@iqkTf)uIc4_tEaVv0S~^^Pe4HnTs;i$QVaRE zEe#Ze>feV_zx_uM11~R7{r@=9_+LHJ|8C6nui>Hmc8{`>2y9`0u483{ivH2XxWjqQ z<(xt||Ler$+%O+%?lw3oEA?Nz<*wY2HM_RV4SsCP=#5GGK~f#T+S(exd*<_2dl?yh zgoulcr>4G}Xm0J={K=V5p+UiWSNcSlF)=#vaT33VrIe*QqDs~kN*r>OpZ^C)Kt)5% zV`FD$e^qSOnpbyOA2gL*&QbMZx4_3vbAh6oZxPq1GPde|1lP76F)<0OalM^{E2ony zs~M*i9&FMsZoSj01>6YsYdmlWeDm|0n@7U|dU3qi-dC9(KB7rSmxVCp9y~nd`e;!a zq~YP=i|u_zlhS6B@fPU$V^TVNyc3E5=&c0*f+^^EpGfd=2DMA8zS29jwpI)vp}qBZ zGQb~$sdccTVzF71KH}^cEqUUX}4YZimF=}>>Y$Dv46}fz{br;h(wn(gT;z;9& zdwP~9w`-{x>ku-w=ZT$XKcE~`Aqff!mYU28sl<+?VMBZqbvn>^RUF8lK3L?^Nab>R zXbb0y=H@bV#T{Y=@}1IwT?7-f7|S_-$>4Mr2HUS7jrzyzf^r>OJ@jVY`Vu=4j#qvE z;e`jv0W3H##~sk7i%UvArssEOOzQW~kU6v{Qrv8GRdbF6$s+ULzblc~`}}cn2OMzS z(loQ_EJ_~7rWcFJ*Gz|hT$4wM?3@-TMlPKljx|^3-Z))u(osp+e@nKv2UEfE5MGkZ z-dZsp=vJ31@Kl$kkNKXmm2%l)kr{?8r{bxp!#1mWzOAIKr`I|C@2n};m&^9)liRcu z>VT7Gk=0wyx9{GcB6fp_lE2zZiPxnhDfzWovwl=gtS4w{U$8@%@?+3FtH8f4cxo<4 zuV=X&LM-MU8;zPEtoej*NeIuEj*${`FkueQ%*1W$cBhq>*V=yG4c4i?Sa@Jmfpj)q zKViKt^kE9=_ka%VU(#ua9W*a*@$vDgULCtKMT*|&fejB|ogLKr^Ia<%iiQ6uSDG>T z_gn~NGQ|1z*IQDNyZ!0q<>hed&hLyM+r{ne*4B6zm-@%s{4l-W97mXfd^vgW?}^Q_ zu}w4eEx4hWj5bu=-m{jQQxby!?^EJ~o|{H5P$i|MJpc%^v9W=j;^N{$zEm@`n<;RK z6aw$G1E!$h9bIQfL;38Q8uXBM?GPw0-{-3S=g~DC-n*-62zmNzf{F^k=g&A=TFGjC z^At^-&GO0NJUl3G&@p^_BB?BnNte5?kxK$`!0_?p{r{ouEugAwyKZ4H2tff62?+rO z6p;=|1qEpZ>6X|u(jC%DDJV#bl$3NglF}f#>F)0Q*VgBI-}9gIo`0NgjQ{L0o(BZ> z-uJ%m>t5GdbImzdLqqDS0)G65=8^cDgEQUByZz_OHb>k2Y6)lo4X^Xt4LOGHFfcOC z7Y>Z)iR-c==U7Q*1W@4zb-M^zi)4y8lR?Gfx+f*972Kyx zZ3cv;V%uLHnb;+^s#og}#>G+c3vTLwaB8qhmw21_!5x@djRt0|e7!;w3D|fWO9g2t zk(Ro8-Fm=TXvQwa{Bnjt^H(=-4vTBb-@kX|ufqb;s`JfsH;Yawr@(rF z<{X5rPrnpKqwEJN6_AtGhzo z09g(TV(r2*m2B`_U-j}5a6k&uI@z7qT=J}Cm?Et9fw|`7l(SJ>?XWw0&qWA9DT1-v z)Tt!xlM>oz!u=u6vMWmPP6;VUf9|r>P*rMn?!|7JzDL^CmOb+=PDX^7uM9;$jUOvU znJ~H4vYx4yc>)6n1wU-?VFCl>%h_CpVIl9B+d3^8@3<3A@&3}gR6oAUK26GHE}Zbi z<7liIQbmQnKHQZ7Kgd-flK>99v3xeviP|sD`CwdOCpPXzs{8oZC5(fFSNB_fb?9_! zwRRg9S`lDVqb+nLP?+@ppxu6PbG_nF%LxC^lpB8&ErngnV5;ndX{J?`eDlQis^MW? zHaz|A1dUIex4{bSsc*4P-|!J9>t~6}_IS7IdWbUaF=pQ`GeN9TSQ1mYoIHXgHbuI^ z(cwgSif}K-=J0+@40-qRt@DTjgC|d*`kP}uxLR3TvytFc;ykEraK;jHP%rQgZV^pc zXZMi+cV*m9%k4M-P6;fajV`bKZD?U7^e!&-K7IB=!!_ox`s9hU8Pmr}vxP3fUv#%k zsffhoB*>tc%TkmSp3<}mnM;rxVqH6PF3m#VnhaQk20X_?uYq>%ziQ)uXh@Bv^rWAfX2t zCUnReYilW?c0>cL1^hc6F)C&!ZYUEB0o{`L23MKe{m&F&ua*Qqf(p0ZZ1hQ&QT{Yn zlGy$as4Y7uSIE;ts1Pt3=KCwV0&`LW>FKq(#uF_!ddLOt-c4SSm8k6;AdV;8g~0wz zUzy=}Zy>u|MO9HoLX{V;`X?pB=bb$M@!6^mZ=(XMf3>(1mQRT&d5gfWrg&Fz81_4w zSl*M}x%%M177j}6d1vzsU}{FBWD*AbI^Sr1w(x)QQOx++(t`b6t7qm;Vz+m#c71m@ z!FTr%ZszI2h4z1sC6?H&ygXK+f?qt|e^E<|6Fv#gBi=V0*^eJm{@Dy* z{7}hRq?AFZd=IEQben73z>OjXPw4PMV)t_iRg6{Sv(QM}FU|f%nX36`fnQhoMIIA* z%&x-_LjCyV4_B1SbqI}&io<$L>|dcN_9Ej-MsnC=;{S`I*90U_xA5m2@=r1kc`{ zGLj`6cyC*+7VfV($QF^Q#86|k{GpIzZF0AKcuD=^rJr>$$SFO)xqX6jO%HoT)Ylp` z^_bWeo)1F{dB1+$$HLvIHnoL{y?-*3o+#oI@P$P56+X9D_c~v?6&e#I)0-lVg>5dQ z9B^|*hyZ46Tn4fKP@b6|=LZ;k9E$S{)sI9?SNdUre&#mP&+glGllmat)v&kh?&GCM2!^W?SK99GWRlzQaN72m~m?AC|;00x0S5zX35Pnu2|M&lPnISV@_Qb33{*6(>HC0D<~;7)rzR#lKu_>cRQHAh6YZR zx%u*w>+_h8Gr|*|wj}*+9G?5*k`hgkX|s?4Q<13hwe!Tn!eiTA%bp&*9CO_m&Y*@1 z$6<1dM9A1f9JlK4TQFxLlFywQ+5yx>Vz_YEOIsp&K7BR|GlyNH-e%cT&ZvnnM0x_L z5~QZY^1qZO>k<@mwwG!Rh5zgi=;Ch@`QcU9iEBqlFlhz6t8@ zeHNh=Eoz@eoDxBuD6B3o{o#6)+<}s1O0`=2^A%v*zQeVUEN{jtS{=L_ zMDr(Gd5G=k_rl*KCO@B@S=uppxJ(tYU!DB1zt8?t?O)7DOPk#-9*=;ig1W*HF>o6H zdbDDK^!Z2-_ zmemqZs3TfdBlf08OQ+0K(O?`JWOh*Q17xeRGl0?)bgHZ^9^ztLY?*zHYM?X6L8W0x2R*eS^eOo(8O^$CyPF=W7ia19*G_c!Z z_t~!nU%Pa0%!x(b+|>l(uGHl#IUZKJt_VXn}wb*WI6{WR?qPs3^vAb-d~+Z z0?F67(B+_(@6Mf-$$@cVmDX~mB1}RmSAQ`o_b5fCpCsoK%AV2OV%Y;99T@^bgigsn zOEiQCxio!B>unZ@!h8%l89$3Tu1*3IaK(Yp^8T6oLu#4|GcWxG8>dncxYo@-gCUCE z;=66?@8^d(I~#?QqE=z^DBhLL>n3&W40(&$t0B=u0(yG-<$2&4fkgAZX3QQLBnvQI zFcP}r8_N~}{>Z$bD*K&WY^=m`+q;4~+yHFcgXUPMeyijDDc z1Ru^$Rn-y>hPRB2jLo78nkepExu*VX?{bFf}9bIgiY?~2|2Bwg)m`$Uy z&)=|!Sy@{Gn%W;+ywOd64lSgKnHdQFNo7YoeSJ+Wt;~iSgRaLrDLFYGsOH;?hum28 z|E^Z*dQL+8IMQZ~D?fhxsNh|F#%2Cq7jP_Msq9yp4sv}+=Z5RZd_I7OgHl2-L9S;xTN-obsA_4bUR_$vm2{Hla#y5AkBh>iDJT&NptwU(JG_cDGbgWjs zR;hYTgtT9&Gv$g`@H1$?@aU86LFOv4yzc=5=ptVKqKnj-cw}TSW><3sUBqOMJnr=r zoyEq+7EJ&ViLy-x2lhMXgT;BR?^#*Nd3nF+4lX|A;b%8*Rb0Ep=^0OaA|Yi%Y_}#+ zqsNB+p~M+amY*|Hu+n+6W{?$kVLZZqEVlavk5#{=EUyx&Qzh;#xT!5q!^HJbscbD$ z-=XuUOx>@my*-Hg?D)zeDQ4v1DP+Q6FFnGyWsZtw5%KOFHidck&e>N|3L?4ttL|TiacZP0LlF zx9mp4?2TgmTd2aZRVlLwTM$_op!d7E+|tHoM)@UymMeRhXPqvjuY)t4U{P9$C-{2g zG?CP9UVCY2>0r9E0YtuW`7o&QZ@^Z5Kc_=L+^5n1io$TaG;gX7Jv@7OK2Petb(WQ_ z?JN|qv*X#7wY6;`R-ZNeDk>{pFf7xD<$hs$WoR0~xw)el&+YyX7N*w>j`Qk+k?RC; zhw7?|R+bs~49Viml~4`xD89P$&lZ6{HGGXF8T%oHl9JMILFrP9-&kh{*0~%gqy!GC z&KJ5UvNA50U6v~*%(0bh~9fi0F}xV;l6SR0qI!yU>qy7k_;YK3-a*tSn=@r0my81;voHVb#|>0Dz@(X z4{mtXKCWAHg=B>^f5_9%kMHL?`BTH^SkUr^h6ZE};*+e46!=pHFjJwX6X&L!rY3sL z@b0ZIyt9r*B%n3jU6Bt#Uh<-kw*<8VqsfZ{*dZM)8tIiP%;R~0 zP?UTi3I)$l&aUZ*utvAFsckUAbF3;-d=ninL+VtT<5SWY**@p4F1l^-#Acx@&bxk; zhlhv7ZA3X#PHwQ=zM3Nke=7amyS4X#&(CYQ>270MK+!&SDvk<{@Lh21Ch-Hww1SSp zsNes^1>ghxTw}Fim+e;)o3J`9-V-6_6R%*3;mx+BriK1OLa2`VPme=G-@V5bb9`-9 zf0Mc$Vjd0CsmC8ic?)lh7rfh1P&BB^#8!K6cyz?_f?-$(Tm=Sx#iw>M55bKL0bHw> ztdbGg1}h66p&b(CzrmGyVVZD{J{i;)fdB!(CigP!702dY(V9})igK0JRVW{4DBI~d z1un*Fb{++RO{5`|R{%GDL30<1=9i4f0!-5zFat1N4K;Z3_TVtCa!l7S06)sXIp3z? zKC~8Fm>KkxTxg&yzF1S6>t+@Q4Y&IopI4Cao-(On0aE_a^#GoVC@65US04&h9d5C2 z;oy7`K*Vtb!ikIm#;MCj_cB`14Q!Ugxs}o`XBsamse#~Jv(21n;ey1t#ISY$Von4NnT-v1@ zB!RvdGS8kUC=iXi3Jn;PH^{krChO0-oXy&M7n`-O7Vmy_wox)@KYW*$XH{C`T~d2^ zc(gUb9`=Q8S0Az$^c*wfwK2zK+c>wq%V6-7{Lvdm&SF0B{tK z^~80=np00}yKba)zq)>d!~^_Wp#TGcuMU^m+2&z%yMgaj3h(S;%=i>(h<#|#CzS7h z{P>G4j~|S6U8}aZRNL+ajlyTkiaJl9d0*^W?7xOOi;$tilVtJi7b$K`(S3{!^SVI7 zexx}vI=Z>>X8vuiE(=MZ9z{nu25kSFT5jwCQ0rf~cp>vi0&GR{bV4E??x!n>@QdxG zOBq|cfP9e#iVhbUJZZBtvBR;X&p9y2^ zEQ^?ikU+;2_E<}X);;tVJuU#TeSjB)6;Fw-vK^gEy#*-xhg$9mazV(51%a%1p$bahfqHjQz3eY8pzTQ9_cRiLLWXi|6 zVk!SUJ$-IcyN;NyWV@x zDBaEfVCvgh#rWTR@!O22qf4J)e_@|@2_?{*6L?q?QyWYZgcEaz))%t`EzTN8h}}_L z@qa-H6|CVe{c$Z?1?;ct9AU=)@}aMn?l9zdP7A~j!(EZ5%U;407MH#5e?E1Lmu!`| z@-SV7O>gIl$@s(foq~~;qf{d5$rJbTnC_*Ka!au|yce!gM7nzCdvWjHsKZ zh2EYR{hEA6@GJj!YmJ|XwGwhRzO+}ZSDkrgSI4%Dxr(2EUqjKN%tr0Rk<;K9IpdSo zn~7tg6|C!@0h1pA;ei~5WtE2Z;HaD`>E++Fbo%SYPuZ#xyExA5VhkHd)1f_(V|y&4 z=`<_kva^YRk)j*WsyFLd9r;`%-&s*pt$DHoZW{kZMuF8-1Y zuV&O4!3L_WOwA^FVa$S~-?(lD@~Whpi_N?W#R z<$TELx>>O+>ZvVX@+dbre14yt0 zDQ4()jKn(_p789gA!W_X%)AyMbmzJ@J%ozDe|0DpJ}}COVXzWGbu%DRrg*IG$H7q~ zsam12IG~k-MY{B6oeK#r@B$DSVLU=_cYhzN@r*$IQ~SHyUDPJv94j$*THrxjS_)BU z3*d^6F`*J*U29RfEeJA8jKn6HoNJ`J3de)wiE0BK{2XrN<1YIGnAZ%hlM;0FhSA9Z z{0K+japY4I?{M<6>U>fxn23lq$6YJV+2DGJtW!9g>r(kY7vH-CT_cw|5r_irpZI`)W z&kl)?rvl&wV$njkz;INN*uEiXnZIXd=G_Ch`yHSZThkTsk8BtMDo!p`9j-Y`(dA2* z0eKPpAHV+)lz|)<`pbkP6)K5Hw}V&_0vVa$OP4SI()f!T)?ZzEzl*OKtWOUY-qChAz;xtB)0)8XL-N!6%;e|yW!mfx zM%#v5PA1DuN64Ed*>C0-78lR2m9HhiS%i40o2!hX_6#D`yc(dvhl7cU38{;~>u*5A z8o=<<!F$5)G(y7cKvTv4ceC?D8RRlOnQ0Vu!NNgF&Vy!`|v>G{$I0lpP6kPD? zHq4jK?rouf1DjeB`1E~6p9w`Asaa3DWJX4qUrwhh{wJ(u{5wAw0@D>C z?7^VTZ?j+`4Vu5v(?vk&tX`Oo6nVjP6GyFh{VS{nkOYF}{prBt90fT!&mmKwSCRzL z4UttGrptaNCL$6CN9N5r6!*$z{+8Kw&z&D`zY1Oz3 z$LZ@n2nf2R`M_u%;o90-#oAu8m;Ts|=PZvn#7Zw)ADGhUdpf3*O0+S)(v!un`Ax6&%SQXy=4#u5G%diE8%LejIozxmJCu*AVl{``IeRZ@J7= zw`b?65_^}2pljV49v}4>9G~=R>&6`b!R9~OaL{yL9?cK__@Ttl0?{#7^^$f2dhJO` zpMbex;4b%m1pO}*K2ra$?(?u+f6K4;IG8{Wk8fp5YYSQm3mHSqrgLU$6h9%Gz7L70 za035kaO#k-Potd*p{&L3pNje~-ZK@?yIoq4nKbcjDbPtz;tJhs+9XHo8ewqzh{Y~{ zCp&2UY?**y%opTR345DQvIpdWST(#G-TWxjd9)DL%NU9%2lw}a4KE}jF`o){L}x2a z2DRnn*nw%sM4XC0fWpe-Tuxqs6&0A2YA+X2v>oYmI3m{fwzqYM1LV72DQ*FQNrLvu zpQBe-`EOxQWy^UQt-lz*Y_nh2|IF|H5vM-f%Y= zja*>!&D8%bT*~a$)2o28d~bdO@Ay6ahr#NR^qtfsbbP>@!1E+m=-y|+N?l7ktEtCx z)Zq`*0K}>^q9S@*t9?h%GGvzo;H!75q#`a;=8&3uC3?|9M*Rm=2^ruR(Ofgft+vL` zsuPC#?9R$q6Tl3t(M&j*jl(UE=%8$&Abj2xDw0$XUv=tGV^ICL*^YvfKv1wV=~ zi58x%3gWQMc>!}sg`ukmlVE}Z%Mc`Sad9g{#ZbINu{f`F_Uk%3JF@NiAP!D4fKx*h zUo7B*Puv6*k7jYh7VsAzeR0I{pfc#xAC^3yYAW5nwQ_f*Kbf6f@QjMU42e%fbT5bj z{L#QyYgR#lYW`r8j2CJs7&bb*l982#A}3G`KU29V3}a999BwIQjiLemGXXe{a@lK6 zsQ;eAT)0ZwwJEOk}ndt<>btb2#q@beGqvRdY z)(Chn39d=0Fl`L@u%crEfnJe*U5iUp1;E06sixM1Cv+AF#{JWcBdyl5(r~u%v|I!N z44$9|QgV8FMXL0FDB9CubpAfd#QRsE8r84>FdeemZ>_wg8D_ z8iCVS>uw;k2jt1y`%;)A&2#=yrSY~)x9`)alfgNb4~6bU2?kJE|35ena%pJ5m$D|O zh|e3m0dv1+j?d* zNco)ZOg9D5(NtW$;!{W04n29m?p`XT-leu=zW@0>RE+&#a!di+bpk}{k;KEK6vWrw zWtD2yVAvO0?k&QIC&Gz!L>OW*ukQwN#GB0TU+%Ul0_cn{q_wMJiwja$LJNy<(BZ!qwEXiR6Lh?nN7Lr;>o8^6AASR1>%!$PJ*!j(95S z-78SWczQI_;i*OZG1l4}ten?K1wVx+BY&1GT!wg=Y$&2-n**7}0AKM#nXO8Cd86pxEe55wswD5hXPjV7xwc z9cfjlnpIdy*7Ie0X&1vJJC$=nQYP88{5ineD4ID?>f6p|?M=>b3Q=d_(|h0Z4lqE@ zQGU?#7&a30NulixZ%mZ2I+g3z&|Rj1h6bN=*DZ95ibt`~x#{WRW({kR0z|##o)IqT zV8}~a-|b0yEo}}maq-r#@IGw$*9b|w!xc>Wku#hmxbqK{(benoU;KCREtj|2(w2=P zG5-PGI&KhLS?nCpyvjA{6Jo*<=el+rDpzt^6jxGO+9P=16YjBBaadn&^~MSNgYP;A z&`_qdEi5XVD9FiS;>Fjc0wG@5z)OPvM4I@qN)k4Q+fUx2|L*Gp-^7j;s`-~M6VSE) z*5LE+Fim^kQR}2VI5NS$d=)p0Z*j*3>J8mz&me>N2=$6qzjcpsVZGUqL2m|4{bUU7 zQ~TvWVf33gfSS+s~4J@mWspwQc6J6DX*{^GQ4Zur}RxsOiYOzgRH>u zF@oj&!+W&fH6la6r$l9Tj`CUd03iWE$61md+BX_nz#xGzbRQ*L;1+(oFgGXax3_w* zTP(yA>U@J3K};vOhc7GT;=PY>c`aRRt#rY9{xr}l@gn-!87}4Tc)aoWj_CD@rdqFg zw-17moeh0HfPZgy9az3nQp(p~-fOj!G02aMpF5{fnwEZ0Gadq<8T6N79ts9Cv+U9S zYWrI+Kb|4<&#~5*ytkkL<*ud2v<`%2;CWM1 zx}F%R7UJrjcj#@t=?Mnhq7k3f*MFSn_j=k}^13&#*A-!MuEVYlxox%TZ5t3*^X( zj#p=$_ZI0bt*oYghMYJ3B&5`Pe9or~yatngvzpQNpfq{9d`oNc>a!w$z`#=0DO?@S z3OuZrKDEGD2-Isv9=4z7>J3?eNvvn8AEu5@0t6J_jEn&3#|tRBIQy7x`|z%5Fw!$1 zgON8Y9Q0)K4@A^eAz(1b;1U<0I^G;y#{!jo^X=nbj;Gd97$)={9PArYNrF;teaoW# ziL~m}5czUen`$+QZ5hT+cC`l!3R(1jLzzD+7!@p0EZuwadfJbsPwj!=cC98fnNfLX zJ``t;iGiX1b?(G+hB?b^{@AcELJi(=2_Ub#9PUaj+W}4qOfiT`;5}70$D{_+e($0I zkTPFuxleeVyzS$NI^3!yh0{zfJ1yrZxZ}|y;3uTPlC$02wC*?>ES9ynf`fBtId+nN zVWKgd+Fa`6M>BEp_7WY>+TI`LhgK*jSLz?49*)V^Y|@;u5H36S9zJ{sP!)^u%;;{V zF>va~_=8AkfKI0joNcjWxdcdLv?nc0kySs-gqVfK4HRME^nah2BIvx=@Ryjf_iX}* zDJ7PmzJ{C$>ne5%1Sl={eJ_spe`~j@3w4rNFxQrWmV2M!^5v$3gP-=B3K^ZMYAZJX zBgvi`cweU{I6xSArKlLo`T5jmtSt&VbbGKSfa<-4&NxRsh?)Dot-ODUg3^8iTv))8`jyH+ed-`;)esyzzOgf&LL_3V!XK>hN7 z2A)p&_vb*^Le1fZjyz}uNrAz2jl3=C`}e`94&bC}6_Pn)IzvLv3Y0WeU!Sc;we_>C z$Jx1H&j!A=I#m$d7RQ1Zb3@3Px21*z`j($ecNArLO?3m*7e?uQr*#(DvY zKOG`O9QG;3se|orRgXUfv*cQ3)H47hJlyoNINUd}c*C;&L0x|!!Nhh5m5_XF$pd#_ zOPvU(A#9b%T{ch<_`v)8fe-M{C#XSu`j5y;lNUHy-(91u#=jGsY|g(%5xVh(JyGCU zk-I(cS7K3o6t}7>(~$xnz)2;%{^4{1vY=9Nuw{a}^-)jpU-qpK0bAui|Kh&4NR3ji z)N_g$kP!iE`jSP&q=3oaAO7JbS%#g-NId@c-=i>xzb^!Ql7C+1-;O^elPwRx6bKH= zU5ndL&>2KDUzlv3Zx`0 zj-^-07j68Sp&@J`twN3%d|{5z9q7RZZR{$r>%9;Xj^f6A0PXIv??&!;-ajV!VAC zXg52RKtIU6NV&FVc%M=H`CvP9^_h%uBk2fC{(8mnS3DrKV}Y0!j{ zu;mEBtq;8K%FOv3Yo%}MFNFO?x3_m^f8veJ0we@zA(Q^>>;Z?_F9CbJ`DxO1w%G=y z?>~No`(6hpY6nQ!Z|p3N27ucYG#(#oXi(fsTWmYCq$DCDL!%Sodxw1Od;usK!2Shs zyMDKpBm)BjKVm2>KK7}U4R=b#!4)5$CeuCF{as>EWl8O=Ngj#qGQ*Gp^W`GRVY+zt zBWh-;Sl<@CGSepfh=}s&TcG%Ci!Aq;3Y9~HQtSUs;jzkcT%#1cBrA(|^K6eeyNcgu zeZEb%`Rf^wmeaakfio{g5BoLMUcXD+x+uF2i~}H!3{|nm0gKqwv*%u?bRFQ>VswF* zVIEzf={Ny!CYx%`?BBGW=i84@zEpU3tEoCn^EvI+>!FVqDDGXqy`x!wMFNwEK%+dM za)9do!!l1AEUaI?=^i%1*xtb(yeV&EQ@`C2rHlM@c>1=D4L{0L(ov{0tf{SXJ_gw_ z;c9JeG=h(bDHbZ50^DO`xrYaFG1-H9G<@{L&3AWy8(m0OOn6dR7XDZnCepOdwSz4q zxe|1{Qf}A(Tt1C7aJ9 z0-SsI?oCqZQX%Ho1j4l)(pG;^UbkuCdOFj=3i)bYUcTe`PgyVn!Mx4N`VQRi59TtM z9rY$eT!hSc(aw)v^W)q+l{nrgLK)L~da`G#7y9};ZWq!%n+dmV9Tibdle-(mVO~Gt zh~sdUtaLDuxC!$%*bR0P6=#dgk+t&Y4sRnGD?5Hu8OW995y!h85!f#Mt};Ca)2cu> z)0wMk=LI`9&^X&ID^w~pCc1DTeXL8r8Jugh9zUrijpD347%Q$5rWKnC=}CGik|7kx z@mF(Wd;NQ(_6~jgOnDkR3S)z( zYjo|m9y!_b9BJa+fFAbUX?r&c>OC%bjw*x|y1N3YSfWTWcd&4lrDSz*CRRjLe1 z*4G~#JlT&YCniRaab-4z2t8xjjJ^lFB&%@&SG2)=?%*Zr+LBU*yiXQgUmrdyEsc3D z*g|`e^0wVLdZX+?)IFg#8ag{IpC@ZpNY_F$|7J6n>w3B(t>H|{MJ~yAapT+tbFBKv zhP?}mq67_gbWKN#yi(&`KN|HSwl-=ojaubd5?^~H7i(x0U^ zIjs?ynQ1!rv`yD~N3l+|cxo|M*TH5-IU}r9T+6+sXFNRYV`R%9Ya;3HL702YjdB*a zk}wv4Jh8hukBBktCQ0+h1BdWz<*Sd6H|%znkpVRx=>W&&o1cohMG-zR3|guj83pX{l}}ZG5Z4nTpl8{)MM! zI!s3ISc#_{%(afFy6f%*9=C46$~8anM#W->IftsOxt;eKb=V?1Fp|C~uPycl08sNn z(>%rLIeu`k47jXfv7q4>Ix>od+yx!oD8_Ix&d-6S=$Wv4U=9S+U>*Rg%({Kqz`{ao zS&`}BPzdMwbAFKO^nLuDB_9yZ6h%-fxRkdGh5C1;Vy+;v--yX<$p^jA>qHs4=<5j? zZ{Gy>BCN*}OZUK%(&%?i)oj&I(W^@Yw~DE}CQYODll5=hB)j*3BlN84`;yPY!qI^q zU;mLRet!NpRyH$w5)wY!@^bRu)rW9k29lKfiI8hkhsM(%YIu*GoOr=DGet2gs=jfx z_Zktw<+|$VTJ76+c>Fa1p>@;!P1Jf`Hp5LPLn6ETLHqjku=@|>U%hGzq(ZP;9pJl- z=SS4l)m>@58~dEjsg(;>1-8Y2Z)%fZ?b`T$j>$e{+niO@c;6>8WT$4HVuqr0MI~dt zW2@qlCX4VRcmd;Ac$2aFLf@JVXA&^i=`(E^gX^2reu42co5>#e^{`MZT&#&KZq2(~ z=2Wb?mKEodsi=-3Kfi?GYdhd?8twwd3Hy*n#opAqM*;q;Ay(1!TUJ!|pdi;X8Uotuc)(JrV|h(>ws^*Tm; z$Yr0;)YQ_Bj8`*rn*5$@*pFs90it?$Tc8CJl-vDT5en?0wQRBz+e+`_`U)n7gOJ}$p|H);{7B`0T$ z?KNNJytlVEI5-G^N5|L~o+u9E=I|`OH@3FaV2Lswp518bTZ-d0nQ*+GpwcV))M6A| zF;725L^G@UNt*2!7Esd^vu=N`+D4pD7!)0ypJQiSM|8y0HZ-Ul%RRk;l|57UVG9vk zUTu7mN_G7@`K6kvyRFJ4hMPpoDM?AMxuQY2S*drsAir4mXQOlho<-|dKTH<0qqZxp z&tmOE#z1QhL|X!&@`ru+&@nNLekY_d#u{t?i*dI@1W&rSx3pLb;a5i@o``@C3TzJLz1cjg0PD9^>_t zyu27pE+Fc4WUG>EoTV_@s<~!ZG7&gOHaI+}{!RR%e)4QYru{^h4xl4qmM>W^BRaIJ zChC_ZA`olu-X*F<1UopD$Y&@rz)YE>INsBy{RymTdKYPw;nq+k4ov$)G-f`6psTrS zr)7JK#tQkXy*2TB$(I@rw7pfNd-nQxWmYL|E5SSeix67GA2{)n~)DggV=IU~$V`?d=X+1+Gs|389!9A=7t;1cQT*TGC_z_UZbvf0c*tA*Ei2-+np*@ zo}J^<%uLu3#>gEo!Anz1y-87roB~mvn;ZHu9{Fo%$<6OF4&KTSxi)EbVAN44FvSlA zHI@7OuVTd=-o;lFf$|Gx!i4TSQxToaYPr77M|(4$4Lb8+z80i`E${olggYFj26~|k zNJ6821*%v-bPQSDy$=5PFsc2H0Ik=~w&*RB{_ipo!IOhXz7L;2H`HlGeE1k?+lO@B zQLa-ch6r2SYh+Y$^2>yuZG$?_dC#adV9|bUr2U|?I_c}z$9&=tXf5c1$hdCvd?$kg zzr!p<1sVh((X=J}6ytH_ZI?rp{6bns7mC$@4y0JAt@xie9sjys@%+U7tfuEbxQ({{1NXakroo&kHH1FE(BMMRf_Hxh!-R zKKQ}Npp-7dq;mmRCOmBP=I5OgYl=*;tbm2ORdaf}xwUn&eiDcat{AJszPYd`x60q^ zEOuzI;NNePucs3DRV(6WH276equgfZTrm2pMU6BKEp6{otaF6bRJ}M%u6pD$CgKM- zy2EsA$iw@`V`9@;f=yHcnmT9|U6TiiF07WJeFcyP4k&$Au4(p+up$wa2R)&y@TkSq>>HN8UAF!z(E$t?M?s+ z48`4G`a2(Bgi3TYQhz=FNT=~ZoXZre;OT)Ye0Wf5aW)0hE6-)C5{k$279K*O!oU^j zKb9AiT%DEE*4fgcFH_GC4o3C5iN4z%$5dJcfiPHMdvw2-^q}h^?3^Ft;%Y&s2S=4^ zQNxt-#H*}+mG8Nc(GW#$xZ*b(Twsd6RA=cG(;h+;Eh z-8`1>jeW)(IbU2enE&))KZS?+tD4^r55|`Uin${rRUoB8W5=cB_`r_n$T_chvPzDQ z3dm!J6TN)K(e7%wQR9l4{k6md1OzW{S5y++yt%dEfw{4}n@~^?sM{2>-Ax~_aPWo% zeh-h!b;##4Wmlj6Kz^m5ra?X2`EIRVfZvposvms41YbALWsJRFz;S?{?&;bKGU^+D zp84|j->(Fhh5!5;-tGVV2X$(y)1p@+d2~+nTS3Sj7@_4N!zYRQun+*wiD7qXJnPd7KQD_(l<4Bk^P z@Pf`w;9Y7{u+9=5JLIuwQU@pU(0nnN{MHb@1>+pG7be6UUazo2L}jtrp!F^`@ygF9 z+}sq4+?n;2RqoJt)5d8)-6jjUZ)kb9E*l zdGYz%x7Ynyp_lK#DT!Se&&Go>#xPow zW%hV+W$2byRu&Uz>5}A|_CRcsbG%;()jP)F;o(y4pKG#}I+{o89m{Kbo0|3A0uyi; zJ5pR7)LJXPOGg_GaJ8koAi1)DHoyo)IWENsmi=hor%rmQnFjZ&#!1@EitYa8S9@FO zZ&ctzf3;ZGlsYrN-&x5MOxV)0v(nv{E@f{1FyEk4XGJJ(ejA%`vA3LFnv6TIEn6dl z4q_ea*|z)U7Gt(9+vkn?1+h+?PiBs$zu&+Jmf8}faY!vx?tmK<3lxD%eHpFDb=P`G z(|kb)-6_DXSgG{)x&%Fj3A6YJv`FUfLYiB z6Ii%J&A>6?El^w7wwvO4fM}m86Kk;7NuXz-545(_D+85c#Sb$z^I<@beb~p3EuqP+ zkL*@T6e1x}p4wZb7pnGvS>)Cy2bP{*=_+$bB$8c!$>#d?>*CS^4Uiwpv2*-ptG3Uk z%v2?8S>pT{^IQfjen<5X^FVWc4y)@6t2I|k3q5Ljl@P(UVSfQOP|*H$F;1Bx0#lL^ z>H~XZ9N%RDtl_d4bK=4mH8YqH!FwTa=Zkm!9RPV?{t^r7>{*=AK&6g~#Rmt8mlQI5 zV`C|rg4Hm~62(FY$Zx!w+yW7vN|~uoUqO8mA@reD1dH)3#30St*xbXY>FxE>s9w)) zRj1%%C_igf0*||Sa^>NO^pvJ zS)`__syb=oh2A#b^Cj6da&{kva=`Em-IH;I*7aM(A+Sx2x$jG7Y&A5bw3>(2YL^(2 zqG5FSR^tg#%G${U_f^EisPAh3dGEts^HOIl4Rv+Y&a$4`J~3;Vt>!k@uJzP!&n&mN z7*iX3t6pWv`8e$^^?cX4*lKb|PF@zEg3N~lm%gj8f0_xSXH=hCEU*z4_RLC&Ehi`X z`tQUDJX$V7`sgf;{2b-2 zK(7RXgX6^68R&U6d+oB+E5pUauF>9GyySO{sOAbxJS4I{Ty!Ib#N%zu3varqLBV{C*16WgWeNkcNsm$So#j2 zdUMg)RbK(d1OOuZtY|8#$i!^M2}FY=8xyAv&PsHQjM470N7p=HIuh6?&g24va^np> zJ$Jvy&|N&I ziWqe{w(LtbDmd5$W}}vnhQ#mvQICsVMzAq=H3q}Fz;tn z%ra>B#R5lvs}Jap_GWX_is2@Ym>SHc=f7Qsg@_s>i#9a$2n{MV zEU@r{B;5~>s@9Y%-^uI_8W_GdHZ)xJ$jK>32Tv<{V8c~#t=(Pvoz}kY46|X8VlN7f zLH-F+W0?4RVPa>IqhIs~;y74CsZeGcd36;PvQ#f0{r|FPXx~u=}3&DkA#Tw?Be1H7Q&tpJD`%3*!qS@oqEuGd`GByIgFQr2ci5p61j zQg_QS!A+CtGH-uN4-<^84AIb-k)ea4GB0GPTke z&5;yMEH+Kl^?SoVGP*cOO^yamIab?SfK6xB@hYSr$X|9xYi&k;ew98Wq0h{Wh8n_} z;aF8wg$9Eywx)!%X2;G>7e@0j@kR#XbNcPK_xPwjghjWe_k9FFFdjA@0L7j@?z;~I zGV{6VZsrfQ9bJ71)}e2e&JJnB#p%Bgvc|(^f0}H|OMkY&+7WZFz`M7LtnXa_G6Xnn zFeeJ+KCsyV30BU62(^els?p-#1Ylcdnog48QgeH&?y0XdumzQr=Ud;6tJ~mBekOfT zeY%`s!4fGI-U-@_@bS)=do%NotW}PXR~jo%_~D`_Ks9(^xknC0iBB{&DPbYeJ$iK6 z1MCY`C||QLBG&;?@C9U?wm{TY^Kc$V>cr_f>>}qqyyyTWGgU{o&l3Ag3LW33__MG- zGL|N+Q}YvFVP|89*^m{cBq#Y`(gF_dm%kPid;;VGrO2^c8IeBe)XfQ#G zoY&?O8t?)oDRZRjDwEi%<`z>XV@)A$wQ^oU`O`NRh@ z-5Tr8z`Klm(KNaQ=;#ViS;H;c+tUGcX-TRU)yT*QkIMlT3@}84t!g8ixiSB|1|6~< zqmdED1!h#;UMAVH8UARsCzSuzp@$x)KP5LJSTh-AqqImaPK zK~c#JK{80rIm58k;P>6%?z!jg-EhwCAD44hg8cuL)-bHzu%58GqVhMoq9sRB=P?O^XWTHWM)F`aSbX`)q*pvxR1D;IY1k3U<#R zLe>&c_k|%E<}F(W0Ih?$K`HP9oEcm;X+6Yxq2`>Vme&NMifxUtd16mUyj>JC z|FUNI5f~c5;n6Sm8`x`Uns@Sly4x)@EiJFMM3L^#sv?pj2m8S5>%<3J=<7cl!@u!G z@8XLrjUMj$Ft(u0Gr6Il8A3R7f8aDPIF3M=J`|Arv-4(#G_u7-1qdU4I z_+yP)4*?)UMf>i3oaE4N$uJ`WfN;E%RszZb908eCx;vJNs{hCv9$%-FRB$llhlhNg zJbhZ78C1hK#$)p<^9&V7AdH)R*@5e$7+02e@-@%A_ z_Q9@y`vX7+V~uLxBf7AgP!s7g9k+BD(v@MSWo7^30^GkpH*;VXbwjF^!jV#lsj=Kx zID=A3Q*VHRQ`PHO{STp`c$MHTNRk!!mC~5$?K)gpbq^&Oj-$~|S8Ji0F$Wb<3M$a> zhWg*FDaAuY@HvMeyE=!AkQjW1T@3|Ao)Oh>O6rf=VSnSw9GcI8{p(Umi(y>hFWuv> zP~Yy-;9OjkZ2g;3L0cBpkz-ffNktKp5m&av)~5Xgl*%(U7C8lMCH%{D&!f@)2h-Kc zJhf9gf+Bm{qLQghhf=?51o72wt;^jk3~b5te~kv@(M;-gt^SmL zqdf)BYHGy@b(Ta1l-(r7&9F~gAdQusih-yMbt*C)4j=`v`8%9g z`xad%DyJ}h3hBR_5DW|O;9ayWqKQicvp}7rnVeZL(VDmBg2B7{SuS3D%IMG2Zzy9- zD8ALP3ZASi2%y7_Ucf%6SF0rP_0?(Z)RL=k(Gc97kpSBsDXnV1zUyn$n{-9XdGjJ` z*#@&(!R(W{9S>zwyD{HfkaSn%>0G6@7r6gi+zQKf)T4t(O9Ibg0F~NQ)HPW!;#pE$ zd~?~0p>&}&HQ1~Ab;R)Kd;XSX{YO9X>08Byf$tDR7tb9f? zj?(qV1a;Hv{WX53Xm}!-e*Y1!o^U^SwW7~1k>}X~^oI&cQ*Z z=YPKQfAR&-3jo8N_>HboyKc-48r3q{gmk!?4UQnK;APNqGmLnv^wC74aW_mFc7cN{tB8u+5e0As}H5-N7CmJYn zvHkq^;>LA^WHC-cclc5KTOp`em>^q?4?Zg*%J<{7kA(t01|GcwK!C&VMOmlah604d z0gi6Sv9D5b*5g(12{Z%H1631vLGJ|h89WflS&gn^jmMrW z#Jm9XURecldVB;++dm|vc5LDXRE9tTEuo|flv{afA;}CtSINBjaW?>^Zm9L*A^G5# zOqYucq7%Tf1+D->z+l>Q8v4u*dhSs?#ix5OUcp0pgDMa8)D0Hb*QY-Oe&TMRfDO+|fp-+14JmsC??A;K9(6_=HD)EgqG=Mz7VT1Y^Z@&*YJ+>Q5mp zhgZs)j^406mnHQAA%l!#?J?cXv`P8adclm(o3D+H@A)t$enF89rFh;b1oz(QQ=oI@ z!F;K^&!1=E6&=lb{P>&O>tAkZZjDbv8Z}B7cl7Fvxne#9uUybXd+-cwR7U=C|Jkzmddb79CQr@F3P44SyH}DLB z8h$v7hwi=CvD=1<8KB5-4Pd=e6jKHV2cLwxB>UA%fH#HUPA~3A@R=H55gC#^=iy3G zE?}f^UAYbg{0uthN06}hh<1|$E2p?no5mgND5&iB1`I&33vOsX`%A;FeRA`I&DBtV zMzV8rpN=eCfn6w-J(ik61c*qmfsDQK#rd+*<9dwCf9UE!xE~;}%{e00su)vYuq$Q5 zV_CBk435Ny?!CVsta&p>xeQIPXKzf{e)vcz@3euY<1nSp@Y-JTu8xK4B%!9Ns`2V3 zNWr@KF{?hF0~uHF@bYb;bNaga{(hkjT{rE^_v#~?LOBc!TXtALpHTD46%u6K(mM`% zAK)&z_GoVzEcuR58Y?LC231eR*>8*~$c) zQif`^-$rbqq7{Zw9#?A^9S}>CpPwJnn?HQ~4T{tF(STgWV=Nu&yk;xofk2DxT}XTf z1_?=#`7l@ek0#d3I{kO4D0vC(?Ceq<7?Kkg*4Kxtj?KkCPY+v}Xj%QdwY^4tnT8{P z&WA!3ujcKwYuEfge0aDzb>-dO%01~Q$$05m)s8wzF#!tERIi&8Lx&X7RXskOd}$1I zpaA=Vb+Xu%NUg)jFtp4{rPro4Es#$nfrtY8T<{IGWGaUJM!Hgj zhueOIXS-*$^us%$X~U8mh*xqYN>UJ+`CUfnfx69R0t7)bGLnPY@lKQmY6h0i0TOV@|!gFAKiceU3$lnAhtIXTAp_tuJ&zDbrA zrH{7QD<`C2e+_WEYLpJ69Vx4f3?a8`ua>Gg9Y1}oak*E>yx#Nx(ZESWP!?@!*lUJ` zMp;R%&gPxe{_VaPAuU1A#B>tEuUR7n*R4y zeLJQM8=&2g?R-bw1xaSenPWX}uHU$IJT{xaZ9M9t1Tei&fk8ot`fA!MNQ%q(7#OHP zX?xIo^QtpIt&P z_UrW^Ke|JLL9d7Rh%0e%B?EFG%UJuI_ON1ECRg# zf?|Xr;XfL)UDDs|F9ofJ^}EOf9my>I3wxc;4nOD~yX$|s^Zt7MUvcaGZ+HU#{A9D_ zSD!JH=}oeU-sB@t@Zs9c7)H@pze49@9|f&R5nvCT>?)uW9EpJ%rr=os`JcTI@)e4) zPbD4nVei`)S)k`5RE?r#QsAQdYzTtfOQ`Hlg!Z*v% zHcxlIB{2o>+5WINijNOYA(aQ3`%+=f-nEC|Q*>sNtr7hVfg^5<(Jl`kJ|jkXhcG_{ z$E0#vxWE5fuzs4FLcong>AXM6vX^)GBTia%)&WtX27)Sqw0V1F&{-k*cM~L6v+d&J z=0+!_90;HRDuT=cVEbGSh>IhMi;MW}-6Z&}sk75+;E4#hPXKLXuDOx|bzK`%3PFgL$b&IeOmF>T8_R3+U0%XRQF1b={Moz3aj6Cz5% zFOyiKU@J%~yRo^YGyg;eQ+WryJ|*4IOkTQ;tA!Ox>G0-}=lSV~HyVU=ywEzEVihl{e_aA5X zf1KU_ad!X5+5I19_kWz-|8Je$xMMSOaX#s)m=iL$1>ZK4bD>mnpHt?#gvDxJ-q(NZ z;=*;@7of!SQC?x*Vms8x*dCFZJiq?2*fFX@jfgq zv7aR&5t9^`JN=huBm67y_yFj`$x%R#cpc!z49=NT5~M0D9zm$>_SlrA? zh?`VyGPwDZ0CQcrb)CS?wS46^iiXPhC5OQYgvV6o_`J5W(+i4Wcihi-+QKRUgwCN< z*4p8@xyG7I`ZE}YF#J14jWcesRttZa41cOVhhV~V0E(9Yl)JUl#5KonsGh)iBi zP8@2`+uMxXbaE=?MbF#F!^h{8 zcL>YV$<|THP`*g$9mMtp5+jFx<2POQ$A`zjqV@k6SOaWJs0M`p`GBgg-{N2MY>xXGkVd! zgif!;_Hh0dWLoQ8~c5RM2rV1XMnG&i;uGH}e*3m7%QAqL;4soC zD1!&QRaS?qQ3qfak^>wfWU}9_?H1H`?XjrmecXtBkUplTucy)Tt*1-txeG*8prEIJ zb#*=N$hOjB1ww4ndT#>cZ6Y8#o^w0!IxCMa@IAnvm}h-3yR7a-v!hx51ya=@Auf&& zajc=>9e(UWM8)^AMdj!nz^PmKm6bc|Sm+_HtiC??N{&&0C<>xOsv#IMCx;y|K21#O z0-jP;Ke?G@wk?ek72-Y%iMCdwdK56mFCb*&sfmdE$IQ zef(}qk(n$FERr+Jq)QXuwF~#yitQVLD`MzuCxPhra1A8)A@QRis7BJiw;+#_lZpJ& zkWR{4vA_(3J)N&9T=y-KH`v=fDwrWOj>ch)`spN)ScTgUgAuZm??ek09+YeG1tjQJ z)Q3ty!I#FSGn@0oXz&GYBP^rjV||{0XKHZHeo_9oZ{73~nVNT;M^FX;7FffmTvy1T zh!=o(+u(T(1nx=F$Q0rWVAj*GkC4)lJ8Nzp1i%_F0ta*I5V#h?*JAYzPXUGcaiJj_ zl>ZP0*1>K2y)u;K_Rs^MjR@6m_(At=t;`9hhkcq7K7a%2*uk+=kpNzdZB;G4knnV6 z*6*|NX5k&ctE_oqy*5ufwq%u)W1S`%Dp2ag+T;0uo8Gj*Sc>~8f&A<4`D3c9{tLpb zU--waH0OPZ{+G81ygycs*ra_%({Q~xrK$y06643 zS>7??aNvkwXU|0#GeS+FsWeOneZh~907ioL>rzNGy56E3_))dNvr`dG4ZakmEc-%*fK&;b{3IWm4hC84&Kx-7|bT$<8;0q3~6w>Eb>EydV!c*BwClHQ}xW5ShJ zq&U4&c}+TI`+IIkzELFgnnAVnY;;zwe)8nrtj}hNY zIO4UueT3g5OgJp$)j-qo!tI#`O~+Y-SzD^6X;nv7YHEvJo2#-C!5Pgm^k-=mCHr<( zgrZX)teYEmuJP@vKZ?1bH1b0f?|sZBjTE<&zm@Ys2(e!11@c4axM98wn5l$tnQ^d%Gu^8#7Du2#k79RZLZRP~-ExzB1x}kmyXzMDv(1IsG?Qk~Fcg7%=vbPNMh6yKO-1NxIkBKE z@;>_7>C>mBqWNU;UkUr4BPaiym34EqY`61_0QgjZ5Yts46D65!gM;ce+XOl)hOehO z(qq4#?9bWj)3pkQtT_r}Uesq9&9*n}r=v>d6zuCvMt}dl3I!8GCF#%<$ZZb~#ec7> zQ?|6s{&M%;OcNo1^Gut%Z=Ft@WTG^=Nw$KU!n}RcXRSH0E%GLQWSxnFEHE-MmH}&^ z*los?S^7}J$jB&u_V{q^bpe5USbb3j$RrLU7XO2!wxtKT0WkrqM}xk+q-n(5gmvn3 zrxN+#fp_PkrgeWZaGfA(z0f5=M#O_coud`IFRZ}pnvxM1D8B^tzu-60jgyQ)me$tt z0pENuhKp9CIITf7EOGLoGs+eNn`sGlhByW6n?1Ll`@39jE3(7FK?eW%$ z12@1c5C^GXxh(o6{m+pR$3TUmPl<=%j!Bl6th(MrU=z7qexK{J?u9rK$jsd47h9XRnrfz)QfrKvDoQFs>n>cD ziXvtR_z_nxnJc)nfgQN&(v&B zY;52ub~o~y;i}mKq9~cf!Z_CTR4;L9g6;$`5JRl|R}{Jkqn>DOjj>jKw@Y?9(_7|9 z#?SG?@Cbzp<1VZX+=)u5rG9ir;S0A^k{87A3iA*7A9eT&^1s_10_5c~G4dNYRM}ol zN8tl+-Bf>Exsb4adj4l*wVt1YATL1pB>%}Mvh9I)_cml#tWOZFlnf4ZxMCz^mj_xr&Deha zXc(VEu71btggZ?_1)YKXS3MaA{jB$q4_l^e)o8`=@I)9{Sv%F31jibG`*)d^8lBs} z3;C#mXz=d(@3Y=ZO*?6Efi~OaTXW{!Ia7)Pw{#L*B&8MSS!TIn=7sVc9Me2|2Og~U z_T_O13NMqECTgEv?QH1dPpQ#qp%2eDY1xkMX~K?mCy;ZE2y$8UKAe2atGZOhXVy(6 z;fp-foy#`YIx&WyOF4v0Hu8WJ)u(7pPlQeBOq?9{=~-=_=sHo6kR9diB*{NaVly~# z9B*rL!Y4F#Wvdm_O;sXeRvm7%_Nz89EHr)B%QdbOE(v3x)EQ?`tGUEW>bf>y9KseF zvD)p=CC)Sc(7(KEw~VjgWasbGjG{;7IdWDeoC}gg0*EPZq3`bEy5zTsC_59w?G!Fm zOgny^6NpnYpOD-i1f-!~X-OT)0^?qO(V>E$x<=TVDXRB*RGmsF81I~clwI6 z;|VF=ve z)cU;NXqh^AaeY}afp{k;+6^;CBkzKgU11yQ=zb7v2s zc8|k{4eN-_v!~Tj7Nl^^N<}w@Smc!dVdDS!-Ttck`w*o<&7jvgUj4XhKl=Kls54xY zKV9*;CI-xnww$jmu3}}#yWbubEz8Iicba%d_}potFD7UTI6m|T1wF{9u@!PgVJxwv zbJvkm+Q#l&7h}tI%(H4gW|gd_41Q52orTNiFI<=oH{)lKKgBFb1gE*(QK2~xG9RS3 zf8fW!w6RW3`C6jc*%!^7wGVtnZ>Iq*H5EE-abUK+b(G0=tUi=6azKZneZXQW{m}XV zO-QjVMrgH^c2s0jZ+iuGf`}j_jp7zqMn1a{~$uTjH{6}VI<6l?3YRfRA zxJZZ(N8*Z>HF-0mxH~Z&8{cK$qFthhsCmVG5h?NPYg?EBLEX=vBQxrL7N_uEee0+uYVEtWoq`Kz z@sZW6ZmDeQ-aOE>o)bZjjZoxmA@?!vV^oJka~%l2d*3cxUUk*6PS?k6z%Fe;F)GxooQlSt8q@u zY9K($Q(>6d$G`a*)AEl6dC3k z{B^qQ$#HS_L5V{4)@uy6ZaoYgV@6gq5G?f!#;d~pG6bOlv@F&MR_QSNX_!(KCf~IE1cQ%@!@Q_qiZu5i- z$n7_xpZ#KpwOkx9n%NKwqvTSi3lO^)8d{N{PM>)40=t6bjr6wz;i|^DV*Q$$VcdEz zA(}p;#gBw@Wzug;r#fMPw0wfe2sB}vnP0vq2niJCDbTGaO>TwzTp)zrhItsfvm_U~ zd;C})&RYtNo)~5imGqB`8`0g|-b``XMXwDD2ndV}&!&TdpvYJ8L)X8eBHEe%TAUvw z4u$xYWc`M)pFe(x?QNPyic3h)CbwoA8BLD2@2M3zIH=~BdIYn$KJXRTdKjMrj{}P` z&6A7T<(fQYz+72L#WjYZ$}6;VwA0C-WUfPB`jF#IPio6d{aU0>-B}6-W9ZZyvNX{u z;S)qetxwOKHgWwT41HM_5kw2>6rdR5{@s`|X^j$_oRD2@*Ow4O&9#&K$+$Z%`|dsR zWGG`h-oCiX)3aKQJL*FwC<#_yKeETdb8FDjlHO1)l>~->END7eM*DJ|{mDbxSIoPnPw5LtAL{$(3%3Wm>T}Z^U4(&`5=HYI=Vj zpB^aKk%x(a34zp>?K4S5>|}9|ITEfLuMyf7mk;AjztJqb4->99)l~~kgEWHaCvhuh zsp{#6oBz-)a4zK`yYcLmTJaEtv9w}%dAQ3!HeFBeXPr=NWQop9t-Za5Q<#OK;03rs zWjx=yqftIDMs+kaabI^(W;jqKV7uRW8Be$0fokw?9$HYgeqQ5EwON02 zb*d}2wHy|_z@^2S^T~TY%Hu{hBS#;nE1~zr?BSsx(h_>j)P60q0Tx!)imR*KresMm zF`g?Csjq#I#-Uzh=`(<$mMotfwB}&X+5CB8GmOtUA7-)sfY44dJuH*Y4nT&3B`t7k zL9p*vNeF~a#LkxwB#KA`PuGWXSlQWOK~{$ea)_UKb<fCObz1dcCZ@o8&@ff)u$) z$2$i9xc2$<57$Hl`5(hlM>{=qS1m9GF_si4pP2V#=q$`YY&FuHHWkd&#V;UHce8|q z1&Zx=0N#EvKX7k1w?1#vFXs=MsnJ(^{!EptuG3 z870^uW02I6@r&S7MfAKLuS^23gn!$%XH@a0&djDWb8oymOGC6e-&@#C0aK?l=luLn z{oG_=Py5F~XQUR}PEUby{ zmANw85i3cC%okXv=YF#!7H-V1;EtKh_IQYh z_{Ra+OMiN za5Ia`85t!rlX~~6Yq+kfDwXDn57Rs_!A-N8V8>W7Ms-T(Bg?3e?k`L^GNknhb}b}Y zwMR=`J*{xV-WC*z+V^`&(w%nA%dF*B#n_Xs?g;RVi$pdyq${xS@W`;R*wTsx`}-Sf zNEoXYi$0KUUZvzu+KaTC$XByyS$QlAO-%IK@8E3XQ9gITauqr=BHPO~)XtwHoofD6 z?H>p6`awZK43{glVA}|CNhx-}zuEOkBsSX$+hxi<3*A4G%mGOfGQusUq~;OP{3w=p zhTv0pc=*d#uUt+UkB+WE;)ZRP4*@MnCG%5>78QLAJzd1gVAik}xTIH|7D|G^c3L{R zIxO~HLl{?!r;l2Sf`yV&uqk&q+GajwV}9+YPIeM3dvS5WM0o(I(n?YgQeurhe()Ej#h*n9mlGkx)i3YCGJsH~}3oZ z?1@lKUlI-5mjD^kNB5=5-zE+69AND{!$1&qTB{&@sBGcI9=)UYMobJUV=6v-c2BG| zS>8xoQv9lm&G6 zYq+jk*h1Ng@2$?jlZQ6kkc%pl{tx%lyr0h-q=Wz*ZscQ4x?JN-if52Z#^`JR+}8&G zGP?Hr;9sb-ZuhJbK#}F@>ucG*v{Woa-u*uO7)S%MD@Rep_(jh_seOCqF3RnmicoRM zJq?R!WjiY@oKHpLj@<8Wbr$Ij)IpE`m%GJ`r7AaR^pvY7()m;yf=$8VrbmxL5v9ZS zPRD$0w=5Rbl%g9$C3@{t{#@!TvE+gwZ2wiA|s zY-5m?*kqG`J{j~|f13x-$}mm0mZr_#Y8FcRBN|5wO?2xjWp`>}oXT{? zuQb}a0Za(q{%BX8f5J&-BR?OdTCAfOf770=T(BR#xETt&@zVwu94+3)_GH(0zZCh} zxCxIsL|dfs5=#DVkT`W;F6ZSd@)XT7^!e3`KJc51d^Q_N_#(F%z-Iv-A7NNOs;gD1 z<^-rpwmpG(7?tUP7P3(~}EAEv$D-@Vh z78MtNH{_fee|Z-?3Db}~=4~GdtJs!W3HJ%(Uym}&E~Y~YHA-HzWVBPh=H5=NR4*aQ zty;&O7&Z8Tko}Zn%EP@WJxp+d`(7E+R@uSA?I@GrA<0q zQg)9KiTj6fn=xMiTT!<`-0?Ah8lW$k;~(@;kPRP?@>g0~8$C?c^u;T`F1^Y43f zZ}Ts$t3_uHBn=LFzO~;tgm-i!6`)b_t^4jBP8)9^Vig%vo&lRzhj(_{VqBat=I1k@ zXM+M&&h70AMn076s81$oD^`@i<04cTpXQ(NjOr_bwdwUWP!>8|TuKTXAmb}rbMFY3 zag98vSutNeU!@d4s{?xVtbY;u0Ctg%1#RES7l+nCV|hdY`HYr=<|R_dY)i*8%E@{3 z-LFkfWDkek77+K>#i*X=)lP}JxK=nO+VBXHB?JaXW!NdDkBOpCmx8av85R2IgL0u@ z_h3HYS~~Tt3XP?+W*>vtmZ2fP`BhZRH=Tc1Uc7&A3wAQmP>3D?y_KWYAj4urtw(Hk zR9+FI9$~X@3LqjtJsy!9@b}MgCFIDzeJF_yM@@{2yu5lMqYwF=n27ZKjJr=>{x_<# B+Gzj) literal 0 HcmV?d00001 diff --git a/docs/guides/network-time.md b/docs/guides/network-time.md new file mode 100644 index 0000000..cab1f29 --- /dev/null +++ b/docs/guides/network-time.md @@ -0,0 +1,152 @@ +# NetworkTime + +Tracks shared network time between players, and provides an event loop for +synchronized game updates. + +A separate timer is provided for network ticks, making the network game +update rate independent from rendering or physics frames. + +## Network tick loop + +*NetworkTime* provides its own independent event loop by exposing signals. This +makes networked game logic independent of current FPS, and makes it run at a +consistent rate. Connect handlers to *NetworkTime*'s signals to implement +networked game logic. + +During each frame, *NetworkTime* checks how much time has elapsed since the +last tick loop. When more time has elapsed than a single tick's duration, the +*network tick loop* will run: + +![Network tick loop](../assets/network-tick-loop.svg) + +The tick loop will run as long as it catches up on ticks to run. Every loop is +limited to run at most `max_ticks_per_frame` ticks to avoid overwhelming the +CPU. + +To tie the network tick loop to Godot's physics process, enable +`sync_to_physics`. This will result in the tick loop running a single tick in +every physics update. + +To move your game logic to the network tick loop, use the *on_tick* event: + +```gdscript +extends Node3D + +@export var speed = 4.0 + +func _ready(): + NetworkTime.on_tick.connect(_tick) + +func _tick(delta, tick): + # Move forward + position += basis.z * delta * speed +``` + +> By convention, *on_tick* handlers are named *_tick*. + +## Starting and stopping + +By default, *NetworkTime* does not run the tick loop at all. This lets you +control when the network tick loop, and thus the game starts and stops. + +To start the tick loop, call the `NetworkTime.start()` coroutine. On servers, +this will start the tick loop and return immediately. On clients, it will first +synchronize the time to the server, start the network tick loop, and only then +return. Use this when starting the game. + +> Starting the tick loop before starting multiplayer is not supported. + +To stop the tick loop, call `NetworkTime.stop()`. This will immediately stop +the tick loop and return. Use this when the player leaves a game. + +To get notified when a client successfully syncs their time and starts the tick +loop, use the `NetworkTime.after_client_sync(peer_id)` signal. This is fired +once per client, and only on the server. + +## Time synchronization + +*NetworkTime* runs a time synchronization loop on clients, in the background. +Synchronizing time makes sure that all players have a shared idea of time and +can exchange timing-related data. + +The synchronization itself is handled by [NetworkTimeSynchronizer]. + +*NetworkTime* provides different kinds of time, each for different use cases. +Each time can be accessed as ticks or seconds. Both advance after every network +tick. + +### Local time + +* `NetworkTime.local_time` +* `NetworkTime.local_ticks` + +Marks the current time in reference to the local machine. Starts at zero when +the network tick loop starts. + +Useful for logic that is tied to the tick loop, but is not synchronized over +the network. A good example is visual effects. + +Not suitable for synchronizing data, as the local time is different at each +player. + +### Remote time + +* `NetworkTime.remote_ticks` +* `NetwokrTime.remote_time` +* `NetworkTime.remote_rtt` + +Marks the current *estimated* time of the server. This is a regularly updated +estimate. + +Note that on each update, the remote time may jump forwards or even backwards. + +The estimate is based on the measured roundtrip time ( *remote_rtt* ) and the +assumption that the latency is exactly half of that. + +Can be used as a base for comparisons ( e.g. latency ), but *not recommended* +for tying game logic to it. + +To get notified when a time synchronization happens and the remote time is +updated, use the `NetworkTime.after_sync` signal. + +### Time + +* `NetworkTime.time` +* `NetworkTime.ticks` + +Marks the current network game time. On start, this time is set to the +estimated remote time. + +The game time is only adjusted if it is too far off from the remote time, +making it a good, consistent source of time. + +Can be used when timing data needs to be shared between players, and for game +logic that is synchronized over the network. + +## Settings + +Settings are found in the Project Settings, under Netfox > Time: + +![NetworkTime Settings](../assets/network-time-settings.png) + +*Tickrate* specifies the number of ticks every second in the network tick loop. + +*Max Ticks Per Frame* sets the maximum number of frames to simulate per tick loop. Used to avoid freezing the game under load. + +*Recalibrate Threshold* is the largest allowed time discrepancy in seconds. If +the difference between the remote time and game time is larger than this +setting, the game time will be reset to the remote time. + +*Sync Interval* is the resting time between time synchronizations. Note that +the synchronization itself may take multiple seconds, so overall there will be +more time between two synchronization runs than just the interval. + +*Sync Samples* is the number of measurements to take for estimating roundtrip +time. + +*Sync Sample Interval* is the resting time between roundtrip measurements. + +*Sync to Physics* ties the network tick loop to the physics process when +enabled. + +[NetworkTimeSynchronizer]: guides/network-time-synchronizer diff --git a/docs/tutorials/ticking-in-sync.md b/docs/tutorials/ticking-in-sync.md index 8fd7a7b..2b56571 100644 --- a/docs/tutorials/ticking-in-sync.md +++ b/docs/tutorials/ticking-in-sync.md @@ -8,6 +8,7 @@ `_process` or `_physics_process` * Use `NetworkTime.time` or `NetworkTime.tick` for current game time in seconds or ticks respectively +* For more in-depth explanations, see [NetworkTime] ## The challenge @@ -154,3 +155,5 @@ NetworkTime also provides various methods and properties regarding time: Actual tickrate is controlled by project settings, and cannot be changed at runtime. The settings themselves are under *Netfox/Time*. + +[NetworkTime]: ../guides/network-time.md diff --git a/mkdocs.yml b/mkdocs.yml index cd26c45..46bce3b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,8 +1,9 @@ site_name: netfox theme: readthedocs nav: - - Home: - - netfox: 'index.md' + - 'index.md' - Tutorials: - 'tutorials/ticking-in-sync.md' - 'tutorials/rollback.md' + - Guides: + - 'guides/network-time.md'