From 48a08f4b7478d3b928afaaf22cf2f8e415608fa9 Mon Sep 17 00:00:00 2001 From: Hawke Date: Fri, 31 Oct 2025 22:33:42 -0500 Subject: [PATCH] =?UTF-8?q?Add=20Alina=E2=80=99s=20Map=20Mod=201.7.25304.4?= =?UTF-8?q?36=20https://rmh.alinanova.dev/mod/cba5981c-8e8e-4b01-918c-214f?= =?UTF-8?q?a155adff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AlinasMapMod/AlinasMapMod.dll | Bin 0 -> 176640 bytes AlinasMapMod/AlinasMapMod.json | 636 +++++++++++++++++++ AlinasMapMod/Definition.json | 22 + AlinasMapMod/mapeditor_integration.md | 8 + AlinasMapMod/paxstations.md | 36 ++ AlinasMapMod/progressions.md | 88 +++ AlinasMapMod/splineys.md | 158 +++++ AlinasMapMod/validation_framework.md | 861 ++++++++++++++++++++++++++ 8 files changed, 1809 insertions(+) create mode 100644 AlinasMapMod/AlinasMapMod.dll create mode 100644 AlinasMapMod/AlinasMapMod.json create mode 100644 AlinasMapMod/Definition.json create mode 100644 AlinasMapMod/mapeditor_integration.md create mode 100644 AlinasMapMod/paxstations.md create mode 100644 AlinasMapMod/progressions.md create mode 100644 AlinasMapMod/splineys.md create mode 100644 AlinasMapMod/validation_framework.md diff --git a/AlinasMapMod/AlinasMapMod.dll b/AlinasMapMod/AlinasMapMod.dll new file mode 100644 index 0000000000000000000000000000000000000000..8e8434c5875da9d73dd966290dac2933d6a4c3fb GIT binary patch literal 176640 zcmdSC378yJ_5WQ{-BaDuGn1reCNo)pgg}R)dnW9V1ck8g`yvFCT?hdxR1=UiJ&bHB zghdn=6om*bC>%K|ey=PjBSpLSLRqjXiuP1arO@a=BomdA;*D}U0> z_d2~j$35@J`#QW1!=m38eD5ujlaJT%+Qbh_o>wTp$-VudtH0%W9i_p{2kVH;mKP@Y z%-Wx*(Mlx++478-Fw4q?!ScM-IrIzXO7w%->K42sXq8ennndQ8!YzfF)&yq=%tWAr zGCGwNaIqf}OQkf@GuID?6@XYOLSxicbf?hU`e8SrqsKZBv7`IQL_g5ijCiW)HB>IR ze}mFd|ArK7V+9*gj0Dq1CYqc!;D=KXV`~b_G5n7(^~y&nJ!LEbv}<3rgx{eaZU~5{AZ%xZtt!cTaB`pgtBaW8jEL_R=d{Rf@mCD)Ml%VLxD4wM9r+`TU6XMs6 zXeoZ!5nDn&zIMp$dEZ82I1Ay4nOvX*zv-*sH(Luov8{66Q>c!)iq)TGyr2+d>(5cb zCU?Y7W7^3bEg93@*AXtnilvcYZrs`7EepnjpA)9KGsuBHe|+j*o;NcezD|~YJ&(Ca zQAv~(%T49?L{gsEkQ9}%h7^^FiKINaUMc0>Gtn+6HKM{+!8YaV-8+*gr&fT%LX8Zn zyTTYP;!*xkD>>Q?RKl(r8&R?f;qKzQruw~RzL_X%7yOV`B8aNc=2EFtSFgg}`m0`y zz9m2G6~kE$9s&;E2^_@^F};B}&mpYPsG3CQJA@flCW+2zLCDh4GKWyTi7s;RY{8=r zRt<_)0GH7#>)mTwp%=BACZvlD_QQrk;hst_84PKrks7MClGHM^6q#`EW+>%hVmqnZ zN>Z!ghtf0Lrx^f4ftALsShXX5DBYV_wYy|R5REA{>Bn0wY2M7OJG~E(HlH%y8PN+C z3afd}w5}!-?x!RTg!}UvF2y4xEfep?v&j=304+R_hihYkl?tAX4g%BXjSuQ8T0)Z6 zEbR8fgT>5vqY$4US-I#?;E2Ah5`W%=KgrW!O=hloI1DSwUWbig4)Z3T=q+R%;;-`K zU&3lVK>~JCGZRp)zaJh!P<0<9$242xIdK@dn%<5vj zsvpHt(QyWTstMlI1V7OP?@7Vvcm)`W-pH#wPd!)=zDY2hR9>AF?=HR7of+WDKRVc- zU%iJQ^@0*oJ%NCAiZaRjvl2})2h90^)DOVT1TqjH(I>*|hbQrrZ38t&)o)9b#cFko za%z9!$>KVN$LI@$EsYG#9eo~PJa~#^R8NIa8WSZXY=zoSE<3a#Le#D(9o?{4It)-c zvflTTIQ(!g-wR?M%c`d;Bf@)`$9KHj{R}&sY5o~@)pQtA9AaN{H zz;k(&NtgQm0p1zvj44PtpIWC-1{#c2%4)~rM*8Ok?^?Bi2_)r&dA@68A z#6^q@3O(~bDY75d_~`A+gctGd&${9oJ%m2Pm0~v91OCxJw5#;2RKftLBuY5hEUW?- zeS>f`M`OFro0bH|qzB8S;&0`A0OUv`hCjB)@T+DFqF6Xoy%-q__j~1)SJq6ThaIHy z%#8ZMJwYnRM4RMjv_sVQgqEp&RGPgNdVgo-_`c5Y5`jTq5MBxpO_D_}6Dn6J_2t6L z1?Kzm;S~VG{o&hq@%46IL(w~U&V}hp-Xo8pMs9qNdY-D$8D1sA2OxBg57LMvgmTCB zYI7^z{m*%mR8)LsF8}E4NZ?&Mwq2IOvpbf&!@(+7R7(5vYb!}ad;;|<0xGC+3BoC6 zc%#%)N>l_nH{pLM#m4;^Mx56Wav;2x=WsFMm<8S>mMO;tZ(GU{4QsLb8>~_Y{Q94X zHmF`lkorpk8Rq;}ne$Fz{sJbEvui4cVa{Q|lRMyiUYys%3H*ZKcL5KD@8;PU6V+1Y z-?cFR{#BT7OPOC3!wpXI9|XV0!G9F|USKPPJZ@ezG!VY8HNx*9WAsmG-qHa6TEUd0 z(wHdW`vEmz!wN1Xe-cBIl9vRpof0*SJp{Fe(Et!MJq}?22=dz@3|N!cZsTm4t0zf? zk<8r6)Ebp48}9@qsgZrkYjx1px2evnU8mFBXz+R>wZ+R>vC9sM0hW9*<} z;b-gA{H*U=A<0H}LXtCpIepsuTWpJGjaOf$u$KJ#zu_-s>f^l1SB8`WhOa2*Ix13h zq*8RZ(9@M78z+9>_dNRiqJ}06bhqmyN0;!3K4agX*7tMG?@GY;**p^Z1N!dFHNH;= zj6ars7ZRzRd9eHNuu$EZ+PzZZvwD1vN28beJRj<%zQDUb3-Cn&oyE=tG{uZ%;}0NX zW^^Ce=u096K{4pdMPCLUKGUzs${St%Z7VbJC*fUH8Y*U2m8QiH*vIr@u&Oj8{+@lz zEap~)Uy&%awTbXzt~th@+%YYc_0xu|@P3%-rM}9mrI%vx)98sTabJ_*2YB@7=O5WY zADj;#)K^zuSNM>C0>IY=bQil9s6{Szt79!h4-45dKchfB;s5BXx34$+rhrKR-x4sn zIC;U-vdQG=5xyhRTs zi(kcZeXW*rL0Zi>&}zQ^;y|<-nUgyj8Sp}4w1UL^Ey;jMlF-|wteIKtTjk6-CHy`? z7w+yl_9^3oal@RL;4#tuG;RZep7Ft`Ny~>n5bb71%a0G9)u5@Z+l`Ku;_Wdi@yIrB zXG}_)Y=6RkgKtdkUCBo){yOl3{Qu}$_~XEx&i@Bn@bg?f(}1wNt-%@1nXNTYO}DPX z0GbEYcS9HeLbcuy20ZNYA#QXPuI~FaH3ZfGxX5-ue$;1Gm^vI-8VZz!a0WQqz=JVL zycss0wR!YI;O+#qgF`(Isx*?FJ5ULN=tq1k-;)~ClN$(s%*Sw0{RyuX)t`#3dXnP$ z8DR8t9=(-qsFhCu^=ETw>&zHXF|LZ9P`;^;^1V~MU2bvNlKMLPNh=dXubZ@1pN6>*&LqX%gFW-_0$ueP z^7nS-@;BDA9bUGprf0Mf9R2CX#`@^gyt`6+76D!3L54upUjfVARG~$gnO6D(tdtHp zIkn%wqJn&aVW%h3e{0wo@oB=k*5o-*bAxyZm}0i}yd+!Kmf)EoE-QA{URWD{1NbDW z->psiVw3iJXy!l+Uj&L0p}&G5?kF@Q`~ljiPx5W}(*ZCZFm(v3e}qsP6D6EYa>JMS zZc{IZkYZ5#^V;~0!MDT^{Y5d*MzzM!p%`Aa7(@v-ohXKgQAJ^He(0EVM228@BNmIu@P4YCYHvj}Zs6!Y4 zg1YAr27sVwI)nirD2WbX00>H>Ll^*pa_JBTfS^b^gaIJPG>0%CN#9c5`pZPyVFEvV zGj%q+jxj;>PrezCodKf$F9)9~_}>nuxeV(6aqu~U#~r*(@GB0cDGutmOC{$#!IUOy zsqDHVabmrqAH4+vIk*a!(8$~%x>epTMpKMc)Xa2-cYrV_>NXUk>JxC|{;_e=TahtI z_4z7T%(Gsl>}X`~dEw@WaN36@!1ySIZj$F3SqX}ae45Bq`a-ycQKWhl0wy+DzCBsp zog3~Aa?zPY7rmVa>R!nU-zag;-mR|eOF(6uKcg<&Cq1Q13*xq9ESlapR%F;npts)%&3}C&pXRs) zRo-0DKolI}?F~e?LtF`>-s9kvf_oi&jo?WRzE1FDV9QG~)niES%6MyDzH6d{Be6Ok3OBR|kic9lg+rui>pOq~DD3`Xn8Q(f{c)x{5GGo$r(LF;Ox$y!G1 z&la=8lLE#D>(n&reb!?bV1KRzsfgYDKy%F6y2?xfsQ;!n=*} zs>Ri~;bOJuGr}2Y$BWe)y*6?$R!a4?iF?g*ui5Ukse8?Fug%x}V> z*#-N-<xy0vH;ZLobPNo9D#d)UE1F5mvu1hxf9rY6Oi>0yZ}_Zj7E51L4e2Q)w0|MGIu2NySOU zp8DR3W>Qe!hqr5Ml9-8NU(wRI*35`;ze-1?6Kd07O5B)?G~|rL9OB5vRCG;${1w8r z8fgv1jfzrOc*TG4JQVW7^nx@#g(u41ZeJ%w{5`<`ZvH>Y|4IC(=aOMP8XCjX8h8vR z4Nt-Jmht}u{>zUb{`Bu;0EQplQvMGDr*aM=kmMi3yH(D0@cj||82DB>mq;%EuLF;& zjd*D-y|;q9i~j{+{mtAu=P{sBe8uWxcrQwWT5qb1GFWkQI>x5V8oM>8+aDX3#zYxq z+|)|$5%~ZkixTdPh&oMH7ICkWIMUV1-z)xuj9-*d23f7-Ng^L?WKpz!P^qgH7c#C< zI|SPBqAEGJ{)OJ|oUP3E1o`k#g7jv(hH~LyK;hv$g8uB9zIgIvis2D_uJOzQ_+S{ymR9nK*s`|;M!u}d(CnduTM_S zTY)~7j*F!1_|#KKuRmCq#(rm=UO3BySE8(#hyc^*{oS7oIDgtwxAP3igRIj zl0W1E26YMZ<--kzyR-3LSUEZ#7C-!ag3>aTq1ZW>$%b!)7=8&FTgz&SHRFh@8jkDx zAy(f6oA$G?&btz(_%I1(gi;hQBg7oN_mn2XNPR~|vRDc-W_sY@+aTLRvs%CnuT zo!R`H#wQI(LJjXDB7*Ns@M%eKT+nBUf##}%;C!Cl_%wcvCC&lmY?k#H-KeY=tCOjg zg&=e8QbN{gHL}4)dR`R4tbX^Sq85hA$3b00>4F4q*U@?NfvS zAn5cRhXL19oFy!oJ1CSJR@KFycmp0DjnQW1wX~)qvsUZnR;|J+=;ivpO^-2g8LJG8 zaSP=uN6$+`CQG%2a1n_f6WVAER`NjOwmo>yBris({8_)xi_V90*k?mvW6`(UUw0NU z7+oNV7APOR1vp>6(H~{X>Y82Vu{81n%8Cmimc~R0cS9BQ)OhX9#JiEozzWC(KdSNS zuI!eJE&}Mu+s2@gp7<2XSy%^EnVZQ+qX3#2G7K*a_r|wC?6OfqB_A+Z7z3TN&UNJT zYYMqx+%a@lg(tM=>3qMv-a(69SEae)Iq0x4Iw;w@quOvWei@NLjSkOwFU!?S0ZVar zkv4%0EOh7mp$MB*M(Ge+lR8yNyv^HO%@!Ckm=z7_He-LT|lX~12?}sF(UMeeVvdRhaT?+LK zNhnv}4Oour1aR7J>uRvp!&U!O?=K;-`U`J>H+m0`(f9H&zyA9G#)J3stllWxm?$a? zmC+CCTYJA8&rRYvl?0W>M6s=2L*YT<{BS$x&EmX8xG_<*lwZ;2zDjv_Yek}u2>VN^ zpEhPkhlfHRV@i{)-U@Y0tqpq;NN)GJJ|h zA$*!Ai#nximIT)MD;;PixPwNDRGZ+&NY6X>m#K^8Jm~qTLKX6d#w+nXAG#J-)%-GvZI`UH;IFRNg~| zABulz?`iSB>^(i6J}5qC8{hLb#Wtf1%(H&M{P$;s3k%Kg$0iEkP&m0Dk@dN(-Fg^qvdf{0;zrR&V%m#P)X0I&0o=*Q{vXVO_K0 zc{|O277l+frJcO9YGT){3wG8taQ^>@7|TLdrx!9D^5)-TNSVtapAnLR2&dBSkjxvs z`LwJcWl)FI^lCnRC`eh=AsHZg^BDtzl!;rA`x#R9Zb5EuNEzQD8IF4MXBkpC;gAg9 zz4=Tukg05NNQ?btD8A*1Lp~tRrwpkKa>)CIRBIIeN+ovw_W=jPUmN@l;GqO&WaGsL zDA?oB!e@=)Rw2K%7LwtD7w<6C##yPytJlITjbAsdo#)v2_O&qk!~@gYd3K0L*TQTT z|79&qF}`>P&8RzHU@d>H;EG=meS&h46vf*CwST0;+Z~PPq-8YvB>3o4JPMT_W-WIB z*=BLzJAp@DU=5hXJev7rw}i>FHiZVk_5D-4>07#Kt=b3rJ^KsH@W2QpmHRT4(KRZ2K zmo^q`QTmXL5~T|*`o}#RC+SN(%m4S2!qn(B+GzW=(_#Vrk<8Re$I#M=%;b+O%&kX! ztEFyUu(tGkd7kTx)OKo)z_i1S?+us{m$6OzQ71e0wEs|YplBE9Hk8!v`oB|U8>gT2 zk(_=~dFn79O-bcxU)h^}u&`oY3!H{$K4GV)TzC}(b)ifx?0vZUSk6`*!8d2R3qmPP^LyxtKFBIXi!4(IGTcEbuS7@uH|S-`DB*2 zeyfD+W>IK-W0kXfd&b0Bqc+^rB6EV%Mk;@dFznBrHOioB^)sp{sLojm6e$qR}_g+m3|zMpEKT=C(+zl*RtW zBfj4#S@f}$pe8vnF`Mo3G7A&g zg2M0xL3A|V&X4&9pi=w{fo=K6wLwlo;xo0n*wRRms!F#`K2&;EpGyO4^V9e*NMLIa zosl`MDmiA~U%(c*IJ*gF4w`n#S;=yCdZxMsM&$I)OW4(&*kN0-5GsO6qip=P(68zh zZ3;uu=8_8gOU~M8BVVk|h0X1DrFb^6JNYZ8N?E4bfw}LJQ#jiiy;0(uK~+Un45Ke9 zN7Ik{^r1bcHxV;xq-S9=-OZCOxd~3gO|m|IW7h>zsyhSev)y)6+1n z|MR>fyvZlK^DwjyDq&z&M)wa=QqQ&I4pXt=;mWpG! zY$6uRm#jy-W%bDAt`z{wHrDC}0z2mmqqK<;=|2kg2T#-Gb4Q=4H}NZgpb)m%fw>!>@>l4zGzIbmS>E< z-ZklC_O|%4-Wk00=U2aiE_E6Z)`;&HNF46>)z1=$Q_yE(;`eKZPf?) ztUe@V#Fg-Too~M;m1yq1!N-EPDk;v-*)xlU3C~=2yv~NI14xzCFE;A)fpCP3!3(BH z^dnSVUWMAdT2EK!7pFWqN56&MAqWPm-;}&>@$hT1SwJ&813jZhK)JlkdPuQ9msL~! znk*K58;+4KzqThI!%DUcorxX=-SYVzKGTB==b;0B&$B?86B1a-F*y7#kQFAsrfkYY z-vi;+h%X{`{KCc8kmSNdNp`y&(L#dzI?Tc&J+nFD;DxJ+rSdC3r`6%06n$S>JjP@A z`z}Lrrbp$Wmqv30j_;QlPlsOn0gw2b8%k05L)g+fu@mW-M>@#H$3fRA5M;Pt$KbZ# zp2E-jB8S%ch4$O)EBvuZQN6;*+OOY`!IZ{iY-;aJeYU-))~Rrk<;dX)PL{qJvO2w8 zJ3NokDr>>Y`sgP_(o7o#f~uX3|4kAD*TH>&f;EwSGtDB^ZD#_)pCYPfuy_8C(Kg?8 zV=4R@h<<0jApE&LaH@n)04(@4JcGDmI^+4XG47Kh<_7!ol@-NYF@K|0Ny9ZD8y=_= zoRh4-P%K=tWcqdo6$?W*hQCm-?qXqD0`~Ov7Q0yod{#Q;}N zP{gC4)!?EwC)QXhOw6!1x)rsZzb5XHNemkwk%@l|c5WG$%$5Y;Rd%n6glU{I zN{%pCEmn85F{fYOj&c(?DYmyyz5O8D`hJ6;`Zg^@Tog7G5b?JnZreg!1+mU>nc*vg zRZhJG)#u>R(0@_*ymXq}!N=^~!WZ}`-;TPIHf2OG9&AO(l$SdDJIHOU=qtVV=gqLX zSY43ly`#k*jwoX6kqv5kh9{AQW{ph{pIF0mTA1oI5WXmVsJLq9KZD%uBzI?%o2~C; zvh<9$05y_}-;AV6XM7f~?x1FrEuomxc;xk|lPD(#(lU5(AhmGGO+>K=J0rnX2sK&5N87P5+;uKVzw4^$#S9dd-|VJG^^Keh%-@n!BU( zNSHYfF&zEh_KM?=1TBq;q7$Z-=udq6HC(z)Ny_}DBz=vNajlYekffJPk|^ORO-cJA z$ysZw>g!>{fnO6Y`ZMhH`EUoh@n9DT_zRfuRDy=5@hAjreHp4NO}wN~vQVSYen=Y^ zlpkTHG#*g&8n$YdxcEHs!^LH-Tv8si*BtfikAipwOeTcV?#_rIkixz088JGwmr+m$ z%RZC_qW&}jZ9h>UO;D8rtJ;r`G zhpj5CYo5TFCOuBkOusu(VJY1xS;O_wAY%h2nviS)Oz&K&sEKt_cBSIwY|W(3bJubuKuVsPJ19=Rl=iF`1Ut&I2|O zfBbi1%EWUv!=OV{zQ`H$K)w@$Hf?Fsy&mP``DwOlXG|Q!TK*8St~`Y8l$N+_A{pGw9Olu9!3FI zdCYrEY`g^%+fu9c+5^SWqi70Z*deT;(TJZbXW|_Z78Svc?7N|K90;qs2`I7e2Nl*8 z*j80Q&NKZm0OHNC|8d)u>)XT+n4iZ zkzcrq*J?kU5f0jb(j4qVQv4#4TiXvB{E4!IhEnRVg`4NdVXsa0G04iqZ{iu!h^7_l z{E1>%b8PnpWXA6yT%xqboh=Pf7|L?9HubH4Oc39{b_83OCrDuBh+MNV9p0eT-i(Yktsk67XtPUn zW$pfn`n*ijZf;Ppzr&1du*uF=NQi5)4;Q$0k5M@y6OV~trFVmAx*pcHG_9FPXfsWW z-dyKdKgv}n>Qly(rwI4%tF|FWy-I)CsAj`6s>d{WSnyPzx=>S#Jhib=vWADMi<@k{ zU9RhWQ&(%(I~@8o={CHNdsh!_hR{|Y7e?EKTMR|~$G5QI-g0c2VrQ9lQ{$`4C(6g> zzCkyx52vYHIAKG@vu~ISyI3M}(+cPMZ*io$?A;!wBzuk4Ix3)IPA8`F(dnqGK7&tg zotP=C>3b*o;$vScPi!=l>|y2DE8OFQQY6|4kh!M9j|92Fai4{y!SO72e~c{IP;wTd zX%aLSui^t|%9jnN2rSCh!P$!~3A4BxL-Vx<0fQrrLBPgHT6Ykz30T^6?T3Gm_Gy=O z((CHkhQ|OB^k0ktq)jH8#j`s%a>NGg!_i<#ccXw^NK)%4;4Hq^t;84SYzOMd1?!6L z$+ygY@~Lym#i7nm(a`y2)bU-1a7}01i&}EjU8O7^-E+@R32PId7AZllIv39R7Cbo4$}@-mZcE-VbPF}PX;3#VZZs*@N0QjhQR<{#wOq6h`ra5Qn@d-)a->+^D zx-NYZKY`*4JiJZbBH3wATyC-xuI6lzspC(}vI_w>PB!S&*`=%>)C^fOTumqvwwFA0 zJ1E8r6wj4Ochw!AFS|a$%I=EnNO%0H#+T)fZ$4b@&2c9k3#mV0l3OCr+B$co+-Ymf zKa`nQBTCEV=5}D)W*@zKa)J_t@D8eOcX}_9p52hEmC@yBw4TM&N!e&e6kpHUY2nFR z5Z7%Sx%gSsaOEOdfjt}ZHp=#nTe-4r1;-dPu5?adSHPX?ccvSKy8@o8J}C?JSPc32 zRAj6ZL;R_BtjTmoP?I%fs|V&!@w@{L@J$%Va5p;n7g06gSdJEozQaT&i~&sm0Lb{rph~0^|r**^0}*`EQTYWg@xDW#hH_|Y`CkWeIIGr@xiaONK?xb zlw}LwJJj2H%6`5-Ha{vRM}aC7_||*@urQ~ombNqt7$9Uu7z+92*b0& zlImqmTr9@!$!l(IxvX=W9_5yhY++~*xp_0Bue+_dNTem?P`Hd_(fI5QrMeG~@LUl1 zwtVj-bY&Hcd{YA+--$`A5ij6<-51W`e)e?j2cVnT2Fm7o=G>|=e?4VZJL8yh6EVxP z>Due8+D`3VEOO*IMu(&|c?3z#^d-%OHf;2HT#fUfa$tXSuu~Oo)A-_yjxkkA?x2NE zQXils(Wd#@u@`LXB_S7RhPZxSr#*Wu8 ze3f545Fz!0c({%r@ow$7O=AFcFtqZ)ID>g-s)z854i$S7ci05D!`F`^4LWCX4R5l) zh?9ov&2FLmP4U?tp(vvd^3~?obt*(hKX2ZiNT#WXU*3f+bpz3{Xroc5=1eB4{ARy3{dI{?dTWjh$dwo^ zCJfsLGd5RoUpib@Jr2D4gj18K#)oE0jStO<8Xua+xDN?@W8(`6$4lHB6&KP6t8daL z_f^{GQ2S@LdZMVN*c^W_I!SCK=tLDatw9(7f~x5d27ov@MHuiSKYTwbWTKN1FwCAp z_jL+iR`*BzY`GQbT9JbjRMyp{Qx!Rbozr+*#EJQc?UXb&13;XbA`Ae*GNV(_05=|^ zEzuqH>_5~zbL4e?cq{MGy%_!2(&?T6!?V26y7Lp#XQ z92kRW{L?<)@`tnjH6yr3e2zp^UdQcLT)VMNGH=bb74oiT0ds}Ct68?v3zxRNUsv4> z)s}f^-0Y1`YvVzK+rEcgaI_I4=Wn-v(uv+@@TCoBM*V|Yc%B9 z?YiSri6mSqc`Uw)QWqh<3$**z#X;PAw4FMt=fO^VZHOpt^LnzK{47My@w|KY@WTg? zy7ahY1ADSVbU=M)x@nqi>(@T`^8K)<+so$>TPsxj~?(T8V~6yf`?;G(f1eRvM+VZ_6B z*!x}aG$ai=pT~l9bBp^?g^s^Xl^h3qr3$Cc)=Eq4}a(fN%lwwT(%yFPv1L8?a=|r9B^;V?K*W0gQkLv>oxh)i=8!w~@(4?igLRd2Dc)J58Qp{#4G|i4N8Ii=~X!{v)uHDl$VKS8ojfLEG#Q27sUzI)niT z`KhHy`H(gL{~@F){-~9m#~}II?8oy*Ji}4+w7aaS0gaz#8B>O0QjO-4(qB z3EbC+7Tp7C(|4xyk3l&$*Q*xk0 z6+Nga8CI#Ix9YpjQ8hc+kXoG9!P(P*{gZ7v`bfH*{r&I~Le^|4w*j=+UU7tl=W?rLWy_iSO{5@b{Mm5GqZ>}qP zD{r+H3o77g6tqP>x(uOletQyq2nJm^#YoZRVEa4$niP$Xf!f8qYB`(To3^)`3HmhO zIv0F&C65%=MQ;4 zw}C75PmbO$rpb0aOTaG6ckmfrDO}gm@G5<*tNqdbR9q=iyXH4PH?6EY0>p!n$|y597-~~CDqZpL>%JI-gg@?J-UJSL|L(e%ZkAy zE2fYYQ;JhCyNdfRb#CvZ3cZKG3-A7SdS(A(jTuzg+s%9k?*5visXfd1KZ!D`zt6dL z**Ph8Atra2fT1JX(#C^ds%pO%(a{yE+Gjex^HaW2TAgh4KIp3R8gIRiH$#S^V_XGe zvM%)jN$gZ>Sh4H$9Rsa~i;;C`+U4jZQlv5Vfw}ymn#s9Q#HNJKr%}&brHAVqhTOg@^m?+f0txznkE&M#n9xl5uWXN8# zP-Y5GMnEaLSsF8cbaR#i0mg&F)Pvswp)@8+_zoE-h&}?QJ6FAx7gOxpcr`RGIE_aS zZWna81YJnmRvHsUKd0c%|Bp$JH3Q8nm6}&Tn2Li=(Iw$WiRDJ;lk*ux?0v1f6GAiY zH@rW+A0p#XU^q3yIJ?H^AR8BUO!C!zJM+4u1$H|RiMa|@k^>vta`Pr%CGun0Zqdhx zQQ5j{^l=~#1TbYT#IunYegeda(d|6TGpe8DwIa}#r5DJVy3Fr~S0kq`6_SzFJoS_n zOKq95PHq%N85d;Z?NbdK-PlWOmv!T7mi3DX)>77U-X~G=NYd=evvHr1N_FMAGh#@n z%aL=@DU|HqK|F&|S26o;+=3EE9k$Yam^!0o@ys6 z%6&0QOF?hi#hLsoUGYCUWPo28ldi5JD2$5gC3>HnVH>rUou_o*8xV?Z1OSz-C-j}ErsEY{Mr~Hp=I9HGGXb?#h1ZtNA%oyzj+|J^?PgN zFiDU$#>-S*?z`MjbUiV$N$YyW*`n=KsNr3x>oUevamomN! zIsMtyA8HI8e+FZ6@Xs!_U__`9WMZ9Xp>orO9p*^l)hNpMuTCu#R*2&(vdlMg?vtdbhN;10eGo2SB3FLW@49hfN|MA-ru*7@ou(dTvjt z9aC&QzOn7sl69aPB(b0)B}GON`5T9#FCeMG$|;ga!xz{A9iNYQ1zd>osnA8hk7o7am(G%4y#~P|x)V+=&x}UhDg`{<%#Zm2AU+2tKG5rc+`AAJ>>0b3Bdrj#CEn=gy(`E5@(M z%I`= zy3>70TFVmH|A&8bPnQBH%c9*-*%IqVCy-0PITrB=3TR700@TV4q*TYM!pVV00@Sl4q*U@D^r9445G1r z)_V^7A7f?t8^jf#hoUry4+GB)xYr;E{|7MKm>kSR#&NwkIvht1j$HUnam;LT+$j#< zapd_ut-N|eH;N5sHQ62(TgI_LvdssM={HdY0rQ#!|-!#jFT)t^oXM0 zj8J~KCC|BQHjB2D4L9qV@NS9`d>#^)}j!j$U<|aj5+zsgxc3a3kco zU!eRpk+c}V4`+z94|y52kd$(Mp;Dwr3D8PXYWbPUi9#uv{8lBT=sQYFLu&cH##pxk zwe?r~l)U)xofS}>yMC;yQa*VC_M1c?W%9qVVC5Z4UMJ%|4Go4OMmkJYlD#0yT?^{h zzAr`Oz8OAwR#)0t-$;D;8XS*yWPHsK^v+^e@9e)$95YkIM)8h@*fXlzg9wd2w)w)a8`G! z@FI(SDA)KQl2Z-QqVTOwVea*P0Tnc!c*1Gil^`}rlA!TKf|^xmNd;w%L%A*;L)JfJ zb)M2&jGe>B(WhbCIYInuWINl$JHDQxthJozM=(*j^dh|KBn~6B)8vy1^hoEE7lK$b zOTR&A#X7rov3~Lx7+S5k3X?P<#z{3S`yN0Hm5#yG@jbk+6BjQ;m6l@UKwBjl>TbIv zs5J(yjOYi(Duv2viJU8u6WCajO&UL7A3Vd3stLd-T2^CWPzhR4Vb)nD)`1@))&axF~#X$Py0*Pj9I?{vZGFMr8r zWrv0|HmwEKXTgOZL+w`!@1*C3r?-@e5%wFYfF!p>YqsRFA&7nroSt9c{?*CetlMcX zwJM;o$zIlCQu0>sui`gXmO4b5s+1YM!VH;QHd zjMY+?oi?-)N`_3DO$~j7l1Y;G_tj9%ar?aHPMR|J=ymG%?JDIfUH9vDY#*b+iuKUZ zVn8NFQYT&i&^`-R*SzCZpPz#=dURTHaC1;{-l&qJHmWoxif);&gjlKKSDy!4h+g2? zU75y?iQfTnyJPfw-Xl5s#TNm<|3Tlsa62h}-S7kYWw!@qXRmZ(x__wK?!11Z+J;Q^ zj|9_iM@`Wd%t2jWG>y#3t<-b19xg}z1l#HtsjlHmK44TXNyuF%@C|I0-GnTdtk`W zNAz#qZMPDhFi|;BflpSw{zTx!brEKXVcl#?bK~`GxzQ{h4OyW|krfY`qSg}g>KW9Y zW4IcSow240{6qsHn3zL*dlMM$koA< zliS8xE-k84*s|rv*4m?H9cU95b`gU+k{uQR-Hw~RlbbT$Knh%$O))1mFb|J*!*AR9 z6TPPo>F#azw_S^-Z2i&=*_API8LQf^J;+e*%!rWUezJw}gfp~j261m!%5SPtnrZv$ zii;Xe+t-VbM%%}v;W{NvUPJ+YxLjgE6(mCNv4kRx~z@#kja zj}e7mL*I5UqIk@UsKE-;i#-S}?(C7Bktog0@p4`M$JU3%N0 z%kgAr8|1>>iGVS}cD!s6wuf8E<+;i?osW*{G&K)nKKcTt>g`ITnkIS5KlX z#M1R+X$Xe~^%H;EVS2J!$UZ53KL`~gl?U^-8PF`Q&XYEgx9vF;GyhKNlpB1{L8R^+(6ZH~0HzS2;sx6P5-y>03f=neH-)5Yp3mZog|IMU=U-E}@MCRO;n zgnjKkFNJCGdFfL=uTy29FRO$33Xjz1#m>U4emXTNO-+}V2)Mj7ahcHNC3>QnneBKC zW8S#b2`n=e&F`>`Pno>WS zs+3c>6iYPN`Z1&rtK+ys{(tH7QkFTNmlEqo493jo^&obvtKmq-{MJ`k(^Yrxy22pa@eWynf*<_nl6x$Wc)9cifP!EZHKhwD}M*N zI-PIrig=|-JaaALv^cYSBjnO{qV;824^O)Naj9`CCz^rew1453jGQaGvja&RNrz^P z8{}+6zX4A3#;diwK5Z=x0P(IAVSwzD^TyElG__YObguvBUP?2nI4R)yD6<~jdV zdjg6v(Ngt~E%y3-3&wX`R9c7+O6!mn;zGa=UY!OixeR-bibC}fnhE?7oAJ?D_|d9J zPzvH3+QP3>v2gX~ZEMktHQ(OqB2&WVa0l>>P#+C|9`@DW!7Sr0`^L!s?#Y!m4V>lb=WAY3*~y z+nscuuC}hM82yl;3_lSlc-E9?Snr`|gcn26@nE%*F^{ikD;_LeGho$K=-&dL$lDTm zXQ*t~Zlln*{LUX!fDV4=Pgs8E?|(?tI=}O`cDNlV1?O!b+)>20MEaja(luT_nRK)B z_!M5wMvTYKmRT-TTYDw(f;dNrTQo}iCWzrdr>!|N{LyWd!0mXHnW(Zb!v+aUr@_(o zBC!94^cMW;4t&`Uh56MT1>!ffttB7Vn;Qp8;>y(Rla}HWLhB5Q0U&Nq5e9(xWQs5V z#HUh(0p};}o~Q{ZeA2jFzdkA#F5>-k`PA|o$|0^&4Cjsz;Skbsl5jJuk~SoFfUq`a zt=~{?_U-OBl;6N?v$_*T7z|IsvZJS^Me|gE@!;IlVr7D6FvyNLS< z5XyJl&=A6>^+_h;BXap}00_Ka4q*U@Pp1e2=tFizTwUx*o(kW{=JimC67x}EUl%FAEsp{BO6ovToW=?#^asmf;5Qc!*7Uy{oeiwK+3gUCc*-|1- zPfNs`twfyHED@p@d-y%Vj-JuZxLk~jut#Z36vw#Q;>OR+oxy-}UEI-buyt1ka?$Pp zauln0yC2+6e){Rzwx51-rH8hOIl1qB!khiAbbp`w{in0ccFknX3OBYwq=+d*?B!M= zT2A-XQQwmf%A4#_-^;-YILesXb$u?~=PNmTLobbq5`G``!^e2k_W?=9X`L}0qf@$s z9cAd<_(MG& z=i$!mg->Zu%)2OZ^gK9)gX)2>MhEejyROtfy_(b?N$QVH>cJBS#W_E*LTd+AoswTQ z;(a#dVt~`AThPGMdiGH$;u|RMb}xW^+O_&Y^b?}y$8O!WyiEOCjOFvYV@mbr1j^*1 zLx6KVYc`pit{?}2-CyYF(V^0Md`3Q9L-M_Y4)HcAQsBs5PlySkR-&O|4|U3zkACcX_@x|`y9Gx4X> zkKz5>4j#HI731faS-Kk)s&>__U5OJ_C}4$T0vQ4m^dgsVkP`JkI}Q! zcKIxTaV{63ojMAoN@Jo#96hk>oUKh~AY^}37Z$F9`Wqkuv&ItCSwR&nW$VW}Sg~t4 zwJ^HWBI%zyFdjTkqgXu-WNA#;@Chk#j?wwmHK#;PN*r%IqJ&RM+ciAuZ2&`Q;HJ8VKK`s6~N+omh_HDPv&a3x@ZKK@=EHOc|~*h8{@ayF?cO`bq6{-2Dk% z1n4KH^rtQS6zBut`y@aV7}z@QG;j>Kyi*2IU^q2pc*Z2)jD+F+k|2t;Gf(=?-t>bq zb=U#bC4Tr2a7ycF)NZ@*F`=}F^`E7{*t)EjER+DOss&>bKAp> zD%_hboGAKHPS=~e47*t5(~T^OeyOXXr9SoGDi~UP6Rd)vMKDsKoV4f!j8@y_jY-}a z5K3dB=!ZR9qkF5!u6&51UlFT>EPWwX*=J$}j4p2vcZtGj8dVw-W%T@Z@}(kcQdJrg zML$AT30Vw7ta9DN3K+ehJ=|qYv7(H=rJa0vQ>-XXEbBIiRar5y0!GoSHI-K=+!6?- zF;PZWw3FW^GGZW$68=Wo7EP>5n28lIT5AvY_NG`-MlWh7zoRKu6epJ69&J@FO{{=X zj>xuZd!@pi386G5%IIi2`6`i@8d(%=SgVBi$u)$F&H_(ccs4J}eMaXq^xLJyebS-Np!@y+ozczOT zA%`#vc6KLczo(QQ^yrR1(g^IvaBm>;b$(;XjVssl8%sUhKsHt8KbGLV>-(vte3z|H zvSB7hrEoLlTwVu13weH&eBH69F+?1U*4UF92i=;b?>+rXH}?EcGM4-t^}S^j>Vi=^ z3ob0%d0QE6DEdz2!Ym%NXpF`R@`5(ztD3_v!{#la*bS->*YR*eQ8qIH+wVnXqN7N8 zW1C(NOVgscpN?V{eZ3e}5`FtEqq@oy0U*AfA`Ae* z%+Hl~10GCRUw7 z7%XGI6QL?aePX)WI`-L)fOKEpo`AGy`|_eiyNI-L^%iwK>)nVBF*>k$LFH$Kl&Hk)YN-Kr zv%#zma}RF@yoGqmnaIks2YVFy$j?)K5pEUdkcrpLSZs&p?~r~Up^Rkk~qh%+^rAY=PS!#@yD zCi){!T(qN?wdcmWlpB{4UujH~(aYP(?-uzoBa0ILNh!ti$;rdeY-kZhm%}l)WfH2+ z=n8NYPuW&g3`egk+y;R7W{NNX1U^8=VE~9nQiK5@@C7;!13)~QA`AfWofKh!<|XO_ z^_Nsa#h!qQH<`{TM!)(tRIMwn1glsQQ1TN{lKBm5B}?*;bK?J>kdO7=p=hjbT#&}& zuRgoIZomH3>bA{mULwa_U#Z%=R?uBvYfz^{hz{qeO|}wk1z6XuH3~4>>aIdze#}B8 zSnDZS@3BO0<}^~Yz7h(sVy<5;I8(cZm(4={jIMsT8>E5o1~G^N!?h{HFN^`d77R8` z5d{Xigw}b?K1~KuV4$mMWxxZLN)QEo_5d^bwzTkH0l;<&6@EGn>V_!cUsU*C=23qa zNZJeeFsK&xM<1r7g}WdKSV;>PIasL}Wv$N*^PKGWHS3)yqwi=ZzhC5c6RtESO88er zy}J{q$Vabi=f6?>m<)bVbU>;S?&jVPf_Z}xWL zWYN*9+xc&5iW6n@ns)Msn&L!p;`VjoWdG4?+xb7-6er5)b?xMvo8m-q;&30TQBo_M zsi{Op6p(cqC8n-wlvF&`D1Dc@Y|AhPfcRdDFaX5r6kz~}@23a@T)&I8T^aCKpVMA9 znQl(p?^@mbJGqqjIG;{^oT{a331PPPnuJUc^oUmr`n(FrKP>)bveUY;9`#y-x-oKu z1(wq`tnCZ^AG)J;e4+m&;uc@%Td^tKFw58lJ4Q;+%mjX7UuelXwi~7MguYO<$$KUF z;d)y(nJOui+jbA8CD5>2)6vofD6{kk43PeeQIho^`~m-q^&hq6_{cOybL&4W@|=XE;oS$jE87L}FUjZl zWgfZa-6pnzHyF}m(yWU)_wI;3q%t=*bPT_*Whl-*Kj?={uqCOdA!+j746I&7l9=;} zB-`Wd!na7;+7D^Hg5fZTw?I(!gBXs*1E$qM^(Nr(LqZr&^e-vI1v$!VHeiz9YTC*3 zz{6kW(eJkVr!xx}I54=D77K8RCg3$oy1D=I!^rK)4B5LkpPRR#U)P9tLp^7)meeMf z<39y$oqM&rrqA2puiwnshduGmcrU7~-bva@@rS^!BhH-P_!3=dF@WOpqZDBPh##j2 z13>&FMHm2rvf*SH00P&jLl^+!=PAMf5V$NIhXEk4w?h~J0$-&=7-04ABrLAKWDqBf z{aKUiQdIYfNk4zqyt?A>D2Xn&-Q+N2IvgY*v)x9$-;ua_ zDFc2;r}4k6H|$BZKeujr8WUTq88fYBj9#DiZtnyb4?d#a?PkhRX-t&p7AvYaUEJDg zyk#1E$OUI%%ndAD@LQX~MM;831h=Xe?~w*i>g9NF2{el^;a%R~t%`Ri;&&_g@)9Qt zaUs(|x853G_3BJal@g{8zdF-}4W=%3{#935bn27X^)AxCsh=_3dON9_lG1fs)mQXg zcRh*5T&dq?gTMR}Q!Lz1Ah;0C)+ebz&%%&YAfwr3^UWnBtm6u+0hHdSQiK8f`_ZN7 z;cK!KR6jxj%PXpk?^%$l-O5+QG)wSpf|)!uTO&k0or*F5#4{enUZtLUi<_RGhR-6kOtt-ki1v6q5yj1YDz%7lT?)p6r+rGu>!GFjQ=9ZVy zvUFD}%!Dro>gi)n#JiXG6}*QF+*$N7k}|iF2l}`mSg(XM@~AtV^`^#@HVF4cX7irl z`Fp#0t@iMLgm^C`-f&#e`r#|Qx?Su&m9vRWvG?|Iy*uyzEP$fthf@1GqfZd)$fog( z{dAV{V9<8qvE9tc0oMaT*ad~d8*}d=8q6HtSeKyPu2B7gJ_%Im67(t4-*@_7iT>Pv z-PAu9-2pw-f52ODO{#y^dj$P)B5>q7XM@uzzCU_HT4mo2FdlqNRhF_rjTdF~J?-R= zi+rb%MbWR&H|>AWtJ!}TtACn6Bb96y=f35Y814>qk%xQ?m8tQ8Sfwl60drao*=RY< zq1)HVq3A9`g&jmq=jirG9PKT>t392yB%N{xE1mCcPsk^f5I5-%W%PaRq?Fsp$ z67pu`l*U9Ey|JDADUm;GWKr}J>#s3CKS!V>ou3Cx()k5I^7Eedbbb-+`qFtH^ssaN z>8vN|+$c%s2ig;IhZ3>`Ii)dCMnBk2zEk8c8CjGtc+KhjGJ%qGeg!Z|=ly`B^NIF! zeiiKc()l&$VQ&5D98J=>agxrP+7t3=CB!Ysh%)-2cJf^!KR`64F;T+&Yfk5b1WMAm z2Vj!UhX6_Er2X6K=hwlmFP-0j9@2wORBqE@?T(qO?M{mxhPk|VCi)-Vc8bL|ys5?i zrYPKJQTBB}Tfd#7!$HY?V_FM2miFvo?By3Y{7!rEEdp?zvzRl{BYgC9M&IVu%V_vf z-kpQdcl6>4?BV}eQhlJ)jK*zLhWuhq~v5|g#pIP=Y-h%YlNBy-^Oses(>tu~qnUc%r=wtKeB1 zWi_!3XH;~%UD4&&0Naah;EHbE72TW>mE0!?qw*?yUcGL58L9u5>D8cYgXz_1EwBSO zEk?;`8-9yXmcrEObjy15%j?=jaWySaGAn0oDAo7n%QwVsrw z!x5edUjSG$pPwa@a=G}U)Yhij&GBev z<>no%@cb6r*uYem(D0ka>0UoB3hwjfZ${II0bfWA_&deB2|om4Z#MSo&B@FcdHYcX zla)W@hkxK}^p8Ahf8r7LyHwC!1l5;7M1SVNdQHY!)=c;peG&=Awx8U7Ir-jA;z;aY z-M49~@4qGV-y}-?J^9uGl<5CRzAv`7AO17>rd>4o|4P39ozVZ2e2*vJuO#1OmdW$7 z?oHWl)V)oyJEQ($hDEau=-S8s9P(q@fo1MaQZ5T^+z%H4|$+*`WMq1Dl5-SW1XkUayHNV|B;^TN|H zWRz)3wR~}hk>iV8d+2l$)BXvRw1JP?QLn@67;_V#|D78T~ z2f9?K3m-&zKIU@XQWu3}-CYixpw~w&&m($3TA$y7$wVw~bE^3-qGss`%5D4)t;_%Q z_3?j0{5Qr=P(@lIiG-fxdEeZ9v7JY>bL{2O7LLr4rP0Id6Z|a+zNR&Vwu)0Z*)q|l zJ~q`D=bgOYZnpg^DJulSJB3}?MswT(Z><7%^X5l41~Hy^{9OI-dR_E4o_!s@Bv;lP z;@5=j_AkWN0}V!Bp{e)md)HGDek>LxnXX{wyaukxWle7@`(xI97&;wXA z8sg(HBB5LaV~mEIkrXoO_0&~D9>U6F(|9zJ2<;Tn_FlauU21E?`=KT#elqJV+a$ad z#^^R40|U{=cr90uhNS&nEc{-!5{)Og8Oi?qd^N~;myK~6y3S=@b+%Nc<~LP!W5e0l z8=EJ;1rSX~+xSS*$hna(BXlH)H}kz^95c&Icb9OlCUMzt27J*>C5`a%g|Q{yTWMv7 z$w!vVz|oTJ4u*DItR5p6$qn{A$x%!%SKE{D!}`2epF?$h$EV7y>P~7u;1R!&TDdn@ zLuxkeIFQ;CVRx=u+L&nTcwI@+@IJxN&NQL)Cqi^Zn@F!&Jo-EPIztj&7}?EQLTSYf zZguQb|R0c7MVg3(oZvq!})jj^7duL(TXOPV$6%mACU|`;{6>&*&D@{uYB~49DGfP`6bIT>STzgV8TryKLQ!|$`&C*9Lvoh=XpL6bI7$58T zKEK!Z|JBzV?)#o|_w}=@6YbQ(f0{A3RX4$shE5Ht2Ulz0ONmS4C|8!W1z2rCmKX<- zx6Rufss7GAzhj*~EiigG7PmAW&Ei9K1w26&fZsDH#Y&Hh>uB={wfU5;z=o?`#Gfjs zVD9+(syCoVg}oAU9!+ZahHHnP*F>Cgj5c4J-9jnt=77zvriV#7~q5e9Qw)`HZ)Utn_1yh*`ah7(0(onBTefI^)ATRJR;9bX=(4 zxg<=XhUz{vTT(Yt>D1uGkDH78i_JgAg^8UDrlqIa+Y*zEzV?=Q$`<<(tim?L(F&ar zg77c>BY(WR1+vkx5r4Rnxc}j%9`H$Bz=x-yCc5>yNgdP>)0kpb<7<`y=r|7dRCQ5> z<0}IH_?pwFU>I{)QCMp{UkjsmV)^_>*X!sxnB=7TXc{x3s$w)hTE#IbmFB^51V&P3nZP*qQ9+F-2&$x)0Qv)ttA$RXJi~0G_ISgaZMFY;^l2x{Yx#xM z49-~QDY&v!ZwBs+NkTt-&J9;8bCiKUu1ZS_x!2;@DaB=i-0R7WvoyIkkQ?V;v;Auo zI(Uk|M*l(0JTVcoh+jSk?9AUhuZMql zhKjk2V>~)g(Ce`2@8~$x$cfnhjB4utCr)Dz7`0|2*MBzZ%SMgSsOnf0ryuheJnEuj zQSvv(w4z>&&)rWdF)j%kJkbMMg9aY!bX38ze)w^Pu%v^9psGw66SAPZgC zFH_Oi;1z=ngpcaRWTR*N*Xp)f%xU#)wfelXA2di%*R`r@j?V8b$291loY;iYz%7FQ z-rqx5H^aF^)e4&8Ro!TFT-iO$Csv!Y;sJA9o6Qc2ct*7)`SDRrRi%%9y;_Oe4fRGS zrSzyDI=_Y!EdRq7KA;^v1{@k^jrj>1R!&T#(%_VbN3#anwfwF6Ap`ACP;H0~wf}oy zdl+uTbFgBkB++Srs*1y{cpLO|Gv?3%_qCEyP@M*=;iKxO)sG^73 z&?k(+WXw~tFqk`=m~9%5Zl+_Vo;b%~54DZKpmb37R67iTG39WoZBWMG$`toh9=g=$ zeKv9Pv_!8g-t~<`F_s1Fc5axga z@(sCcXE0AB^U}dwPRgD3z^cXjoRktzW%`tM#5%y&)v}LzYo3Rezuczobi-W=UY_7c zDV$gJopc_)7Ui3W*;NHnI=sAs$*8ei`ZQ)qRZV(6%_SaHL$SN7o98J!&gFk{B2~1m zX3hkzGWbefRfDBigQa^h-YSoAaJV9`RuZriO@C+2v%o#CY)K&hDd>-OoKdxIkZ^N9k!4 zIH)>P?`-c`JubuON3s6+XaNryYw1HqJlyv@WULy3)OYc;CLe!F{y>DGv=g>GHdAMe zmEW_+UzE^ql=D1KTF)IWA5HHMM<0H`H(l{L$}!z2laF|2lE--zhJS&^Oc9S6!&3!l zqCPo+9isZ_d ze*KbxUmj%78T~r;9)8Q4_NmHrAN=w$#>KDxF~qzl%uD^fxqA)eV><8=&)D z^7XF1bqv$NbbaFIJaEfR)%`@ZVB8$FA8BAvUDbVB4KK~(8Mf~+JYA))Yl!)b&UB*_ zPm#GLTJRMkWnAr4*NxCOVa#l*r^)x#6ZPM&SRwuo)DwMK$H#$N|I)XxEb2u;`UMPh zHcXd0=@ECipCBif+fZF@n%m}5vSs%r%j2faU#9CwF~oGmhK`R{AD14piz|3O#r_^U z-zMiaavDl^;Ga^Qm+&zZJa=Y>w=m9y50oVxx5C)wc!L(+%Qgbr0xy+vo8tn&pFsC< zbp5M>UdNQM#mVY{78hOIC9iIAZCqV`OlvZ=`%KmD-Eb$X4xKQ+>i())Fk!ylhpHzU zsAIRs1p{ktA=O-kXU$cOhnJ{~-Sv2&m$~psSibtk9bgQ;LY=*EqojKcKe($pklUFs z=1odso@Wx=HbsBgHuYRd*?&<_#?r;q3~D6gR@ci6a;hG|2NTuRLZ{pRm+5S%PUnyR zkWRvwEDWF(ElIIVqidOf)aT*&TQsj5jZ} z-HDgShNHX7*wI5r4jDrhR$NpY7ocBZ7s$d*FJ8ic$To$!cqSMMkfAwps}ZFG$Qb|O zv9##+`g?KSwCLXz$qzh?M1 z2JKJa59bfS<1hBdKYYH9>{9U87=M^epd|6D(wU^k2@Kv&-rLy>xs6HQWO>c?ekWWF z@<}^3xnmPEe9`#ZmS*@pndCN>pR;_5{e#%O)I~8EQ?_NAA-*Tc6E2c{`;csvxGmEM zR&=c0H2{9?7~>3pvwY)1@=t1H#nLTvlDn~!@*f+wxARVjYDY2e%ORiH$?tcn1>Jq0&8Y>ab4mVE zOmb|iXLIU8v$jELX2{|cxB8q4sRe%7&*u2R{6XEj`9S~R+FgCXKAdD`|Js|E7^^8 z^?1(gA<@t(zj&>K+B;qPCMB8Qfq$5y=Z-73j25(U3nB%~F9v?*h#r=+Em|;BTp&9&; zbv`Qq>a?R;eSX0HA|DtwpvxmcFgK2SMOfcfJ`gsfcGpnIZ+01LV3~vZk}EGH4#zc) zlpx3&LYDJ8&h6L$TDRJby>Vd2c6}SbfVR{+KeQ<jpf1Z_7{ahW;+_)NjW4#ag2w;!6u|F#}b)g9*%D8QNA?B&-A;JZiY~vVSbLI zc6qxA$#49q2mYE#^)RE~_M8BmbExfBVJ+2#fV7~rP*~EwW6MyuI+Wy(EXSdb3y#>& zWH*53I9`IFd)uTY4Ir#L)x-HTs`*icG~@LiN~x?(B=<9EX*_daWFL*3`5k|dn zl*55N=fg%+#{Gjsvh46y4&`b=k9Ixmum$^Y5cJ5SKJd@f80TVfr#01EZwIx-V|ndx zJT`1AFy|9GQv4!^Zw(e(r~WMFR$fPGloc36U?3xJFain$KP902Q_`-{Vbx2k#_#Jy!4tTYu zzSN}$NoyXp$i+gcjgxuSVwD<0Jzhc>b#;E^_+pjXp9VKMlEuqAJtn{ z51I{*U>j6ZNJ&fv+$Ye=zj9b$&uqF%!ZbE6uxCD!FVpR)+fin`ts$8ytoiLIA3Uz= zjHy~7rSt8mY}^R+Vcl}HB6bo_`+%Wf*Q-BI$@I^&gww zj!J_Fdeu>q)NJfwUviw0ok;gEoMYYMjJnzR&=kI7s@tY+_9@8VuL)UUPk!C(Y@|SJGAo=% zU0uk8V5aYeT<1S=(o2fpgXU8MMzDy@LXI-H`lNoi<_yxp)VkwqkC62NP{uSXk92+UUD;*W&m7%}`oS#LH5#JmWu{Ag zi3Y-(Oz|Cvis2omk|spMU<;?$kW+XR-e=u6T!u$+b*GwN&_69MAK#j^hw00lw766F z&Vz$YcUdLI?nC4KRPWg8=n^al6CgxX>rZ)d8uDJui5fop0gky zN5f^-ZEo)@$cCrk7Sq6f3%cjS6!@9xa{mS0XUJ(#OH$4%+AQdP3h&!VmNfp(Wh}|h zMoMSODpJ&xX+W5w45nA?iZYqrWts&oB(>48sAq7f&w`e+4C(E}XFBI2wPwopeWr6; zF&o;j_I8LWl7}|JdQ97)I&sg`wFw(7p&zY_z60L zriShN_gILu7!TI0U`6sbT!PnFccWeZ9Rv-y!Sn~}-b7k$pmpUFq~%EX zyc_jFq}538vgM|jG5PC|HW{cd4GtKSzY%GRf!2pfgT~}o3hZUw`>1g(Qa$7mE=1I0-BcUpGh9S6;b~f=x+2O*-~V2KmtV8-c)yWHxOm}W%iWwp zqDW=JJLu3dMWi!bV`?IrGQEnW!qrz~dc=}0nzQa<&UI7KiV5#hLd#|%iz%OVtwfGT zxGd3@b$F#0EptRWrXTSp=4{9n9Xu@Ci%zV=2VqgyNp$hhJtDfYZm@}T1)|79S15XV zP&d(sE%9myS{8}^Oi>(X4>8cgvbQK^-9(OafEeMS8zf3Ss920PmSbzi;65-L*U9l7 zx)Jx$WHHM_S0?6oP=$EWgXW2)9<)Hb&3RGv`MTKPL2rmn9<)?!F@|8RzskMfO|jJ& z4Fd}cqN2gKNq3ZwHy`LNAiP!)$_q6~{*E#gz8Y5K9RWuQdqxRZ*Wep;Z*AKb-8uCK zq71E1mUB4N>$Qu#Bf&CcL{ube7mz?Li6avNIO;OVGuQ0{HMFrGT?tN$X#aQd}5G zZe_20sHfQ=yucV80W<6QMcd$HF_rWSt~b)+*$TF4$Ts9QLvb#}wk?F@m~4_$I4#l& z_?+`>X z;~Z0$Y;H85_zy)at|wq4kG`?&Q@0^$)#y;6?y=7g50SqL8xk3XF;A*bva+rN<=U{M zXfqrrNJUxNy#?0E6%N&m%hIwT)m|=_ZUoooi}mv`RCo4QDHhd@^`VhP@&Mp`IsR8z#@4QmS3^6-L&XbxE%Cc zbSP9x@4!&FXPkrXEbo_59*4J34i;-sN`I0wgTBU5Ft*uN412e57s|o;P~7M?~o^>Z`y=idH@Kb7e9fUh_wS1^?ZUe{1w z_4@_md?x$Jnr4_7C>v2e{TqeCJW~+L3h#$d9`?7R>>8NT$PBM$wPKq#=<||nk8-J@ zkbQOrP^i@?E4-Q865ty!5oNN^ z6qMZpp8GeOtwk@mEq~$?jR>T2CHuUD_Dii4wp##&-4XaY%C+^VmwL`T)iV;6bS35l zYaV4&uN@fkC2U7CJU^J~u#Dy1!u{yK!<*_qtJ`5toqRTBevWc?J6bC*2VJQ_^>DI= z89vRLjq+~cc$Dkgyu$94c&6#saHC~RdRbay&D=2zMxP$W(I_8HpUn2pp}Ww34$7&Jaz%trmq8ALH}3?ldU>=tkuwcnaAp*-kE?p*=oz7}``c_@+B|e`5}iv?!&}}zT{&!k-$KrX?-qe4pW#{_11&508@{V+dvAdf-iN)9Lxam03 zWH*uSc{kDd#aEdwd%qi>het-sG<_46hPoA+t~;-zZj&P6*XI<*a*0W$Zh&h{WtL8H z7h?@zhyeUoW|^OK1*sO(W$(h!Jc9umY3dbf#Vd~~nwli$8H|vjDZOtRp5bh+DKwR+ zm8L=$QMRUdJ5gIryOW68X=*c!s3TK_<^7>V`C3=rN@99_G|g@0g)~CbH!bk%=rBRk z%@$rr&uTgzD-C#!NYmL^FQhlC!e#m!ykIp`nPpK(9@0ilD?_Y!mUgG6?}PIU7Wh!p zufbNZz+p{E7|t6`XljY!yx{`VW$%P8*JFJktpU~UWwChp&qy~ltr&hc))(qDRJ!`X zVD|@0l%iH)-u6JKsp)Wvx7`ZOG<6*2ZMQ)&QyI{XJP2lK>Kzwo4}yl#6iXR=JTwI9 z64PbzF5XKV1h+Je?iy>w!^%d=a%4;`wA{v|dPoRd)ViNUBYOy3V_In0RG47L`8S5b zEwtQfpNuq$sob)>Fb!z}Q-!5%_cT0vUB*;q8PMHk424-r$0HyNZYqN1oipuW(2{PO zg9^)n&N)cAOl6i=J9kDZV5)>xc&AS|G`5pv88j;DX%B}2rb=jox|(o8>*~Au+iSua zhq4R`E3wytI(Q8OQvgdzsl7JzNMN0%Yv(*e9T=dge`hPyf#I6YMdcYDf-#z|Mp@w@ zn4~E+AFco2df2V_nyS15D-6C5y=6RCzHJoHy5lAx!haXLKBAuLn|t1E$y;z!OZW<|APW6Sd#7_DHy{2zD0z z+8_#yNfb*Z?6V7qh8U(Y=oK^1j@MM_#sJj)h`L5Fp6Rlf+pN^y2&OTWSw>(j#lUP$ zPhc&@;585mS7s5>d4^bcO_N`=74Lvtp{XO*k{#A->VdUnhiy!k1=UgiLNk~X zup?493(a6o=&z}~)k=FJ;3UJkxvkbAjn=fa*A{ycJgI4KuM%4llxsSYy2b8-nVQa| zme^ddpvtmO8eZ91qUmHGn=u*Q))bSUhIe4B)zmcKW^4@aY5JgT8s4GtkE(EOZN?PX zuc=1Dc6%y(s;Pd$2S}$hebi=+UlX{X>C-kQyt;Bt5j>VviF55BzJH~XM?aon)kLE| z9a0{qvQOpFm<~Od)aXx#0g5aIsh`->VVI`gsh=T@(ezD=mG*~WqNbZI)*($*gsGpg zH-+6yl|bobK-;EV*PLDkOj2Z-T4SX>1Ey+vp~gC-*_!&GE)!nVGy-**@S3LYQP&KX zYx)&+&0xKzeW+^=TQwa=U31v2DXYd7dkZ+Asbh^2TMIa*X*KFv!f8#LQP&c_*5pXq zVs8cCYsyF}v9*GqG+mC}Vs8zQ57|}eDoBESI4_0dG==jOr z0ZwSz8~2mFGyIE5wR9KoYC+*DEc*)nuy=s~O`EzK;<`YHrm>HBBh}G#qh}yeq^8l` zLXfaZ@n40dLFd{?Nt(=^B9PKF)y!{%)Lhf1p7BUIng(@EM(UvH>(1#&1)8S!Y>w1R z5wCb%;JPC2OI_e+ZJFxIM$7P)fd48iW>-6;&YHrI3Sb)3KCydHe|sS;QaTuhk7aa) zhS?kr^0FU^>k932m^g)QP@u??IkYIQ8}!ojcJDi~8$6@Qzi(gEJ*UZpd!lZzK$E38 z(OFFw(uo?jsY+omhFh%&UMe0R*8{e@$%IZi;`8;AX_Je+Xt1K=h}HCQnia1Mx-=c@g7XkOtm*qMHsc^@t%z%P zFqAMYwCsrPXdDc$+^2i5eKLTp5sJ9t`#Hju~15{%ABet{B?7>GilFa9Gnv zy|={;g|_XLWrL6p;)cOJO{3FO%p+iXN2LoMP#O0q9MCj4_LI1g(6tlk=EJl3`0R+I_kg++@XTor~S%Z7hYAObacoI-QCe1?@U>>XvRy_@ER1TWEQK zX|blqnf57y=R;D=qoAY? zT3+o^*D)8q)wH!s1EiZC;jjnyqP$eVcHAq@gZBJrT{(0NYvh;*hndP?KnH=>oD2G> znh5KV;CKNRFqOj~M~Y)UoYM5TqZv}ezGPVr$BObC3!t>0qH;%q<3*Uqr1H5CUS_Ja zw9m~mEQB{St#J^o(DYPltDuFjP1EI8`A9o8ooLbx=>k&)T}${;+a)V>HRHQBnA+Fyp-nral6+Fyb811Od_Gx+GJn{Z+`))XTfn{u*r3^rn9rKC`h?Q}aNZ@pU+) z=?QBZyuo)OQhHr%Hsc#`k#$oo?+zL6SPEB}E_-+EIST2PrhYw}1}&we@n5As)#sZE zkf=VZiR!bOs6MNS>eEdos--vK9;Z;j`+~Qi>tKpj?P=eFK1}m0b2~iYcnh9V1YZt$ z3TX|~LZot}jA9B$G{>8zvFJA_Nyj3 zb5cz-?;eNX$H{n~=+lC9;Y?E@utSH3j>B#ybHO+8^8&0@& z*FwV$pF`XesE-+=m0ah$xby9F^!sxRGw#!S?&@qQ!dtq2OjmxlZZqcok( zeC(m0V49})Qsd%p!^>_;i~kwk)kN)n2YNkC>6ODpM}Ek!FoLN9#)Rd@{{}nU^ho?& zIHbt3y>G1b9voN1`Md|$m=?m+^a1hr;5SWsf=9*w0bY|Sg@tfC=9&0^L8zvq2?OG# zh}1L?!x==PrdN=RB2&`}B$LR~^j!L=c(drP$=>Xhc#9aUDYe<^cyBRQ)6k67@xG#5 z(<0|T;{C-7nx2Rr5N{QWnJO#^T~5Z^#9Nv&yPQW_qiHXmB@PmsH64w&LXdc0)7yD@ zcsI&Nn%3t9nQDk5ieT~ZtMS3YIEBhy0V{^DFo%k8MO~F;&xJc;?wIPEDn} zl)?Kwq7&?*?ldCRMh=m{r1qZG&*%Q(R;!gJZ!7 z2}#0QQJq4v2v@{8OBS{6(=||J3BtWbvaoB4$hAVUNY=Eq*BZaZqN%36y-d(pWND&W zN)hcfQ7xs2LPeZjs_3VQY9dw4dbT=esbYa5PCZpD(L|}Iinl#1n}}_0de+`Ve9WZI z)255xnabd$)YJrAlBQD%WsrksZ66jZXI7`zRGefggD1i=6Pk+KOsYOJ#G+Ybsb=Bk zVj0tA@8!{3?9IhHnx+h2r_*m;^XJsWc7jibma@o7AT^^Dj(?ZMs z;?79dm@2qlnv4F=v!xj6DnMO{rYBr@WnT_G+APcruXnFO_n&KsZ(~IAzPf()IZyb_j-S)hpq=}A;^F_Ob6bqi6>^C5xizs4JN3>l;u_oFfbrEB=B^}Xr5ssHs>U8AY zRb(@%-qTHtWGaJy8XMWWiN#81>4`IYckz~{M{#EFF4kxo-C~Vjk=U$hS_>22J@~#R z*?C1+5Al(vpw8vcLmbiMz_VLD#Ys&~@a$Gkab6RIl_c~MS2THtjYPW1RB729mj=DX zZKlg&Xa8{ty~VvnszfXMPfqA7UVNEIjhudBpC-Bz(@$JrD#INvp05*a7n3EPDd=ED znyx9Qq^G^VaJ)vkN_Z{0B4L0?&~%}wB4MCNWKwlDNR%;^!D!>`gh66~rZL_N5(bME znzs8dPAC>TG(B%!oG?Uu!ldT%5^+Kk&E+NH3r#eamxyne)Z9}dt}7kS<->*bb;_s8 z%cCNkX&%VpHxnKe%QQ90+mtX;Y=46+=i!;larVc=38wj)V5!m#>2@&TF|meeK2W&P zV%(doQ|Gh9EG7!~MZ#G3x=B|N$GM5lqK*?WZ&5gvvvHy&(|kA`9cdmX9%rf)D%^BU zD%>kf>dfUhahOT1#qJdRX;f7cU6ZONno+8WW|YUPa^_DnN;T1pQcX0YR1?i8ZZgq` zt0o$aVR zVy-6Yk@LiSP1Gaji4B^l#pa34nyAI*iLIKb#pa0}nyAI*iT#?W#pa36HBpPbAimZ_ zE%t)Asfk)_zW75Ewb*>&yMoGo*_&Eyfe2Q_tJ(rlXC>=!OnciGifkses=Xw-XdR7? zMPj-p>bozCQ<|t>zapBiqFBnHW6rk;OGF1IwW=)Ii2AEl>NLh) z7wJr@7rY?`FqOe}_#xp9F;3H~xW+9N%a|6z)BS!-cvD#4p;#8enZVx@-m2=YCOWgQ z%uOAKg&W>>6P;&R?j}0Vu)TGPm=?mcq$KAW(RmH!T9tOK7^#T&$!o>qnrNTAR!r7JGs8OZtfuXF z47*Ou)%0Db6=CbeB27PcDu?xAsis4%^9=8bRhrJUw!*t&qoz-~uL#>9c4)fXy&N`( z4>g@ANONu!A8Wc&&>ZQ6rcSuW+$7Fw>W*V`llWHC=x!^*HjC?;%DUk>IdMl*vjKUA zE#gm21p}=3Y@B6nbxph{o>s*7EW9TwG|^~$Pt4IoHL+E^q={-`t9V1xfnj-uZDOUS z)5Gw&P_aQ%aq~RGcClU4=;l_~F7|4oTG}BFX`))%AwJXec8}|^JH?lpHuPxY+$kJO3fJt!Et^ zPO;*1f$zSn$h(Jt-2yf+SzZhq3Y=R>qT@&@zPen^j)LTCld5SpKM@5O7<~fgwxlAh8$HWOul*g2Yo+es1zYvzKl$U)#=WtJnOH7rpKWUNklz42L%4f%6uRBkR z=b0+uTIlP}Gvbh@8LrozUkdYfvQ+cgS<#TG3|_Nrbet9MDxHPK*g3IH6OFNRVvi>8 z!sX8M;-IG5h3k=yYwGgwa_0qcM$_eJxBoIG>j580R;_Uz2as^+=(bZl^DIUJ`XRggBjsu;N8J^XujzHvT@gJrnR_jFekTTKviDk#G(r*gv#a8!o3=Zz zit#(C464Px7jHBLAja(`qMo(gc}+}ZqPE@bye=*=UB;`q z+nxUuat~QjuUl!qA$&B^{a`ml4NcRE^9(mdZB5S?Tj8c?$fWXeOB`mR6!trBiEDc) zPD8^!dbN(qVF;NX(bN)-n{hSwU&1+7OHboZd zO`mjM?lj1znl5)=kCdh9M8RFBQMT7~rNESEl!cn+HeK#C$=;gQ;K(t_Voj}4XO<&1 z^+BCkKA|bgzTD|0Cuw`P;qm{b{p*ZY&|B?ie!pH!70I?CJ5AI^b>%Hh)JFB> zZPdNw^J&?L=kDuEA5Hu5+|d$L)l#s_v0*M)G$}u96a4BWXOL%9k{Bi#0%C?_ViRK~AN_0ufNuq^FOA;H)n{L{Y z*hHTCqDprp@nO09R25xG%#XfJVtLPkLYl_2GU-sgIn&q)IeU&eOVttcs+8 z@(s7;3rWTDj)&!N$sdyESl&t+F2{bQ;!Mceob;IdmPy4qM&8uAsI1*dW8|!JRhFM7 zjh8jf6DiAyvNlsCG|N4cG*L!+=q5=AlR5`DNftAybAXd1#X;xR=sAr^@(pDPzM13f zljLruGRQJK)S%k3S#I|RPsszUtK{=GPs?i_aXu|?>u|mzqrua%*9A@ib9OOlvK+*u zay>CbKEUHCIM!>gb)}nkVBmorTt}7i5a2QZd0kUpCX^=Rd)|K(^ELVvv9rWj7|3 z-ixxI*1cmU-TRunyz*Qx%0rs`e9~Z{JgX@)z-C-1?`oPGn1)Zu`F%rWD2H`cn-QOx z(=^Ps#lA>pXu4|4Gc1w=HMI#Uu`QD2nq-YMcv-%vsWyIp=w-Q!>7p1?Eby%~BQ8-2 z7eyOqEYg!qR0b0)mJ76Q2%ZI4A}>`@aT?NvZz)_E?DQkuJ*JD^PY=v@Es@5{D$W=B zkj__;_kn?VNa0%deTQynIYd)x$Ns1*Wm4_8L{4N<^|?frGnGS}ml4Cw)byiYg6mZ| z-^21Xxui;GT9ELX{7lm`fr}Gfmy|C9_X(Hb4NaBe&tTORPx?U6^d zE*W)uGL$^=X(Yj&g zSnEF7_deYatvhbMBlpRQ`*hE1-FWjJ|9x@|lS=&~xy{4!Be`2!b`YCfAISqAx=MLe z>%z@DT$QrP&(*o!FIzB`!+ET;{W9+k=~N2)WmhIu6Z>T!rgD6rSY*I{Ib72RUejF% zrSTU^y&N7fedzjFrZB1056eug zTOBw%;jrw?q+3}A^0chWr1E(hKl7`~H_{Lpa9U<*Dz^L_dqxh@RNHvj^`)GwX^`=T z>#Tg1NyYh)S^g+9n95yGTMX^wZ(bzCYAcHas-o#^H(`mTfQ%{l7E$RG)car{;TQq%W3rPN#+@>ia z=uQ$Cc58YnC?HuFK4en)l!i~4R6eEQl(sx6b~&V>#UHA)PkHTf7!7YTsc>e)1|}8G zY}l?XeXvAk!yZj8#q7!GSPTZ)st4WDXy#Be6b$MA)wJWFY^ui=cQ zONNU{eul3#&9aP7_BVX1DcSg4Qh?#QrVEy`TX)DsZ*Rx9;B=(-vHu!Q?#h(^R&E+jmL#PPwZ09xecM&V zsba2@)s_ax?L#&>!T+9CuOjj(agnS&m?XvdSGk%wg#49kl1*-WH8Dyr^p{|0Lhj;R zlK(lLk-f;quMvf+-H+UNdXW6@>%r5qQ^voCebC3#{_or>lxMq8>)@9fn$b>sIoI3S zEb<|@LATw1;- zbgLfqNH>asq=YG$3ch~}bB=FsN++LN+{&{(+AAf7v?L`gX-)2DJwmN#`v=ofJ`eW5 z2YV^iD!vPiOQhU?*E1iibI%r0eP%A#-ZJcgRsHAHR@H8mt3S~P--N=wbSwApaf#%k z{2$_8r~3I{ONnm=BKvl2NIuT;!5UCuCvwcx^Ceuxycyt69BW2Q%W5^j`6gB?zLSY< z1dqX2T2dc)p2rTwDWQ;S#?xKMeZbQvxfA8Y)8}>wg}oF1@BW@P|C5_?Qs;q~JwrX8 zVzo**hxxoeb+6FBPQ9v(WFOdqr0SE|+!jhc*vfzBqsCp8)@n6?F`+6>&#{Sberfri z{Hx=^H?$3?wp9Kq&m<*`=XlP?SGQ3`2eMZ!Qq?Y0C#u!vaQ#>JD9@Q$&7~4l+fi?k zK&@ubt@hV_k3v!Ws$HsWBs|ZppyKg#Q(N30C$-@HGwQQLDbDTePoujkpATBn6P)*l zebDCLeX43h)fH*0d^|1HY^mm!sy3yZt5)zF>1}YlNIg$_#^CApTzAwwspN}1njVaQ zAkVRXr}d1P!v1{?sQUL@bN_v2yMK*-aIRBxV9o<;v1cBXJHJ2GLp;yMgS$y zqRObGnt@**OfhW0@mtmR$o)U#T zXK|ik={fIt=Jt79_y0b(o|gZ6x7u$g=^5Kro{=`EQcl#U^wfH~)lToZVPxqkJ#Ca* z?F{MNLinyz5BZ>_^6{)U&$`+kLj9zAW&GdORW|Od1Ux8J>aXzX?3u&A%ay0i-?`sz zPHCwal>0&XcVQp&&)}S^*zf}@81sYj!BEQQ|E(1Nf7JGOUH`h(-r%`K$p>@msqM=# zjOCq@r@MsbsIh%$4{$V$>LCH=a|!=@A9^c@nvrmK!E1e+9P+v6q_t@>u4P6TiPEIC zbq;jh{({omQ(8p8z-?$&_Me4{@rK@D) zX4Fz@Mp9DwtJEKq-MD23^09D#K4Ma%?>Npy0^iz5vY2;?O`^%Ij+#kI*oU*dfwcnE zZcwerN?Q16OUZ*g^Q+@Kb(EoUzKZt)o=4d#MU_uAOZUvAbX7i;e6SuoeN-rW35Du` zv%P>!mg=}hrLOjDU2qR6@I9a;ck%wg*ooXK4guAdE^gFlm)2U{>i5dKW!1^lws3z+^3@CSZtWD9=HXbaW@ zy>Zos(u8k_BzFW#AN*z!-T$4=vL(x0mia7;SoUW*6eZpXfieW2+b-`I2}Aix^iaM6 zJp+9N-ce8fxA^Y!-%y)|?~%MR5Wg=WHsBTI-^3NXlH3pqJ9YzaS%_DT(`9+bAus`@ z73;ISAs^GlC+tz{GW0jov+xbsy$5{ zv3U6BhB7lf^FXPeN1u07t{7&3SK@WU40HOB9}P7HUH{x5MmM?3dGj_d<@hhEnlV!y zzRYr|*|)dNIL~}?XsGcbJlp;uV|y-RdoJTenAXFA{vS0-GhT%!`!+WgpcceMC$FiKnvOxZxjbA5V_bk~k?Y41`c~6wdw8uQGeUNFpIU^Il^r0Oh@to`FT;(nhs?J*>{*r@L|uI5b%ObbGtzueRz{_mCt$D0Fc)#p&qwJp7_pbS z41O&4K)j>K9L(-IEE{V77jm99?}6N`SItYsi@__*8^nqhR($rRSBLk_WnzEQ$0%0~ zK87+Ulw`QxZ&UesG!dj)fAt`hVF=29^=xRaM3&>QC(vt)f6FnkBdi?S z8>s$g7|oq(SbA{`gE)o}9K#5X;j|e0NK?yL)=pyWRMt*q?M3lX&w-X%tX;s`C9GY- z+Nu=rnFn2>Hd=l&u1MKssVR$x@3GMM#WST`(q&lE zaKkc;|1--Pj6WM{%CP9m=%$>{12OD|B|;|m_}S7D`<1}f-{lPOiZvd``6SmgKR?cU zGuPV&^Xk6MymKYJk$i&rA9zo8OBv$q<(+v?_zW>?lHo9 zmyY4lK9kV@;pVS-_m>|hkmcxZtGxHImSX$Jdxklu?Z@6T))l=jMO*!`qadcLOwJnpEXe5yTtMu%iApPvD_s{Yc!JdV;Rh{ z4$Fot9W2ip=q|lWEU&S=&GH`0U4pbmBS}A&!7S^rY{=4~B##bnulmkdUz^vGm=s@c zuU4tCzBK9=_#VUq>O4bDuXV*seUIUje9L{)O}+bEke7JIm|-5>WTS6mBaMO?<`peA z`pz)->hPiO2Dmk#$mc5efyTxunV)&BVfzfuc^2E>V(l#%)b@sN7TZiP2PPW)+8b#; zDPXz5+;v!_UoUnKVp(J!jjIx^BcuIdy%PF7=~vThNAXlYO7}Uxnuawwi~J7CuiCHi zb71ccH>7*rYxXX>7xm2shkPj|4br_%roZdg((9|ioBbN%xp*L%m*$ujxO^Ye#f_l+6Z5 z`>z7$&Ipo{J10I*PoD3|H}63q|G+GV=^$jr5h8 z30|k8AMu~6+~$bHNb@YNC926M{bzCgEZ`ho<59W9NIQyUMjF4=3Tyn=7(b5P;eSnz z9l8f4)%ii0FyOfVPy>z7U=DRq?iz5xe>2Ck!8|kRo`0~+j0p%RGS41f7v<7!ktnnK z#sq9Yw-enDH_r^1!M%NhxkYwY^zS)zXut$>MBgV+?s7gIu#01x=k;WhrM|Qq!IjtR z`(`f&yzF%_e{sM*BYkILpYd|gPLy>2)?uA`^015OL*Jj+XQVs1Hkh}@c10ih7R5dz z-OY7ETTaLEJIhGx<}CEVw|(Pi@;1&gQb~)v-g zjKH&4ORooB!diOWbje8b+XVBiq#c2)uq{3dj5Qu?c0tZCbRSaWeT~z~;`w~3*FTGC zw33$WYg>Qg9mrvPBZI&_Gu_8d>(^aF2CpNxIal{s8hNJ8P%Dn%81}bSSbHwRDx7&9 zwXQO(8jPdTl#((QW2l>U*Ra8BP}CIb9@H+d`kAQJZgX4THqw)a_l!%s?eV{d<)V`2 z^?uE2G_^>GA zZ*%SK@v=YSXFF!T8joWcE&KZH@mk)iZonR|1zm#BKd<>x-~Q%lNi}UPF+X)}x4DLI zbAA41SREH@yK1O|Z!f%R_;d*Fc3@IQimjoE^66mN7|ZT5?1Ag)J#2fxmQ#ZAK+8vM z8_dpOQ_#I+$P2a%uAeNn%rH^kYtQZ?v$J2Gp+LuA%lXMx(@4*AUNyYuu%f(``7iX@ zpJWW8HSVFH2;=CUsX^XGdcUAB(t8Dkk=`KK(h$+NE&9;=1BH>^8+g&HIJI|BFB6UQ ze7t)S>k?S2PE*9~aT{o8r?DpbhSMZWYX`R1uGD{_{hB7m8c9Y+c)c109NSbA zebs5IiN5O83yQN+YRodxx1DBj*aaMR3D?pR6MdWHH?M(1%WBXV90J}JbI!9hmYC?v zCCkvp3QJ7%<&rff`Xba46WztOnd@*D_oX!^>Z@x^^rfgZCVJj+mx;#3J`;TbWuJ+@ zhO*B@_r)F7p=f-aVD|~kNjC4$(u2=(t{R&DKkD8+KF+GnA3x7CnOxeYZQ8U+nzTup zlu}w!()2>1Ety=}hBi%`q?B??CNq;}Xfl(|OxlKvrg9Nha8Xbf#Wm%!h~lMMFMzJ8 z;3@*{A}C%^(=7@Jx}xYJR{g!-pYuHPJaY-S>;CcmC9iqU=X}on_Bo&PIp=wXI>QTI z${gxiZ+c$va!#!f{;R@&RXDFB1w*}#@_)SebuWJz<$bCjy4-0mSBjim;_F`Cotpvu zc@;GL7OH?%dSw1JQtQ#28<*cSe_1~98a<+caJ(lwycw+rn&h3JCoEwav%mZPl53=8j^$pyVpG8Z&*d8* zEIElBKVQ<8e+zz}VOM_RnGcuj&42TXfugM?r54m|OG}@X5U^kydT>8!Q!u$zACw|_nzJJbSd!%z{__3thC;HLCG)S%aOL;yXlJ8 zN|$;0UM{XU_vdn-cz+I8uF}#X?>Si6S;EP}*Coeexi>*4_j!G#Wo15ZA@&GuW_`)J zveV-0m(@83lEhGc^Ai{EE}N0Zc~mSbR1VgHXxRY?bHGgCSEde_Z$NuLAewoOgshN| z$8tORHx)c7B`lJWUyL2xPm9~k`5Ql7R*Nt*XRgST`IyJ~SewUwUm+>1&XZLbv3^`; z1kP7rn#=-X@qG6@;wTV zOOHJ6eK&UQk9$9}ZF|Mz-t~Cb`^yNk%JaDQ=8`UO-g_B#QdpN`6|d!gVE>I3Cm`Y9 zQ}M@quDQ?37{F5uD9HwloZ0G!-ukBdDt_p_6Th={M;@j3551RTTp5;ceB0+MjNI{c zdkgN8lHY+ctn%E87T%*ClomcNu^#e{_x+{fA#ZDcpx`S~{)fDkor@MeCUlXP@9Z=3 zKe2!P!n@?1s!s}kLoVMA`fMJhagL0-oZP0hCkpQp>37^hw)t_1^}NJ-A&;?MHh(0wr^s>43ylKE^1gCe+1pP=S zamQuFi%v_d9BI!Pg2jRrg0+Gx1dq!YI4)yjbq>q?q?B-VKI^hRZ)NLeXFMss8}d2d zH{|OuZ29BT{x3-FUcfWtkSY?lMN;0L&)U5paUYYtRd+u7<(QY+es?}K;nU*Fm1S$? zWfChW*dir)LCQ7=j-gIVE_fd*ayc!zbW3@TdD&veyllf`-oIWvR(Z_(t@Hn~@R)a0 zaO|wVEKEq6$GmTLf28snp|2P0mb#plT#608A@{WCB&WTsW3gC}Zb3-cF(mvgQlpc( zb?awU-6fo7J*?wu3G*68RCU#BUhc47^Kyp;S$D++RrjK%CkpSCydIPmIG#^wa~yn( z2jL&jzchSv)mJ3V?tHH1-T9&g31_uvxvORGuv&HvPwLzy%2Zu?Yq zLGBmV9j|^_5ess)Wm4mB^DV!F1gU~I4MY%s) z`RnS}y#L+udiB#P5w4lZwdT!gT3=@@-Y#Lf1uql4#o%uu-eU0gHG>w1&ne~#(GRbJ}LOD;PZkn2)-)#y5OkjOQ(hQeOIEtaQ!Vdxoe|dbU${8tXGA%sJ9e5N7jow&7#_3FH3Tbq+sua=%5w+#+F4=WtAP8Ry9&6Yxwn9CxqT3vj~72!z@9y(VkmR5d1&JkwQc5fw9oMZ z+H;N<(6+PQ^J4GIwNHER#2Xubs8g0Yu8`f_L&BMfo>w?8I%;lPGDqD9G}SS4CuqD2 z6Z8^KC+H(WKkgy_C!pu3g*n9Cfx`pKXcv*;Zz$;(=Qk>o>AXF?}*UX89zpjM}1@ATSTXLIDnWxm@^G``g!^4o(f<8gN;1R*2f)j!#1SbVg3aT8&H3U65 z%(qJDYQaW9pJ1<`U+{?FQNa^}Cj||!ltj=cctr4o;7LIvSHcK3<}OyHYa5033Hk+( z2p$!j5S$dO$z#tp<}rm{LBHTp!Nz>y3yukn3r+}53RV{|Ok+V@Em}J!^mPSujZ^1e zSHQZD3+JAKQ|db#?h(#}a2_ovH&(5A6#VlxJ}Uf4;hzHMvl~wd$20AeTC~YCjp;N_ zyIt*FJ2{Pcsp-Tj!A8Me!QgZc(i{`|y6LQ!F@qti1si9aQn#&bobd`cKH>C&^VhY# z!to1dOz?={xZqL23BePBlY%D&RUy+i1U-d!&;O@QRYF$_HVXO#o8f!kre2}_f@6Y5 z1jhv@1WyP~3Z4{HGo`+QH8X3BjcMzGcNQ|!FvQJgg+tl3BgANCxw4f=u?8Kgn1byQYyh}!5TrIV6&iKFd%qD z@H)Yxg7*lX5PVedq~Iw*RXQDdjZrGO2v!MJ3)ToW3iq;f?Q0x3Ut}}Dxt>~Gvv5nZ%thNW__?m}#9G>bVw-3r+}53aVA)R|z%>_6m*(jtfo*P71093E#ln8wGm> z#{|a(Cj@I(GvCJ54B0CB7n~5B z6jXa9yx@f3q+stQsDF`+S_6m*(jtfo*P6{f&gcocS>=hgn92cAroD@`j5?-)Tuvc(Q za9nUAAmtHMK?yIYLP85R3ib+)362X+2u=#BehDwwD>x=NzK{F~!AU_iARz@C1$za@ z1jhv@1SbVmSi%c73ie(}&Y0l1;Dq3$pxQ6t1sgRzNKT_*ui%*AxZs3f;}FC23XTbm z3r+}53aW^tEZ8X6D>x=NE;u1LDX5|nUa(QHS8z;lTyR3LaaeK}91|QDoDgh0AijcQ zg5!b{f|G((hZtsD<6+Wc?|2V6f)j#O?Z(|1B}@_MGAZXi|(HVXC% zjtPznP6$p4sv9Mi!lqdj;=}K2fw}npy4vLVs^_mcRo>0H$8*1t`>Whg-h1*-=YPN8 zm4cjUXHUCeTK}{|({7r!aQfEiuTOvfjDMc-y%}|dp~9OBzgbu|vt?$_tf5)g&icZv zZ_oPCte?;N%Pi0AS+iHpZk-*Rec$YdXP=z?tJxcht}42_=o3Zta}LhAX3qQPd}+?9 zIj_%|Hn(o>_PPGKRmFA1n~QskZ!7**@zcdG6rVZo^YfmXXUwmg-#ou^y8&(l+G=yEc>UjXUeWx@Z5smEm%>$xqP_%_VRx(f3tjZ#U&Mk z6(6gZsQ9mnk1l-gqR%dRVo_mbS*5S?s>*LwK3kbvwY2Kus(-Bdde!f%>Z^yU$E&|y z{k`g!s*S~S7w=kp?c$pjKfL(Yi*stG)m%{XV$HR+*VTTw_A9kd*FIPK>)O|A3zk$b zDMq^maQ9cKMXS2;^{JARW-fSncn+JN5L zh})};>U!nF9ouGgGtNeDQCrllstvzpdZD@pwg;T?;Wz8L)u+^M^=Wl6eot<%`jWZ? z_iiu68NVNQar$6tR?PUMXW!I_*gx0+m*x1@M_IuL5sc`y1d4A7g!RE^%1!wBYvzJLfW; zFAFx-lm6o}VrJ`otNRb&Pv3hQSlVT-R_fBr@_{$(nF(CEvluw7V*zmCt}5V{E1Ztl1g^reCy6ue6Cf7;8s*QV;_&u-{NF1ls(h|;6$k*;)SOS8 z!Ir;%KlyKzGX3|pd;#hI^R`ETPxPMv9+NR2YNc;xo4e$_ieI$&wrrS zJzYNr>ORuB|FMHD^V4SL_{)n)zta5+;QnHAZrDT4d;6U7=vY6wlAMDV5Ov%yTteA( zVi)ngt-nI7>%#P1+Qjz1Jw$9OAt$trSlszLglX(2U#IWxO?Nx!^ecD&1>vLT5&t^C zzPn1K+^qA-DHHxfg1_q|=N`ej%SdY(_;Nq6WmI~Ed`qJs|LLQh<9l~Q^4CGfF{B%0WMNY!KnnAs!A;bT@5s$RV)Wx12myo zoDFPHcnP;!jpt`fJTue)T#Ii!dj~Y3b*uw@KG0N6&|D1Y8|y*0fQL)OKofe*M$lV; zrrN140PcZig7=^RP3RrXpf3TM&^=l~Uj{Vs8}eH~hkz#Zk2cWzfF^X1ZJ@(I6M9HH z=>0$wx=07;A)pDZXcy=x(8O~^U7!yDO%;Q-W2iU~PnV(;_$?@)sjfyTaQ^~mLVLOt z^gDnio>ICT^mRZJ+Efqd8-OOXDnICV15Nx)UjX#YqUZes%8U2t08MCI`#|3c#M>QE zUi>}}&{Vgfy!>_R{h&X9@|t)Ta1{6A9Ostu?D3x)%_@!sXmSpnb7QR20n;V;7upU--K@WkH9Y=PZQ5q-46T`ayHeM z`HR%h_U=S^z790iqv|7|9|M}|8+f7$Pi6y6^-Yw>P~QTY>T#3^Pxb>%+={&i_#Ko5 z?-4;MO!YJ5Z>mZ4N#IGD0WYb~ApFZfQ~gpM1HOWCnd()P$W*^VSxoh7{Qivzz48&@ zZ}6+cc$1C#8t}I$ouPgQ#M?DcIz#;)h&Q94bcXtGAl|fu(wTS$>~Ua$@dR+1@f2{n z@$bN5<7tGP2gEqX3783u^n1X?#&f_Lwu;@*Ek7WZ=3?2 zXZ##^zVRY(gYh!3(Rc;;55}*6cN+hNSRV$O>LbQ$pzi{j>Z5oiA>JYYL=PIj2Yn9^ zJ!t$l==*@^LF130?+2Rdlg6JwKL|AOi#UG<{b`_yU%B}!=+6Ric4^>GeGY&=H9Vld z2t=P6UeI3#;$0v{9_WXG=wG7%^w)vtUt>Dx$AIWZqY(IQV;1lUqX_t2V=jE30h;Pr zV;<=50Zsg_MhWQWfTsGfQ3m>Xpow?Smjhok76M-~DuFK>)xcjGHNaPlCBWYsOA-DL zKoh@CunhDYKvVt6SPuF$&{Tgm&IbO)SPA^AQ4dsR1JE$n08Mip&||I#=9uRLz2-*5 z%>_b=niqi12cq{)ALwa7^uE~)oME;C7nobXF9+hyD`p$$g+Rzaa~tSNAjXE-4!RnM zv0-+At^s0fn7e=tW*2a^xf{5~+ymTV?gh4)mjW*|FGu)oKvQiudw}hxAGpH|06WYO zaHqKsc)1w{USaMB_L@ULzZnJgnFoLYGY$-zBS|jgT4v~S!do1yvBSF@LKa$;5*EJ1isUJ zA8^dP9eBk20PtPrhk)0acOvffKvUgdegyQ5KvTWj{3z&~fF|Cc_%Yy7^C&oX10ku* zdqCd{gmg0R1O0Izq?36+=uZGK+RX<*KM2HVH$Msb(?E=N^HZQd3*<@tXFz`r2x(?w z?Bj;iG0UZW3 zLB9^f3^IQV`VT1!A7! z7b^_K->ooJmuD{MZXlk?_RIr)5fD0wrv&uHKqq0!?+u zgP$2!hk=;0o|T}l0%Fd3>Oo%v#GLgsfPM!MbJMd1^z}f@P0u>eHv+LLdDeq|4-k5Y z=X}t&0-=X^HiG^~AT$ln1;CGae84Ywnt^}xv;zO+*#cae(}s{|0!_6nXB+6VfTmiW z(++wC5brL^=>S~^G}X$SU7*hazEAxkuM)b(OL^6JF8kHIrNCe3Ed%~GZ#nSwyt9FS z$Xf|~Bd;F#W?lodjLrF#z^(b!(19)l{m*JU=yG)qELuCDtz8YxkWV~kl)hIMe%o=m0d9JzH>^6JNLG!SAy?L8?m-%t?xH(}yY0mMS<=Nrc z?Rl5yG0zj8+MLZfJvslJ^Kj1NIX}qxdCsqLO1xKk-|78;_g?R(ykGL3@SgI%>ivUP z<>uwi%H5vZnY%ytK<=U3m3bHCJ()L|_fp<#d5iLw=GW(M&hN-e$ee$ebLX7z&Utmt8FSB{yLWD6?)&H7GxwpnC+2=09~EBt)|A`|yHa zEHKIo%6FIFT>gpj|15u{d|t&F6`!d1a>Y+7eo^uJ3eUpYg@J`1SopPtPcQt*!e1|3 zuxQ1iwTrec>Rl9Dbj_ms7kz!vD~tZRXjNrrR(`(n`O23oi>r23jaI#@ z>cOg?Rn4hBvwBB$u=*dWpQ!$6b?xF+i<=f-xcG|2gNsKN-?Mmr&7zt^HUCiam6}Iu zCTq%SFRbmXeP8X}wGY-FuRU3N)3>0_sM~-qshlxdzVp-%`i|28j=$HJ@NF^9-_j*d z%%ck$hkD45-|LpYi}9|9^uH_c9=Y_tcjFx!+P-f4oU>#e-b

|H;he2_Oj?54J0FVlv-{Ds)ZT&O+^yZkZiG(U%3;^*->j@{oE z@cANks$as6@5|WfJ%rE0*r7gxo#|Jw&-*HNqW_BB-Pd5NpTN%UggOiErjVQFN38E_tnYVN-~VELKWu$} z#rpnN>wCibenSnfWShUCu9Pu!+H#+^+@_)PS!I1+Xnk+TH{)$Lw!%gNyQ)#;=l6Za zxl+GRS>Zloea|v=IyaafNAD`=l=}OJrjGwRb6Dd2-qh**5#LPzkLE*C-#=OWxgMR) zLeGOTUzT}vJ1w{PXItMZJ-VGPu-rb|KS#&E+4^4U)$V0^Ym0Y5W80&CWA4Idk2;O- z(`K(a*K-e^vwlLoE9WVEo>Ry1c@&@T;xn1^b2Y>JXY~_rxv?yFk6M|##`sL`M&pOM z?Z&*kE@OG#pVhf}dyNb8dcc29_2iWscjte@m|O5oqYR%)-27Wo@RZS2aLV`)KL1+q zbM@l_ulbjPvpmJq=HRmepEEs`pqET*FbAjYQiIceYsNrd3;J5n*MWX7==XxYV_Mj3 znm%NHWcrBt;Pg>*dET}7yc3^Y>O0eSsh6kUZoWMIPIK#w+s*IbdtkOW@u9G_Rr z-okrPUXSNTg$16M3Qrk-C@l0W&nv-aAwHG()WGj4<41+N)NM1@d5l>bJ@3jnWwgv{ z_3WIr*SKU>kLR&j0ng87%{1SbHG)sTQ!sl7?kM;T=Fjk{nSIEUlkSpFQf2MMGxEoOa_~IVGOn!pfXpl&!G1 z(zBpAis$G@%-d!j!gr15wwX^Ex6S;m`TgPs@b(%n6`wNxZQive+ik&ooUF}nFstxg zHGc>0hkGHZkF%#cmkhF&m9Z$av#R$$psDOlPKSlC1tt2 zg*TzS-Y{#*(ca~^o0SEvl1EQ@z;k7JP40E&PZ`&he*@!i#Jsos4DY?=c=Jd3`MJ-R zw;QjQpE4>dP8sJ^gw6hnK<@Iq3eW8ob1)9h^xRo-7RKWWe17aX7yPFy>O9XO?5u^A zp3;Sgv+!ka>%tEq&dc6+ z%F%8-U2&&byXa1{5uZ+cF2UzYd~RIyGl~Bpd>>u(viIplzssFmv`d{|>CMZ@iF(hk z#CWcpm$y8x-8jGUl=1$`O3&-%cbcCB{k6(^@ayxABK+N@b3CUj=Xj1TY6lO$I6U(y zjORPeFIQE1n8qvk=G<6RUFj(+K>qly#P!|LNjD?#*TE^Oxr}=igqlKL7rj=KOEh+=@965W1>% zB!5M1bN(uPE~&jPf28)e7;~?izcJs$*nHDGjn8k)ConclSU7X>CJ(;fOPe=sER#g!grjpiadA$Ix`fr0Jec!Dvq zMo5OQuV?CYfkZSW1rTRvsE_4qiv&mFiP)&)!3wRCAiE=jQC%bLPA`$gMR<3Lk`gnN z5_S#yBk?3FJq3x!4C_}hM)yE0dZ?|xEppI57?!5gd?}KI&}k<832CTR!rKx`Yz_}5 zLa|V=EfE@$+_X=6b`}@;HAu`ov9L}^JEbed<09sdO!kBm11+J1KRhU@t`<+bo7RX+ z%ErR`hKC17?G8zL)i=;@iuAPSzEGm4(~sdX)Ezo3-KqKMrMI{&y(DT6H|^SPb(MCp zR1&Bu8Xau+4|nQXY6ph&)4eA~fMtUh$X)eVM z5Xq4#u9VUx1Jg7j9E%QZ@ehSM`mPKGq$k8Tr9{a@ z>({bGEzv_VOE8Z@hcOJLm9YbN_-9rLg|TD$DA#7VVE{F(A< zp^{l@r`yq*5TQbA#*ms|%-=QilDNJt2~*1h)#=dKls#i%WBKXgC@P zMf6gjHb~w&gSah_5JeX$V?Bb;&RD2FEbW~Prb})W#u^Uw_0Cx2k_RV!_&r71c93&= z5XRkbbW4}7B9$T4!9$N_lj>GHNMcY^3^eU2$um^Se3N)m>IVAl%O-oRJRnIy*~3V? z?18RbOh*ExWFZ_B-z7)w6jw7vdlEr5T6`f=(nxwi?jg_=71f?Bg@j5;K{%La{o#Eh zv5=KOSdT9VBr9hjrU)f|DQW6xX%Zuu7Ken>UfRX7344k>#80|oJtN!A3z-0y45~Cy z0d~580E;O|6uY;?kvi!S%$f979DGS8dhWxOGTCk4uFPp{dpR@I=44U$+!GAJHjQA; z;47^iu@LuWVMEf|?DZfvk3<6aYST-U$TT{;La{J(ma9TRnM?k@!4TLxMg|8hvW-H* zAG2Mpk&&U0?dl927zsmrqJ%-L_HYElWh7)do1q^@hinIhs56+{-0sogOdsZx5q!@8 z)UH9uE-QK$WY}OR5shHRH2LE!Lz1;~aAaRNVsn$VOo}|q2NEn84q)9tT#T5&NGt|< zxN9UdLQc0oz8_z$hlgXKcpQ@e4qqUl3AD`MAeMXWN@mO;@zF?taoa_|BDzYm&Dgc*Diolgk zih!LiMZjWu>zP2R-~huB9B_=p1~;vNwxTxlVXy|nG0PPg408?EUM{hs6U$GD#9t1!5&wcciI3yq?UN1!l;W4-9Dmaq(Ee{2-44V%{W^c;%$hgT^_ zLR^Hw9*xn{>hcDs{W${Q%;-t*7#iK<3ank^uO)kmz7jtxD_3OX1Xs4s0h__s)8A=$ zI1*5=hoPpkiLF5Ra*ap0B*9D>44;$^XLK}igKpx6jMiyT-BI064eFq@7h_oMwK}!E zR;!kVb?cheHZ;^XuU)mazIFAQb5=L3Y4A0zUDMLyTfMHKVe{ICwX2)guWeqxuBoNI zq3N8K)jr=jt?SpVUVZMW)ku#?qd8qEYnPR!i;s4LD_gsPol-|=$zVC7(vFtdI`FaU zwkEZ1Yt-ucR@AFubHnP@n^!eAH?M10-@3VeRm+-&)^k@iZT7XUZ)rJq_1c#8zV&OG z*PV0D+RdnUQ%m#ahWgFT=d49~R^41Fqiz--wQ=#aD_h+VXo{YNPv#yhh!u9N>gnl% zr63&e#bSOa;o$_As4gs$8`maF1ucMfWb)U>D7)2`?!0$f`{5oiR7Pe>+|6>$vP(bSOJr z9m;Xpxil$SaN0xhft|7F?k&69lr#>$H*D%qU88Yq_v+d@@YKmglJ~`em*7U_cK=Xc z&@V;t#X^25qY#eR7H4-0v;hg$dN>jDi;K&hJ*S1i4MqwB8)_Yi8$ExYq;8SE_(lFm z7;2*BW?~j;SqLo`+pjfZ`?04Smpybkqa%^vKy)M?a{O!sz?BSU<=~*@mM(X>Gm~+qDH|99=`{?SwyOyRB@J?w(;CZmT~w6pg@a*QbW!foN7dUMD5PgL^#z>cCj+U>1zTsgJ83WGCx!P^;y_WJ`($sW@MJ@vcM+(@JwtP`6jp zXd)y+N;6sbHk@ecFS?qwKHKh(_+f~EnG`7^#D-0SJw0IvHt7CIrqwm@-VqJbVgM=< z3hx`}6LQ~Rw9h}N%LyNpB&kxsnQSM}wjD%C1NGnHQ>jdMN*GzG8)6~ z0xWwwrg{!)Gc@E{Qnw1KZfs+qkszRKH+DzjubHd5N_-92(StHHE&>#0C-QoA&qgH2DMjG43t4 zEm?h;UbZ;R;>E<8GGo|@W%05T%i`t31hjlEM-E(IYN>O*T(~o*) zmax+w43EU65i&hxla|T0Qf!BO%Jk&8&*W~#>KX0t&-7@D`6GdWOukDh#krw^9Ly5R zS-iVrn6ujLw+rf++ut_T^Z_?j5iLRO zjLfM5UKEPac9dC3?$38dherlQug&zgr({rc2 zzIG*|!)%Z5__$rxSgv5PJN# zMFN8(!H{)7AZt=OVC&(x4F~}Ql|7L)k?xTgG-<2@St{s*pgUx1g2_E;MmyLcQg*Hx zp*Eut+qtQQp*dS-_5j^Efa#p2FwhXFNrkb|%;vqvAB&)fSt5#_kcICE+^ItFcrZ&u zk(c^nMMf>VM*4!`gD7Ma*Df-AVR+^OfKviTQOy#pOADneKJG@CI+Sk&_VQSk=raAX z@MW7EiutfNNM!NOHX=up+m8O=Jex8qUJ(^p6Jo@kCZXuHRg| zY1YV0&c0ofENf;E5r)~=xY?7@e{w-2gL^nLAa)vl2v}X;wn!KDOMTHS;YKr~qPCe# zSeY}KkXm{Hi{k!JMyc$&XZl=~!NOvNZIj+3U{9zCY$n-O64Tn8x^T$7rJ=_ zos5*WCKA%?mXqnV#k)oV0c>Af!PxoQ91`z}#&~KUavcZIhN48^3WY9|?*Q4ZyH&c0 z^}a}t6^mvea1{ghGvXm@-=u~tKMZi(``U++iaBEo&S?hrz!s;?5~?GT&T(vMvYw7w z0kIuH$Fqa##BdRi`zmr&glJ_As%RD>?%V->k|NWt~jG|TQuq1hm>uDl$0gu7_!V%QVR50GDn+c z)FBt&rpdR)ax#wF9n|Ao{7}%OQYH*sP{4?SiYBgMy%p0ArW;|iur-A6#gpBY9He#D zw7__ziCGq0a&N-NtK)h)*$=Mu^#S=QB#bruX2TG^}>$V4W7c_-FCFF32ULdDaO(Cd+A)bVY zo~*Egg)?B^?Q>}>2x6@T3S-A6F*#_WQd&d_>BvSm)m{V{~; z3}K0~3gT?76|80UtubFDXlqbP-;|J2V@cN9t`eIRw|b~xXdlKWWAma_+t3g$`jDZu zT^zW9wrqYOIdJNTh&e`vF@CZ^4xCbWT2RU{eF+>k_TiSYD1ne$G5cIK#ml`Da-t-u z-LUC6X=WZyn6p$^Z!Vd!wUCm8A*9F=9o&Bk3ish&0G9WPipaPJ@*%kJCJ$DJI` zN0U|R_Q%jdn`01MhoZ6lj)yK_D7H0>Hi$TU9F>P6w1_w?yOfmamR&c~vn_&ohXo2T z{ex46!tyG2Y_)2dEM>|KKqu|aP(Po=NQ`nNjXQj*t2hr~UY(&q|6!qA{+-dNB|@Ay zb|s*52S)-4$HVRw6fJ=Z362M5ihoF-G$#w%7U#yfBQiMZgtJp-sr(U_hqV+4KN0Q= z4`S7JqFGn56wkAhC&h9J6ElMM-8GFV+rl%+5$fRjyIX{`Obks?vTI64wk9EH>^tw8 z5wdQ;Ygf;Zb#qnHfvrokk=>S1Lep4iG!fJW674w13v`OtCiK*dLp=qJSqal-oFw9j zc{wDu0xiq21(I2aNro*I9$Bzg7fA$jl6E1XEiou=R?O}06j5QRp(8OX22XxOKnj7} zEpcI=3J9BW!ZP$&!K_Qb?hPf!AvcvSIS3s-)PXmOQJ=&&R{&UYLj6)!>vTynx9NU; z;zWDJfDWZA-W3|`M?k<(zuG+L-)9SIeLDb_8P)2K4UQst?(OK_;ve*PMf($V?FSDI zZKn~gPH&6pX^DAjkkwgJjy~uoK9GgkVcA)sQQ#QFKOAbo-4=bdLXAMvluH)4yk`*@ zU9nM%hG{gez1eVD_vGUfx~ekM#YtbZr}*fvl-&w85@NE5*Y%?npjVw8#!_52jD)sF zQ3tFxgZLhb@6!@fA*WX8InuiNh)!~}$mABua`(w09^`fq+7Zk{wh|z#i(3U#vX7HK zk@Tpct3E8nLP!;1HWJ4ch)bKMhij9bJP_1rxXi-#Nue5M!iT~^AS3I8K_Q)GRu(tQ zha)_@56WSMp=1h2M&w#BH{y6c63Jr)h$S?s@8>`n#Vu^sfz*a`Hudy4n-A-O8wAk7 z93Sm=HYEsRZ%GuiHhr@-KTFuOBI?b*eE^$YzBFG~;nIAVs?*5X$~U#|KCIT3 z*vyiuW;tdIZSa?ZPT>_wGkjPvSVU-sR8q30HkDs+iZ~n+5CqV>(eYcO(fu;NA&l^( zg*F;k`m>9l+`wmg;U3pPUR$EZjXQs%p_ow8U1V{GsF#AYXHL`>Sz=<{1O7-yto6W% ze~?>qvC47xk)qFQu5BhkcACLlhHM9xC)i}p?aVqAh2bW_YDrp8fkx9ovt@jWMVc421x9VK(c6(b5W&8*&rCG7w&w8 z`=Nu|LKmVuMZl}VGr&k(m9>PNkHds7+3o|>k zp71_Bu3)rL`oR}_x<}$v2D$5^J&b*fDQ+?GU=4VVn=OrLWchaU*$>DZS;K^Ob*8p0 z(|)R8#E+;8#VD>b<;FA9U=DeeW{i8f!;TDU<+>VUeMUh12`{1A=#$M&ZZ4F z8{fsoR=y=VtA_TFhLN(9IooRyFIQt@9+1wJGKROkrXp6>~8}amFsh z&BGcNhouhX#9}3n6)EJzgYHom3+9p_HZR-p)D6`ajH(#6aJbIs;<=lv&QW!s1Y|tE zCvCy)xO3q|nk0=SdO-3@3RJ!1PDU?&7#`Sju{=F~KIP=Nlllm^V+_E-Y~Ns!tdb6l zr6dg%HA$mYBqkLBv}^Q`ti+-}TWw(1i#_e)?+6{j;e4FxA=TD8TdL_;eLVAHXcP+5 zP(Rpcxsg2&5+WnR7NZCDT$i)WvT4X1_3JcbhFUaasdZ4{8be8rHpyV?W<4iH5i^3* zMfgVM-tcA7yfOFGnZx#)`k zw2r!*%+1~wNM=b#0-M{UgTdr1BFSO*q;k-qNnf;Rl9meT4O5cG*u&QCdW^4wSQCTP z#c|velDkQ`ew;|&_zwkB_+2Bz!#HbmbA7RWcqB2B;NH~<>r4iRXJwWgvW^c2jpGVO za7O7kQ6a}+=jL#99g{b!bhkM-tyIuO%QB9=Y;2V4(%^{nn^@Y1aGPAE4P&f~`q6GB zTUizonl3Mc%QiX|CIemGG?KvR=ZOPdEf6I^T(*X>UyL|dV!ER=t-`bt#R?0#L$Bg8y9gwP>RSBhb_Ovu`jB++u^N^w{@;Z8$>2t z6@nMDv>s34V6{oK1s3Gg6`c$Tj_)AeNj(?}0r!W8F`0*k<&0kZlL`iuu3}Fo8MzVUw?g%C7cmONuj(`oziwFWsyQ289#D*Q^;-SGhSg!H5 zY@LMAX&tHqFk(#M2sWmxB@L{wk_SRDt;6YugW1>6SvUyb!QQt>HmF4+06n+36*+wx zN*#=pHhNjSMYoH zxRkR)o2dt~?V=V271rex)zfxcdZq2eWJ7V1E-epj=YTYc?a~#uT~xyO`Uu-?Emc0A z3){RltB-B>hE0i{o<98uFGdw?ALym9e6eBVVx){VP03|^#Zxuwu>+M-eVd62Tl)-~ zGnB!RM&W}SG1W$;JPM`Xa>8IhHVa^pFddLXn}|Fn;TQtI?HJULcY~y^q=%?=V^b38 z&)`x_XL3dHwldZmEOr|vuw34hX2`-rD_a>3KI8_MXP;jq8xCyYQLlEn zTQQYm)`_OQwE*K{20=)W&RU683C32eEhaCXwf0Ed-KHO>N*&!6uTAfO zESIcz*79PpbZ=RX0eKQjdJ(HTvgnja2EsY}hXZ|XJti-*P?p4)I>a|I>5``0@|6;& zasqzWEnvxxDxdq}ud=UJWO#5kKrIRPk7E8XLre{Rweoo%Wjz>;7Ck7>?OTinhe0vq zxMaL=>*lc9A}|+(DC8YpO7R^wR#y92A^Xxoa%bj*>crI)T%Cfzj>K$|*V~}H24q(} zh_dQdN@rT8;f%nkf{YhCq!pp3gW@4^cT`LhnoA>vq>qafR!COQR?WrJGCQNoF-T$V z#L|Nkf6R^nIw0BP-luDTYPX0AeI;9Ru&!rAL6K`4I*@()0nNpWTTEQv>T?+Ob5ihQ zlG3n#-2B6%zj}mJM$6)yuw-!8={PNEne3-o6k++R_IcH9z@8V4WQdMyCzV zN?hmYL!0pMAnsy9zmS69m(X62jp1eH^NFxoGbqu$p(Z+gq zUE5sr+LNJ_S?rLkOiD`1O9_y*uwQBgbov@wc;SY ze0_0jEV=ay;mFnXe5u36O=3KX8rN~{XMwUZ9b0l%Z)@?->ZjEP+iTd$(z-KZcSB3q zzb_KSo0I~&G@Q}6@-IWura7+cX92_`>7bA6Spe~LyXntj#Ido9YXURUbvrcA7_v{q_MPukqi;U zRW&^L!2JQPZ9vn;T}g~BNLc&&Ee1OT4Tc?caf{XmDCq%ZsRomcXwz&Tn?@5^n+QCm zAfYTZf=&i>Ihlqoxr@m#8O)&8RG0=bus2?IlGY;@a%ErN(V-7CYF1RQy|_Y0r6i7v zo${VW24MDS&TJRt?Odkv8<9u0G9L4gy@+;>PB}t=_}R>QG|TFAg9A*FwxRj-K~a#?KATc5~)XaA7*1OIqv64^cb)n zeopbQZ&su*p}gVMFmleTcooDVQ^sz}I*fj|uc-vnJbHMmO$HG54Jp=eF4l->8&mW( zJ3T;BpLUVbr?JpXynCdBJNuZF!9S`WhS8O`v~G)K4Q)FF+YNHoc|u0wq;epCUH+o^ zp%ZvnKxZmeHD`seoc3h~o-fB`%LZ|y9n92z?nd%UI(p&*xCw7Pk|RU9%X;yhI8rs3 zq!;EePk`gD-Ib{EuolG?Zk@yxO=`o?YvQ<;v%04zF%X7S4PzfGMoXIVe7GxuD~VIg zW651lX&mX`93Xf^{^;JEpQDx9&06E@s9<7+nHQ zZIS5-mDYM)tEGe6E*{UMH=fpCxEAZykVex^*39KhP+D3(5}XCY_DIKbKOCjo#Pzh4 zin|>tGc|bq<3m)5>oHF9(~%Nj#nD|s=NwovFtVq0-STDAc&^sRHfjgHf7p4^|N zW#+0CXPn-p>P~byW%CwKzVkyD-FhTXhLcT;?$Z**lX@a!WWS|Tvq+JmHVs+CD>w{| zw-L!E3;QwE1wos1prU#^QD+_dD%ZKcN?sJx#!UPQp?xev)hnS(Va*MT!|9#Mu}pZD zKMvkt>CiFp%2;c(`)CM^t5*HCA?@3x9}>|HEiv32>b-ITp5Alu{Vp%gos7-8PExBy zsp^#L8AWOMw+o|HsHxL{B5W5DR&bsN+{V#x^vLL2vQ(6FYkC2_3eY zOJBW}a=A!-2{&!~$7UT#8;g2pt?Q1>v(6j?ftz&a9dzO&5=UPxmT6~MX0cA;O^yD9 z>c{Ol-jc$mTj_I3=QxCo4@-xX9Vhg>!A0kVdVJwNxGjBo<-=xj47%LRpUq@>>)U!R z1|$KdLfYG(p^xE2Gn#OP>xrehneM*ybgfLb$ZK|NtAfQ$s(6;0H<&CEX*uhI#p{k* zL{zMlC=unM!iz2wlwS7M4W}Hq@P;*l@07HeE&-dgPhjrWVe5uKyuQ%U-%pa2(EAp| z){n)?m`LY^WL%|&8IY%FB?%n<%eV8atlEQ@Ve&MShk)ULrm;?Gn%Tlwz@EaH2}HA9 zaOae@t`)mJvG(8#Ls(~ES+%S?m$s`5gB|@Jv)yPOH0Owmqc7nn12BJWCbgbNupE3v z4y~qGs3=)D3Y>ni!&ssa>#D^;c20OZR8LGNVVM>2Xdb$0JFRRy!Gz5W49oy5%pj0L za&!dUVhp-Zidd7!8k^-+lSuAjOUB6~ulgD?=7G(`c;S(%bPV?*ynreUbi7$^2_FdU0UB#nz(q5(Ovl{M2oP!&f!>FQ1jPu8%5FK==6j_It%*tWGnq}wZF!@Y~eZ|<}I$hxKk{MgeljD;vUmPEO z6WMWd5N0eVGW#;QmN7ol!(Mzb8Z$k^*3UaQc?Rq?gdLJ(<0{ZjSx{2AZl>jp`Cw5j zyk3N)#1@&U{Mj!~bBm#=%%s)@BU=_sCB)t$nC!;Gfxjg)R^TmCvMsWdn(m+*Hm&OE z3FsHHWh*EbHOp6`VFSWB$a83T2@N&LdPABl(9{)qMVq>0l7RqJ7hD_$akI3&Ye$H( zO0*&!SJY|eF=EYhAKvIkUo_wSgo@^*ot=bSiE`JRc9mTFrrqz+%n%R2AVzrke!F%1 ziIZ3!%G-(CU+~0k+P+XiFU@7E4U4~SKd8qt!sJZ}BFpg5*dXKxJr3zTzIKH8b{97AV@P(IHf#-LGp_db^?M)WVuNLQ!H!(4*|H|^ z#mahXDink}86pq#8X#}q*LOC=YmolBQXnXVn_+i`eG@Q1kVPuF#h14qsL;U#N^mf= z1DcyX-gtF@mos{VV2VO8MIrPPctZC07aiCOLKS!c? zdW_Aw@R@#sS@U$1*ZE~Y!`(BK>Xw~_%imc-?HEw^Y%=-GuFVK=njqDb9UWTKx^|yp z9_x~eH1WCw!t>TiC^CW;Q!)P`by1hxFSsZiI;6U_x+;xtk!>P4Qx1b*M~=o}SwZCw zSqg^ba4KNOw#2^W6c=Qpn2#(TcSbH!@;)rRe%NK~!`fm!j7ADt9Ck?|JU@%qJVtFp zB;3L%nAXu#IHu11wFf^v!$4^!@_I>%~l zX$goUs3d&a5LI_}P{8FsJPk3f)5~3@b#O7fqdDTGw&h42983gTGEA=}2l|$)B7;Z^*Kh z45BA^(uv2ftc1{na^)Qlo5_YEf~Ut|jev{!;km0Qt`DG2){9c)Sr2vw+D-1Zp}ib> z*k&^BRWcN>Qfh8Oji{K4;CFWYst>P}E2 zpo3~as5sK-lJo|V9zqm$B5lSTp{qpu#SmgAat`5_GnuoR+bU_K@T{;*CxyRk7%`*x zUCj`_6KWK{YlaJ?psG+hKSGC*-+6GUnrx-3N-duUKY3cT6Y*KAgjF+D#F%WABxf$m zkeaJn=;YiFKiv*hpd!qD&qc}7IO$YLjlH~G9q|UT(S%#4%T^^R|J~_L z--GmG$PeYObm(mTtcqHY=cu&A5K2(3)UtNegk{B_Lsi6C!Zzgi z4!(gdr@0;F>_a&R)ARSeUCcVGzy3EVXo+siNuNk5j?%O?=$g6=sVT4(QaMwm z**tZc-O>(jNkSRVk(O32|NkZpmho@S;e!874jkcHVyMgiH}T)Pgs#-zVr=Zhc!Jh0 zbI9&rN}(Z<$&|Y6XZ1ho*}pN(Sp&$MS_OLytIRw~NxdpKtA#4$`bk+b#2H_}^&={C zABSDmj0-_RLrzSm48=PuNYCR;3}S}H5k4uA=LIrqhOp2BIEJY6aBX5qdXP5rq)ed< zr6f~xQ(H;aUT+mvI_1GyS5$>k`4EmJ5Wg~VD50Ekj9NMieJF=1aU8vj?H&Y2VlQWy zCaDcx$N`^W)Q0Q3-AfF0HP&}Xta66kftXsFb6v;PMxBm#1^m=Jof=nMO3DH4H<#Ql zq)e_AzUJ*U8Z~P(Vo=+NqHp?9cgm)?+Mkr7s;~=Xxe6t!qlV#fjiR4yKc989iGV z&YdG;IO)@sr38j5n{wUW(k`vF8Kvh~Wl1@QviAf>JL{=?q7I?1M(u+f)Af`hsk%b8 zlwC1=9FgKW@Q>%ofbvYwi}vo;&NondxYg$$l!!9s?u!ZTsVGOY^p^n>~fM zXx%m0`it_J>m7F=l=|syucmi{@5j8@uT;Y>gyt#%+XKQ<-=IVuR$FB(>m6$qxLOaV z%uwt8wm8)MQ{pY$BKg{D0;T&DYI(CI2b_6kuL*W2$~LZT3S)u04Yxm6 z4)%P#q-ncWC0%MMS18WT^jIrWVyTTgP!6sJRS3_S%$3@`SJu+B$!aY*brKiqPtFfCYWQUL>)ekK&Y~f)q zK)T>;8X9tFeCP+B3Adf`H7J0t+%>L>vGUhQF&y*2GOPMDz0jr$#+>8Wx_2+N>y%3mdAAzzDK3L9rbZYvvyP-7Y$rcQCGGREGs z6gH3lH=5Kau)9Uga>g6GMNM}quckYGs(k9osb<#8PO%C@h7HDsa)uAPlq)-j(jl3T zw6D0*U)O>C^nk`$5w($P~B_&?(vb z09De5bhraz`C5=8t!b#$LY9ScIgWN_iSdNA<6F=0BM3(wmtuu^4k09`AVrC`#JFPM zapdgsbER^uXe(je;P|5*lY0xd9A>yw%i>DOm9497Un%W7`uFG8 z`u}~0yYosJ=6GKI@6D|h-RZ}QW=|NlHYW_fnYJF%>i-}o_fSe7Sgt99NAv&QI&oyA zPU4j^T2gr&LCJ|fcJtq#ZRYUpN|P6Q24zZ&l%nkRq1m-gNDWEvx7jI!@)w98C>eXzhV+AN<*d2TCWMGPcJs2Kk{**vn657;Fv-dHlp&McamfR2!nW z#3s`b{4^*L_$vGGz}g?XJ*D%MJzG5^-1Xn!gk=Q8(KljkvXJL%Tx_yp%`F0Z|2LLg<$vrcE+^pef(DD*mt1UasrJ6_PDarNcg6 zITI<`qxD)IM_$k^c`=OMN}q!bH8;LJaB~}MySZ&nJx-H-M_~_2Z|9@RdSp~lwWbn4_Xd~VC-?E*A%sI%S{q{oh-4Y>WckJV6z z>TD|f9%&Wb%2O%%Y(>s0jt;ayGmXD)b0%x4S9EQpbi&%kKPtfbn1F}4*eJkotw$Sm z9i+KMr)irl^j3=L(nQWwv;kNfL^--xYxb5q6{PDOKV#Nk4A1tZh6im|m8_XJAAq!ZJ8&{c-mT_N57T@YAC%_x`g!A+iuQ&n!$Pa&z`9gIj`G6 zw+AghsX5qlLg%5=p^1>Dgw*otvhQa5EKE(qZT!O6o5ylFmLJQg)zJZ-mfP9v3v7NgdD5 z)(7sox>Hv*T(>EE@apZ9afl~(F(P<$r^=l$_Udb2UQp{D)2Y?~QV+h~!f?5=8TD$$ zOln0Pw*mJ`U3W{%_sIC}0k<79tQ&sH%b8)6EJdB|JRB2}QRz<2?nTa$-Dp2Zg=)71 zV~y>DRxSM?LzlQyV97YE*-I=%C;mC(RQ+z`o=x+zXFFGCwkD;R^v9C7n_W6odavp9 zdXT?vBN+j+Z0*9DA8pS3NcFKt=-)gu>g}09dDe|yab%6%nrU;QJT*two2yj_l1uI0 ziBZM1%q~ajOrfkxHyADz8O%7kZtnCb5v!E3GQEv5%bFq=uYT)Nq|VpuE00}A&gXvA zh^siqq0OJVtm$*yDQh!E5=S*9Q7b;(=ws!QbWY7_JkmMX?f5tMXHwE}{4f`eVa_mn zTusrd2fC8|$lUFGQ~NKq<@8>MD;Q;;zQC8>UfJqo_3E1RmP#)%S3ccNZIDTAQWI+U z_IOJzXZF&h%BJ)c*X~X0LW1vaDM1g~l|9&v`NDBYIbrv)YPXFUZr$Q+k+05bMsq9u z*;dqR9J!XdQW|Gx(>EM#ByC<6Ihu|oCAK+IBHhpKUw0`|b5C1A8*Dk@NanX4Q`PA@ zh`vO^In7-V^o9&QhyA@9vqZ1d+d*Uf+rm{?x0-uA>UB`3Nj@byFS^i}?bcM1xs~bT zR!S&6pDA^?zN`AFd~BUjYo9EI*7(&@j$T`%(B)*A+b}k$S#%4vL#d@SPvb!u-qMqxW%4H;g)S$HS{v z+#9kz*w?fJL8}tYS?`G4Eyb96Ps*{$@p3g}JJ$|gGM@61`V{TXV=QMU`#(w%*Y;SK z)YVIQ**XA@oHNqQlNI8YL4dqjbV8Jr;Xf{HI!_WK0!I8=A}8>j)tY(aZzKvGfwPUvS%_= zzZz?tlRiezylkaVC3VuX>G4&iQ@XQJ7Vh|Ik*Gt@a}R3ZG99Iq({|fX=26H})`%ZM(PTitASr53GM?MweQABI|Ow_)bsdV{}{ zvC2yim~ZU}+L5AZi7*m71-h?w#XLC9l1MSGX0aFLV8F%HMx22%hf#O7;2ey-1Xqns zds;)4Gne;*B>M6~*y1JVP`_C3K$DMu)j_*+qfmgRcloGBJ0Y#)WVL$X$Y#}~8GU8F zYQ^_mi;w!;iYTv^YJnCHJ{VBV5612wPIXjPOC9y#uRcZ)yU=#9wxDQ1j8QYM*CQIs z;>s`u<6$RS%SThO^4>k51#5twF=Z{efjmL4mU4pDS1tQWVib+qPf0-kZ1XX2xpkY? zCN^&PGmt7eW=QX=5*Ch1NYtZOGta{Q zx2IK)ulWp(SeeVMdknHEiGTWx$(&IUg8@b~F6dhs=*#!QtegDEF z9V;Pk%XR58>VoFLBIWgc16MVTt8T(c%OZfSHkGJ$V`&BJQaE3rjbJdvBV8?XaiZBu zxnpkgshbwkpjo%-sywNrM&p%yO{XemBKMp{bVJt|>WM*0jp~mrsGHcX_6Hx-_0$IC zA7Y@U!``=!0aoIH7L;l=5QtsaVfHM*3wmtldanGz7VfEu1XEj8T6c!uDF=)vq3-)) zBUejbwSxW>>4NysHUQJ*yM>RI40Z#ma%p0C=4zo(t4Y_SR?5hv;8UMK29iZvV#F=m zV%EmETBg<`t-f+)DAk7lM+nzeLP-CEdrj|HUry7M&66%-NJp3mWw)G_Ahl&9N~uLD zIjKv76T5QX@2YWDcL&A{T5CC6Nh!3Mb-c*vA*ZyTTuD^U(FFzhFBQ5JD#1{`n z)6pP(jz`_AH59!pd~+G*A^ouYDcL=q`x!r&RHce;FmXU!JYJ}DdNgrp(x_ZmKpy-I zOf}KY2q5JGGZ6TOoM>kUhlmYHb=r6=)ad{y zaYy5};_mCl@_yAy(9j7fpxn?ivvMpkiPl}sD1k85j6^p@_5W%;X+mfQ8*9NrDxuTQ zP!V~Y#-_d^LMcGgfH0O_4Z2>tjG7;Kyg)etQvydpm51#djXg~Zu0ktN*{8-*P-XGM z7=tiqepk(X5b65Ax_(H;ry$kWYy36{deev`ggnTotflH8)p0fxn!p8(#e<>%c?m-< zUbL3y)nZCWed&W^s+c)`8j|t^!alr)N%0)W57n$?8C`kR$h6?%E5t?lKCq@z(yGPf z)JAS1|55>{R$f^l4CGq%wd%3-MVIm`7Xf{gI~kzQbqpd8A?&;j4!%BYT6l#*AJFlr zgmwCen+M{gh0Du8!;=9wnSSLL=qO_~mC-mO@7Cxyp!bt9fq3G+G0jU5gd@1@R&Hjf zdnl0>epZV!n%yf8>DQe3=3w7R>AVF_%m;fM$YS+XI=I}OE3_Nkh7rnxjHUnm%FJ0J8gCFYYKs(8?J zsjku<6zy{T;YuyG;!wV1L2jV&F}d))K&|mTDIUxnD>J$V)y%=@g0|;r1D4x|9GxTi zzStm7Ztn;2J_>T#g7_p)!u0v%qagobKgZi0`mTvS-_&} zs(ol~savjgo{eA)7zDc?ssV#G2~G4*M+J!inlqKBL^LpYmaOAsyxUPLh8x5cVYCfU z#OZTaeLv(87 z(D`VDM^a3t;0f1_C$2wL)2rTR2dM72`B@FuK$9M)l!h0X~TO?i}wqAyq#>p6nH z**T4tj4;rg2oyZw(EPjLe5S4m#suZpOmH$(d|H2l4ln8&8<&;_g`l>tdNJuNNM|*y zn{iB)#+wuJTPHMg>Hx5|+Nm-1g($Y>@^8U7+NL3rOz@=#eYI7ULkp|p7Ual+WT9Tv z$;I`1hR~z@n}OJdnl5M?SZ7Re1|DbpE?AG>k_7Fug5DH;4*F!&keXm=?@*9a@S{~T z*Tj4RLX|!hML4hLlz+aR$KSymtkcI5bYEFl%dO^`%84eJhoZH5i>$rXE7qc?3fmP+v~3 zWjwK=dR#*lhVCyvsv5sK+*~b`H7O{jRlnv?wor?QLD5v`q<1Lm=7)py^??u$zA1pV z=Qq(NIMA=CgAYV5XT82$Prt?gX1-P`7xIS8+@WWxyy~p*p&N2m4kIwSA}t5lFD)M9 zq{yIP$7&rj4r2~LxneM>=x)-UzME{Jj zPeZHPH`7YnL@5OS_=cv+k%6K6D$Bm`1?dg+qNuZ}?G|3BB3^^f$;I)Vi=;WNxdtF# z)K?#ZiAslr9yu>mj|z6Sz|SU*cme)C;EacPmoj;SPxox|A2^o&l&Vf2nQv8r5IAoB@c3vj8i=QuwhpcF{0Z)54+R$N7SoZz? z_>XY>u4rStj&)u3Fo(sw#d*&43#(nBJ>KkwR|KVA7fRW^=)d#UQsz;cUCO<=y6if0Z@r0j{s)DJK1gn^ksuQM460BlEs%A}}_V&yvkN^3K!u(jV~npLs67y&8RyLAh96HrW~0lCM3V$I83+;Hf|HY+4V zvJ`>=v?8w;0CI?XGu+n3p?BzF)^d=!1jr4@ixm&G^jTPdi?=S+ik1oNR-ybfe8CAuIa)h+V$8Kq@uJnT1WVN1;`EiEl1 zm4jA`VVB~oVeUVOmBjK`Bpkv%*~R^&S-hg$MQ;c&$BJ*ErDe70%|sa}zIY%^ei(*k z2}3$=l8&G`kS8Yqzr^OIMIy8|V5wb8Rb7+S30>9M+11(9XF)Gv4k?WqY(Gy#xX;%s zt5rIIqX=4@l(ba&&0@t*NK(a5c7{6y%~&6h4N)MJlJs{u2_aA_ES~dAi|3-YWJpxS zPfh8kenv_!n$n9Xy-1{Tcw&XLRo`HH8$tS{og`$Go|Fl0eNxtb5Nm%bf^BYBZS59h zO|&c8MBU9!MQTi)Fr-sF#}xY)&jsy1HSInvwUd;z`!r~G(X_i*Y9}dack#OLBHL}W z-B#O;b;R5bAoxc73Z@$gt=r0-61bmY3Y^;6DYA}zT74mOBSkB_Q}g@7L?9R4R&2Oz z^D&WY?y>8_VcT8S1+4>3wG~Pe%FcHCWx^Hm?3QN_pWZ7GEk4|SUt+ucp(WtC1p-a_ z^oJT??qJqs(NIG~G)U*72F_)AuZVuBE#%9@GQOouTxvBmVYw@!P1HQX(|T9H+|X@i zgn_6u8-R3 c<71sOKP+>P~Mh&2>_YeEezp@t9(N6Dncvn`OcC6Ebf@jTh0_<>#g z30e1js|DoWqLUFcKu;7z>KbCBG3<~uL|gsa60V1sa`Z3P>m8)^Xm1xA(%#;n>O}ou zYBwQ>Nsv#52#dQz3U;vIE-6S#L6QY`Qkm0;FvbGY#t=Z-HI@m>X_=VzRQ`Ti3?Wl) zj0Ltg#sbsE0Abn~DNKu@LG?bOf14Fl_tW|pIILT$AY}NDFnc542m{dF5K91CY+@L} zw)?Elb#9;(fUcKqw_qv)r9yEJqX(#j6v7sT1R1*_VrYTD2#89-vti14h$Eku+(Hwe z@kNxh5Zj7NpbceO%}UiQWP-apN=AFu-VM#2M4}PXLFmQie%}z*Y!q0d-X=J&FK?@> zqa0XjEiF^wnogw|un=l&szYn8!3;~>ZuEe-2fR_2TX@zqaDDU z_bn_M7M*^^M%pNMCm?O=8rl`)C;;k&!Gppn6at=hMKjSbiP;bb3I==v%}Y#2qjtDn zge_1E0wQ72;uLL;w-fPSPwCQ*vB7Paw27MSs93I4fFZ2_QN$cJSFEh(}( zy`8p5<;W5ABp`k%unTrt4_X%J49y%RoM0*L)4L6{Al+kFy*GivHi{(D1NtgNwtQ74Oxo<(6x(@9>+kMlw|ClnR zY~kCAep`rldpp>cs)8O1B#`TfaYISm08bh=6m@`hcTSKxyp(Vfut_iGu=F|1fs!J6 zrNH~tQ0fWWeTSQ41f2U08M1gb9ERYF+A|Si4UG;{RzFb}7P@>2TzQBD>i(4M!o+Dw z&|W)ayVy~>G^g+iwUISKkw^s6z0|bDV*YSrl%(K}OQu@TwFtw?f2HO(l&P2FD5sVHg+l3&7 z3gJo8k3flqtVo1_Mj`)W?&kvFAuIr9E6q;ZW0V5kQSrS0zJND9j|99qv27*Og8jy( zU}v=4h$UL2_cP5vvSAhOiTC8<@_zQ*M?ksleJ2`i38Nim@}9K4XZ2*>lfIlTo<}kF zL=vX(f+=LeXEEWZ~R^tuR9?6CPU;cmXBW9*3e3qsyNA1lChmZ0;OL z2DA;+vQc)^Ys7HCN(AE4`;16r_A_~Y-li6T)-Fb+29=*{+LpQ&$&UObp@e(A2^m4??cA3fGt~r30UL8z~Dsx4acdX(0dL| zeOc)@0Z<%FY9K3-^((Zj3|h4`0al0y!7NFjcvh(NMLn78G-*XPgY~uah3e6Oj?q%9 zl`DUavW-=S{(g*tu5bfH6lN4loR~T9C*i1N-Hi=P=gO3|WFC2~ddpILcV} zHr})aU_3B;vZ84x$lHuZlLD)TG-Sz#7O9D9sCZud0K8-y&UOK^2>#P9DO&+zbY(gC zeC?uD>~I9z)WQdTBQSv-$U*2A?*DwNJY%rUU@XN(1 z>$IF&A3?-weREq~y$&-i#U|8&(L}ba!&)iK)>D>x>!T$7buw88pY9TDF(r{Vh%BD# z!#Bd4)!Uxzh08P-GCKoBy+fHd2o9{Bq zqVE&)c3_L3EF+EJA1~1bbtsGfA(1k_48?WmI&FKq>tPFtKj}^L1(Z$0YG!+)T_TzD z;-so{8Q7{2A;wYdZ!qy%f z5{y&U+B+(S85#d5g_XM!BryQlqs@_(5+Tv)Aj%PvfQ|!`@L+RaAWUKqCNybL?7x~& z!tpSy?BSbS>HHulyPm~_&^sClwL&8cs=O1RPmMnBgpWS&M3^h<0Gh=7jm?kBo}_H| zrFIg7V_4@MvWXUE??kzl9@~4@_I?TlXm+(n^Uu57Y8^!SsQ`A8whUeF`B8Y?Lf|RW zClwNQ`LSk~9^gjv^-BPh{O}S9cz%aO`S9*!Xv;f=6pW~rC=L1oeLienK?a`pIm3O% zB#yJ(J0p;slF^dUR^vj+P(Cc)DN!tV=>jm+DWP=l6x0Wy=<0-qweTd%e56I(Zjn#( z1vwk}(DwK%Gkz$oe%6k)gTTbI#Y?m|5Hvp<#+aRWOXCB0#^zn=asc70dDjQuLk{O+ zKGi?pM!oz2c)>0hwAXn74*gtA^jRAWSDcL zNAH~9z&nR3Hjo74LGz0=^MvX2F?BW%IxVgWy0vd6cmUR=kCU2;zpC)PjVyNlibPonV^B;^B}nQ9XO%>X1XV2Z$FKe;R&ZQP0Vt$ z-6QP*u8`B%;=!elEtDC2Lo4pS0r8laKG6w|dB6cY#}(o^EhKWffv${qy0OiirulgD zPMi3bcN#-8{)Hl>e9C=Mz&$Ov=IJIaIUM46XM_Zqkg7AK;WUy?M?;1j&+u%AP<#y5lHs)5!&x(VJ^@gVm}ZpOh^(eUEr3M>lvMbzVXj4 z%$b%SLPA9l+0pIdVOpQ{QZC1Og3D4r319L+8n!QWB`gP6IPI!4jPoIlUXA@y4`9zM z{50|HSBVbK^Hk@7Q_~Wri6@<3c7Sx&*FBQz32v^OVqL(yVh-}tUKu2v!E}J z%4IrQ6wE_LUv*yzV6(5ckG#j#?E|&#qfhDnEQC0zoVG$jw$Xt{hT_tm zTO`2|@0TTW1PNiIIXILZKJmUR zS_HZaFU_VYj-ycoGjU|eTLv_mDf_j1ilbCZ_7N|{4WR;2hsy>bIfa`4eIexodK>_# zS-?90$BgmYP_!-5Bu>pi7z+mk$OAC1k&eXXO}F9!C@B;PFn9wqky!D~Sn(LA!;*?T zb4E#1Uns;Az_z6p*n>^HA<;=t%;EY_#9ofryoB?h9FWv;oJ|bI>D^mLM@%A%d^6-1 zVQ>y)$sEpika~}#@2wfMNkn4xM4jo8(>(L>@h^Po-}sYlQ3i3QT;LKO=2dR z()@sk$IuY1F7HpF6yz7K8nGy1^@oj&tcq<2aO6!@zf3C6EfHx~#evsTXd+BeE%K$y znaF?ooo_vS0HOF(K2G7`GTP&wUE~HwdGG1D%Bk+)x8MZL?R8o+6gr@Va_>BY`fp$ zz;{YR$eQAzQtA~yg_HYI>P0TxlX*gM@m(*Q8@)=2Ofi!$_qhx0q0qm&3%pIKSqRNd`Jm@^zDMO86QSm1OR3v zTut!j@o+yy9hn5oD0Pq-9Pf~y31LXhL!6*!;E^bADZ}V42YklgP|0~u0s-6cKgpgi z8{iQn;5n?7)fnSZ;KACUY{OdkG0sjDZX{T;Udgpc?5 zc;A33mbJ-<6WXi=>W6KNvbdbtiB#VAg zYD5FaWL(f#p_HLfQp(WEFc~o$V7*z3sFk}G!9la#5qmR^Fc3-A7v5BuY7EK=?KYOG!&i z-s_VzV*S7$tYEZUDbH2%Tp~}wtGAqKy+nv`Oo$A}h6tDEejDdL$Y{~7pAA?rj;#eB zBe>>)!zCVQzZO-#?*_^BJu7;H1Y;n%;V~mGR<=IM9S{UO=^F!4+ytQGNvpeF zAz-K@aA*eeNE!n&xPFB81ZT$CAJc~s89~jvXfFqEZ4Bm6yM(Y&p?c+C2t)za7RAe0 zAR%MY@Ze4(TA%U3mxv2p;oM2n9AuQtb&*dT8UY|LCSYCU5g1J`-dMwhng+xHaT>?t zBEL|NjB`yu%*Yc2!&$o1IzZaebq_1Zg=VSPZmCInCzxao{ARfRqq{9=mqm&Zx0hI}xVS^wfz3 z@z%gne*cTs`{zr%T0CDWybu&#XjE8|94Cmc0leT%^hgLAL3!>7g4oznP%fWd5)|Xt z7HIRi%e4S{L$>{ZY#{=tAP&2D(e_@@dwNlqzlImaU!h<9`n9f&_@h8sVP1m458G5@1 z*Pg)(K_A@}$6UVufl#OqpuVE(7NlK)?ZDH1^AiE+N6J7yB15~B$h@i}jbzRj%jVYt z*`wm^DsGRHY$HP5*8Ly+P(jCy1cuS=_fJ)3xEV2Oapfw8%QB;oVx=~a? z%@Jx8kusnmy7j9^Ufw>POX-*2=;7fp2idWA2j zdwFT^z4(z3mo~j|>A`kgs6^X+8nI*6d+2B!0Ns=y=zwArqpUn_4fDn_4eJocFnq5clO`DrY~{( zt!r-Yn;5%oXaD%^I}>B$t8cq?ZDQTnZO*#!{&nLxFXp<`9hMp>pR2b#bMu||IcX=G z$UB>pxm+?mIg(5{xvx(=`snI)O5J9u{_@rpUALwRlgTs($Zt+Qkxb_^(r>L&X-hpi zI^4V2Nf&yzjbr>FCpVr=&g3)MRq?@G&Y2!d&Gy{0Z7PwSSrs=p#M=08Rs5bpDqqMt z>(fplpG~Az#kUs5QpxdeII|;}T~2y^x{yjW-k(WK4CZFjSZ3BzkD2MVazk=?C!J>l z=bFvevTZ7}cWX8?nRRmbKqNMZ6x2AHPo|Rjq=Ta3Tb6nRyV?6tA)QZ7JH1G6!-}0% z@v_n{xZHZKhBN-#ZL?V2bnmu&7MryyKAjuSWK+qpVB9rVi^j3FYZC+G1Gn|BTfN5V zyB*tI{L5eC62e;(`Kfy|*es=-(R4CDyD<&=ae5zi#(}0=htv60@$&L}fIF~8Aq5P6 zAsWGgPW>7e)Ve8=Bex7C@`=IxzvQwOa5M>wplnX06O&H%<~xTnd($b9%y4?bdE#Ew zkfZw{Mg}a^SHaPj?8@<^7a02ASZaP3+(-z?*1=RNvv)ICG&z&Pw~B`vhtpF|Hko%O z*zEo#SJjO2^h%>apxU=2rl)%*3ez(^xqN~mITs&7E}lrG;-!*&CZ3;i;^U~z03HJnVo2#%*Dr3iCiu|k<5YsQ?tGCk)UvI5)+I$@vJkQ z+2c&0YdjI(S)f>o@6j?JUt0D!ME;hs$I*Rja(vgd6E=PVdZsl0UK3 z1ccl@iR^GXHzO=lk-1ia^~SB4nL-NsU@MU0q(M!Xa%&>(q)6cjfN*yqnSx~P9UYcp zKYOj_$KMgK)V7gqVtiNcebC2K*J@z_9Fps;$X??`md#9?hEfO&gNTBq8mAL8_b0}j6tZ_(YHfue8gh0fp%u6M#oo#KpV7;nd{_CT6{dN6cgl=k|x;3#YKm8|X ze`D1X|D*l~L!IikfAIBhJn;Shy8ZlrXl!|8_n&Xs@K4|V=R-g89&bimFvFv>gzAPS3leR$~#R~GToc;`ezdF{^a9-9Qws$zjt^0%)|p*@;Bae@0zCT zK2v@Fam5eT$G-i^@Hy*`fA{R?D~{jym;bKraOlV1{rUg2IzRZb_48MM(R$a-(Z?3g ze760&e{}HA$KQDQk<~zr8s7N8(0A{C%tP`wqDuY4pZ#Z%gOHDjc;1jrdH z9&c^>=F}{t=7b2{$`-UU zWco4=S|UlA3X?<9K3>S>L7y^IN$zz(wGh@B%JdC1LO@P>D z7YvB8LO!0%>k)JLOhy{hHp@+AAi5`Hm?{|VkQElvxdPS%9hU(d&>g8vda`E%Mkcii zmIq-;qMb^DmjxK8mkPW=(_{(+FOk}{iet`xbs|2K&5VIRXNd|p3REy-830L5HkQmz z=&=T?hWctQzB92WLvf`0>fjE0dGDzUJFXiFPSumn)@(`C-$2AIz{eG5H1=|!Y?I6!oWgX8Sk5D zFWXuzd8DvJ_|6kfc08GLHpK5qX2%O)Yq*Kf9kmHhNIyq8luA+|Y7X>CesT)?5ueQz z^m;B&Y&#tcfn_DYpn2gnilT``O_I7Jpl@&{tkoo?1@~|wu{TXQQXvEVJ<;^bR+SV4 z&Z0bqc!dP@4N(xN&jmgu`P*Jwm4Q zg640L^$sinpk_QVqxa&fWMrNqyBvL5hEp&B&xI`Y?j?7YU=Uf;aA7VZ%_)#)$pthF zL;TyaS0rEwF$td*j2Xfdg?xs?W_p&}%=Gek%e-+1Z?- z*Q=C*698xzL|`FHegSnRE;%o#eZrXm?iR?u6jTzVAIN*J2HU96O7Wx3u@cqHOeMi6 znHdmHnf3|je8O>N$OzPwkXM(4tAfOHneikP8)N|^tJ3E(5{Mf@3veuznG^|>Loo3R z$RFRjo5?tkTs2AdvWij%4`}|CY$35aW+0Fd5s4ROF1z>=p)i=^^Ptw_YNf1k@(jp^{FbPl#uhw8J3!nE&1gupkH~?PxtRQR(p(%JK@##c* z)|c$#*$jd(HJy`^J}>ErO1~tqE;8_ zT9Is2`n_<>e=Yf!zcrl(XF?{D0&F#D43T(?271Ymj(Y@p~5^ z#&;|}gp~O@cz($`{|W+s-mL$Jf9CDnF#aF0-Wy|@KO5w!6hl1$)#<_^yey2$Z$LHQ z<;m|@<=;i%&vNNCf?ECE&ibz#_R#wh!19_ZVT?>b$J|F^0E#XnEE2I)0O;j92(%N|2tVvAqI&Tp9Ix3rf2 zHpnICwnQMz*t}&7-!OfZZ zwf~o1Yx$fS=lVNK`St7kO85ZkOOHW#J$_TS{M{k$g6><5HR4SF4V0UKyESSZu(uPK zydCL2Kzcj!Yw+yD2xGt`>&B7aiMlbQh}~P!Gl8D0ckmuZ8$S6nBzrc9-OizI8g2BS hL9YeJrS?t+y4H{5A%!@qD&Bsr2maUb{(r#0{{^#sPE`N^ literal 0 HcmV?d00001 diff --git a/AlinasMapMod/AlinasMapMod.json b/AlinasMapMod/AlinasMapMod.json new file mode 100644 index 00000000..cfcee48a --- /dev/null +++ b/AlinasMapMod/AlinasMapMod.json @@ -0,0 +1,636 @@ +{ + "items": { + "AN_Sylva_Interchange_Yard": { + "identifier": "AN_Sylva_Interchange_Yard", + "name": "Sylva Interchange Yard", + "groupIds": [ + "AN_Sylva_Interchange_Yard" + ], + "description": "A yard that can be useful for organizing west bound trains and storing cars if the Interchange is filled to capacity.", + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 4, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 12, + "load": "gravel", + "direction": 0 + } + ] + }, + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 2, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 6, + "load": "rails", + "direction": 0 + } + ] + } + ], + "prerequisiteSections": [ + "s1" + ], + "area": "sylva", + "trackSpans": [ + "PAN_Sylva_Interchange_Yard_00" + ], + "industryComponent": "AN_Sylva_Interchange_Yard.interchange-yard-site" + }, + "AN_Sylva_Wye": { + "identifier": "AN_Sylva_Wye", + "name": "Sylva Wye", + "groupIds": [ + "AN_Sylva_Wye" + ], + "description": "Adds a Wye at the Sylva Interchange, great for turning around those massive Berks.", + "area": "sylva", + "trackSpans": [ + "PAN_Sylva_Wye_00" + ], + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "FM", + "count": 1, + "load": "mow-machinery", + "direction": 0 + }, + { + "carTypeFilter": "GB", + "count": 100, + "load": "debris", + "direction": 0 + } + ] + }, + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "FM", + "count": 1, + "load": "mow-machinery", + "direction": 1 + }, + { + "carTypeFilter": "GB*", + "count": 6, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 5, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 2, + "load": "rails", + "direction": 0 + } + ] + } + ], + "prerequisiteSections": [ + "s1", + "AN_Sylva_Interchange_Yard" + ], + "industryComponent": "AN_Sylva_Wye.wye-site" + }, + "AN_Sylva_Paper_Crossover": { + "identifier": "AN_Sylva_Paper_Crossover", + "name": "Sylva Paper Crossovers", + "groupIds": [ + "AN_Sylva_Paper_Crossover" + ], + "description": "Adds two Crossovers at Sylva Paperboard.", + "area": "sylva", + "trackSpans": [ + "PAN_Sylva_Paper_Crossover_00" + ], + "deliveryPhases": [ + { + "cost": 1000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 1, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 1, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 1, + "load": "rails", + "direction": 0 + } + ] + } + ], + "prerequisiteSections": [ + "s1" + ], + "industryComponent": "AN_Sylva_Paper_Crossover.sylva-paper-crossover-site" + }, + "AN_Sylva_Pax_Storage": { + "identifier": "AN_Sylva_Pax_Storage", + "name": "Sylva Pax Storage", + "groupIds": [ + "AN_Sylva_Pax_Storage" + ], + "description": "Adds two storage tracks to Sylva Station.", + "area": "sylva", + "trackSpans": [ + "PAN_Sylva_Pax_Storage_00" + ], + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 2, + "load": "rails", + "direction": 0 + } + ] + } + ], + "prerequisiteSections": [ + "s1" + ], + "industryComponent": "AN_Sylva_Pax_Storage.sylva-station-site" + }, + "AN_Whittier_Yard_Sawmill": { + "identifier": "AN_Whittier_Yard_Sawmill", + "name": "Whittier Sawmill Connection", + "groupIds": [ + "AN_Whittier_Yard_Sawmill" + ], + "description": "Extend the sawmill track over to the interchange", + "trackSpans": [ + "PAN_Whittier_Yard_00" + ], + "area": "whittier", + "industryComponent": "AN_Whittier_Yard.sawmill-site", + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 4, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 1, + "load": "rails", + "direction": 0 + } + ] + } + ] + }, + "AN_Whittier_Yard_1": { + "identifier": "AN_Whittier_Yard_1", + "name": "Whittier Yard ", + "groupIds": [ + "AN_Whittier_Yard_Yard_Lead", + "AN_Whittier_Yard_Yard_Track_6", + "AN_Whittier_Yard_Yard_Track_7", + "AN_Whittier_Yard_Yard_Track_8" + ], + "trackSpans": [ + "PAN_Whittier_Yard_00" + ], + "industryComponent": "AN_Whittier_Yard.yard-site-1", + "area": "whittier", + "description": "A yard that can be useful for organizing trains and storing cars.", + "prerequisiteSections": [ + "AN_Whittier_Yard_Sawmill" + ], + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 12, + "load": "gravel", + "direction": 0 + } + ] + }, + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 6, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 6, + "load": "rails", + "direction": 0 + } + ] + } + ] + }, + "AN_Whittier_Yard_2": { + "identifier": "AN_Whittier_Yard_2", + "name": "Whittier Yard Extension 2", + "groupIds": [ + "AN_Whittier_Yard_Yard_Track_3", + "AN_Whittier_Yard_Yard_Track_4", + "AN_Whittier_Yard_Yard_Track_5" + ], + "trackSpans": [ + "PAN_Whittier_Yard_00" + ], + "industryComponent": "AN_Whittier_Yard.yard-site-2", + "area": "whittier", + "description": "An additional 3 tracks for the Whittier yard", + "prerequisiteSections": [ + "AN_Whittier_Yard_Sawmill", + "AN_Whittier_Yard_1" + ], + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 12, + "load": "gravel", + "direction": 0 + } + ] + }, + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 6, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 6, + "load": "rails", + "direction": 0 + } + ] + } + ] + }, + "AN_Whittier_Yard_3": { + "identifier": "AN_Whittier_Yard_3", + "name": "Whittier Yard Extension 3", + "groupIds": [ + "AN_Whittier_Yard_Yard_Track_0", + "AN_Whittier_Yard_Yard_Track_1", + "AN_Whittier_Yard_Yard_Track_2" + ], + "trackSpans": [ + "PAN_Whittier_Yard_00" + ], + "industryComponent": "AN_Whittier_Yard.yard-site-3", + "area": "whittier", + "description": "An additional 3 tracks for the Whittier yard", + "prerequisiteSections": [ + "AN_Whittier_Yard_Sawmill", + "AN_Whittier_Yard_1", + "AN_Whittier_Yard_2" + ], + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 12, + "load": "gravel", + "direction": 0 + } + ] + }, + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 6, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 6, + "load": "rails", + "direction": 0 + } + ] + } + ] + }, + "AN_Andrews_Interchange_Yard": { + "identifier": "AN_Andrews_Interchange_Yard", + "name": "Andrews Interchange Yard", + "groupIds": [ + "AN_Andrews_Interchange_Yard" + ], + "description": "A yard that can be useful for organizing east bound trains and storing cars if the Interchange is filled to capacity.", + "trackSpans": [ + "PAN_Andrews_Interchange_Yard_00" + ], + "industryComponent": "AN_Andrews_Interchange_Yard.interchange-yard-site", + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 4, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 12, + "load": "gravel", + "direction": 0 + } + ] + }, + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 2, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 6, + "load": "rails", + "direction": 0 + } + ] + } + ], + "prerequisiteSections": [ + "s6" + ], + "area": "andrews" + }, + "AN_Alarka_Jct_Additional": { + "identifier": "AN_Alarka_Jct_Additional", + "name": "Alarka Jct Additional Tracks", + "groupIds": [ + "AN_Alarka_Jct_Additional" + ], + "description": "Additional tracks in Alarka Jct, currently just a bypass around the interchange.", + "prerequisiteSections": [ + "alarka-jct" + ], + "trackSpans": [ + "Pevc" + ], + "industryComponent": "AN_Alarka_Jct_Additional.alarka-bypass-site", + "area": "alarka-jct", + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 4, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 1, + "load": "rails", + "direction": 0 + } + ] + } + ] + }, + "AN_Alarka_Pax_Storage": { + "identifier": "AN_Alarka_Pax_Storage", + "name": "Alarka Pax Storage", + "groupIds": [ + "AN_Alarka_Pax_Storage" + ], + "description": "Adds two storage tracks to Alarka Station.", + "area": "alarka", + "trackSpans": [ + "PAN_Alarka_Pax_Storage_00" + ], + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 2, + "load": "rails", + "direction": 0 + } + ] + } + ], + "prerequisiteSections": [ + "alarka-branch" + ], + "industryComponent": "AN_Alarka_Pax_Storage.alarka-station-site" + }, + "AN_Alarka_Loop": { + "identifier": "AN_Alarka_Loop", + "name": "Alarka Balloon Loop", + "groupIds": [ + "AN_Alarka_Loop" + ], + "description": "Balloon loop in Alarka, no more fighting with a Wye.", + "prerequisiteSections": [ + "alarka-branch" + ], + "trackSpans": [ + "PAN_Alarka_Loop_00" + ], + "industryComponent": "AN_Alarka_Loop.alarka-bypass-site", + "area": "alarka", + "deliveryPhases": [ + { + "cost": 2000, + "deliveries": [ + { + "carTypeFilter": "GB*", + "count": 4, + "load": "ballast", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "gravel", + "direction": 0 + }, + { + "carTypeFilter": "GB*", + "count": 2, + "load": "ties", + "direction": 0 + }, + { + "carTypeFilter": "FM*", + "count": 1, + "load": "rails", + "direction": 0 + } + ] + } + ] + } + } +} diff --git a/AlinasMapMod/Definition.json b/AlinasMapMod/Definition.json new file mode 100644 index 00000000..64b957db --- /dev/null +++ b/AlinasMapMod/Definition.json @@ -0,0 +1,22 @@ +{ + "manifestVersion": 5, + "id": "AlinaNova21.AlinasMapMod", + "name": "Alina's Map Mod", + "version": "1.7.25304.436", + "assemblies": [ "AlinasMapMod" ], + "updateUrl": "https://railroader.alinanova.dev/update.json", + "requires": [ + { + "id": "railroader", + "notBefore": "2024.6.10" + }, + { + "id": "railloader", + "notBefore": "1.10.0.2" + }, + { + "id": "Zamu.StrangeCustoms", + "notBefore": "1.10.25017.313" + } + ] +} diff --git a/AlinasMapMod/mapeditor_integration.md b/AlinasMapMod/mapeditor_integration.md new file mode 100644 index 00000000..51e4d6ea --- /dev/null +++ b/AlinasMapMod/mapeditor_integration.md @@ -0,0 +1,8 @@ +# Map Editor Integration + +There are new classes adding in AlinasMapMod that allows +itself and other mods to register their objects in MapEditor. +This allows MapEditor to edit and save these objects. + +There not much documentation yet, but there is a few implementations in the Loaders, Map, and Station folders. The main interfaces are IEditableObject, ITransformableObject, and IObjectFactory. There is also ICustomHelper for custom helper objects. + diff --git a/AlinasMapMod/paxstations.md b/AlinasMapMod/paxstations.md new file mode 100644 index 00000000..d9735307 --- /dev/null +++ b/AlinasMapMod/paxstations.md @@ -0,0 +1,36 @@ +# Pax stations + +Industry: +```json +{ + "barkers": { + "industries": { + "barkers-station": { + "name": "Barkers Station", + "localPosition": { "x": 0, "y": 0, "z": 0}, + "usesContract": false, + "components": { + "ammBarkersStation": { + "name": "Barkers Station", + "type": "AlinasMapMod.PaxStationComponent", + "timetableCode": "BC", + // Reference values: Whittier: 30, Ela: 25, Bryson: 50 + "basePopulation": 10, + "loadId": "passengers", + "trackSpans": [ // Spans for loading/unloading + "PAN_Test_Mod_00" + ], + // Future support for custom branches, currently supported is "Main" and "Alarka Branch" + "branch": "Main", + // List of ids of other passenger stations. + // Unsure of exact impact + "neighborIds": [], + "carTypeFilter": "*", + "sharedStorage": true + } + } + } + } + } +} +``` \ No newline at end of file diff --git a/AlinasMapMod/progressions.md b/AlinasMapMod/progressions.md new file mode 100644 index 00000000..76a8ae10 --- /dev/null +++ b/AlinasMapMod/progressions.md @@ -0,0 +1,88 @@ +# Progressions + +```json +// progressions json format +{ + "mapFeatures": { + "sampleMapFeature": { + "displayName": "Sample MapFeature", + "name": "Sample MapFeature", + "description": "Description", + "prerequisites": { + "anotherMapFeature": true + }, + "areasEnableOnUnlock": { + "sampleArea": true + }, + "defaultEnableInSandbox": false, + "gameObjectsEnableOnUnlock": { + // Existing object in world, primary here for dumps. + "path://scene/world/path/to/gameObject/in/tree": true, + // Requires scenery to be defined in a game-graph + "scenery://sampleSceneryId": true + }, + "trackGroupsAvailableOnUnlock": { + "sampleGroup": true + }, + "trackGroupsEnableOnUnlock": { + "sampleGroup": true + }, + "unlockExcludeIndustries": { + "sampleIndustry": true + }, + "unlockIncludeIndustries": { + // Includes components by default + "sampleIndustry": true + }, + "unlockIncludeIndustryComponents": { + "sampleIndustryComponent": true + } + } + }, + "progressions": { + "ewh": { // ewh is the only current progression tree. + "sections": { + "sampleSection": { + "displayName": "sample milestone", + "description": "Description here", + "prerequisiteSections": { + "anotherSampleSection": true + }, + "deliveryPhases": [ + // Can have as many phases as you want here. + { + "cost": 1234, + "industryComponent": "sampleIndustryId.componentId", + "deliveries": [ + // Can be empty for cost only milestones. + { + "carTypeFilter": "GB*", + "count": 8, + "load": "ballast", + "direction": 0 // 0 = LoadToIndustry, 1 = LoadFromIndustry + }, + { + "carTypeFilter": "GB*", + "count": 12, + "load": "gravel", + "direction": 0 // 0 = LoadToIndustry, 1 = LoadFromIndustry + } + ] + } + ], + // Important note: You cannot both disable and enable the same feature, not even in seperate sections. + "disableFeaturesOnUnlock": { + "sampleMapFeature": true + }, + "enableFeaturesOnUnlock": { + "sampleMapFeature": true + }, + "enableFeaturesOnAvailable": { + "sampleMapFeature": true + } + } + } + } + } +} +``` \ No newline at end of file diff --git a/AlinasMapMod/splineys.md b/AlinasMapMod/splineys.md new file mode 100644 index 00000000..d41cfe54 --- /dev/null +++ b/AlinasMapMod/splineys.md @@ -0,0 +1,158 @@ +# Splineys + +All listed values are defaults, and may usually be omitted unless otherwise noted + +- [Prefab Formats](#prefab-formats) +- [Telegraph Poles](#telegraph-poles) +- [Turntables](#turntables) +- [Loaders](#loaders) +- [Passenger Station Agent](#passenger-station-agent-includes-building)] +- [Passenger Stations](#passenger-stations) +- [Map Labels](#map-labels) + + +## Prefab formats +All prefabs use the following formats: +- Path based: `path://scene/world/path/to/gameObject/in/tree` +- Scenery: `scenery://sampleSceneryId` +- Vanilla: `vanilla://vanillaObjectid` + This is a special one for specific structures, + as of 05/10/2025, it has the following: + - roundhouseStall + - roundhouseStart + - roundhouseEnd + - coalConveyor + - coalTower + - dieselFuelingStand + - waterTower + - waterColumn + - flagStopStation + - brysonDepot + - dillsboroStation + - southernCombinationDepot + +## Telegraph poles + +```json +{ + "handler": "AlinasMapMod.TelegraphPoleBuilder", + "polesToRaise": [1,2,3] +} +``` + +```json +{ + "handler": "AlinasMapMod.TelegraphPoleMover", + "polesToMove": [1,2,3], + "poleMovement": [ + [0,1,2], + [22,2,0], + [33,3,5], + ] +} + +``` +## Turntables + +```json +{ + "handler":"AlinasMapMod.Turntable.TurntableBuilder", + "radius": 15, + "subdivisions": 32, + "position": { "x": 0, "y": 0, "z": 0 }, + "rotation": { "x": 0, "y": 0, "z": 0 }, + "roundhouseStalls": 0, + "roundhouseTrackLength": 46, + "stallPrefab": "vanilla://roundhouseStall", + "startPrefab": "vanilla://roundhouseStart", + "endPrefab": "vanilla://roundhouseEnd" +} +``` + +## Loaders +```json +{ + "handler": "AlinasMapMod.LoaderBuilder", + "position": { "x": 0, "y": 0, "z": 0 }, + "rotation": { "x": 0, "y": 0, "z": 0 }, + // Must be set to one of the coal, diesel, or water prefabs + "prefab": "empty://", + // Required for coal and diesel, see example industry below + "industry": "", +} +``` + +Example industry: +```json +{ + "loader-industry-example": { + "name": "Example industry for loaders", + "localPosition": { "x": -271.6577, "y": 0.0, "z": -22.8286133 }, + "usesContract": false, + "components": { + "coaling": { + "type": "Model.Ops.IndustryUnloader", + "name": "Example Coaling Tower", + "trackSpans": [ "PExampleSpan" ], + "carTypeFilter": "HM,HT", + "sharedStorage": true, + "loadId": "coal", + "storageChangeRate": 0.0, + "maxStorage": 300000.0, + "orderAroundEmpties": false, + "carTransferRate": 1E+07, + "orderAroundLoaded": false + }, + "diesel": { + "type": "Model.Ops.IndustryUnloader", + "name": "Example Diesel Stand", + "trackSpans": [ "PExampleSpan" ], + "carTypeFilter": "TM", + "sharedStorage": true, + "loadId": "diesel-fuel", + "storageChangeRate": 0.0, + "maxStorage": 16000.0, + "orderAroundEmpties": false, + "carTransferRate": 32000.0, + "orderAroundLoaded": false + } + } + } +} +``` + +## Passenger Station Agent (Includes building) + +```json +{ + "handler": "AlinasMapMod.StationAgentBuilder", + "position": { + "x": 12886, + "y": 562, + "z": 4703 + }, + "rotation": { + "x": 0, + "y": 0, + "z": 0 + }, + "prefab": "vanilla://flagStopStation", + "passengerStop": "whittier" +} +``` + +## Passenger Stations + +### ***DEPRECATED: Use the industry component instead*** + +## Map Labels +### Note that live editing may have ssizing issues, these are usually resolved on a save reload. + +```json +{ + "handler": "AlinasMapMod.Map.MapLabelBuilder", + "position": { "x": 0, "y": 0, "z": 0 }, + "text": "Map Label", +} + +``` \ No newline at end of file diff --git a/AlinasMapMod/validation_framework.md b/AlinasMapMod/validation_framework.md new file mode 100644 index 00000000..b06df4bb --- /dev/null +++ b/AlinasMapMod/validation_framework.md @@ -0,0 +1,861 @@ +# Validation Framework Documentation + +## Overview + +The AlinasMapMod validation framework provides a standardized approach to validating spliney builder components and serialized objects. This framework uses a field-based validation system with fluent API extensions and comprehensive error reporting. + +## Core Architecture + +### ValidationBuilder (Field-Based Validation) + +The validation system is built around `ValidationBuilder` which requires a field name for context: + +```csharp +// Create a validation builder for a specific field +var builder = new ValidationBuilder("PrefabUri"); + +// Add validation rules using fluent API +builder.AsUri() + .AsVanillaPrefab(allowedPrefabs); + +// Validate a value +var result = builder.Validate("vanilla://locomotive_steam_small"); +``` + +### ValidationResult System + +The framework provides detailed validation feedback with manual result creation: + +```csharp +public class ValidationResult +{ + public bool IsValid { get; set; } = true; + public List Errors { get; set; } = new List(); + public List Warnings { get; set; } = new List(); + + public void ThrowIfInvalid(); // Throws ValidationException if invalid + + // Combines multiple validation results with null handling + public static ValidationResult Combine(params ValidationResult[] results); +} +``` + +### ValidationError and ValidationWarning + +Detailed error information with context: + +```csharp +public class ValidationError +{ + public string Field { get; set; } // Field name being validated + public string Message { get; set; } // Human-readable error message + public string Code { get; set; } // Machine-readable error code + public object Value { get; set; } // The invalid value +} + +public class ValidationWarning +{ + public string Field { get; set; } + public string Message { get; set; } + public object Value { get; set; } +} +``` + +## Validation Rules + +### Core Validation Rules + +- **RequiredRule**: Validates non-null/non-empty values with whitespace control +- **WhitelistRule**: Validates values against allowed lists (includes null validation) +- **MinValueRule**: Validates minimum values for comparable types +- **EnumValidationRule**: Validates enum values are defined +- **CustomRule**: Allows custom validation logic + +### URI Validation Rules + +#### Basic URI Rules +- **UriFormatRule**: Validates URI format (contains "://") +- **UriSchemeValidationRule**: Validates supported schemes (case-insensitive: path, scenery, vanilla, empty) + +#### Scheme-Specific Rules (Restrictive) +- **VanillaPrefabRule**: Only allows `vanilla://` URIs, validates prefab names with path extraction +- **PathUriRule**: Only allows `path://` URIs, validates scene path format +- **SceneryUriRule**: Only allows `scenery://` URIs, rejects identifiers with paths +- **EmptyUriRule**: Only allows `empty://` URIs or null/empty values + +#### Comprehensive Rules (Permissive) +- **GameObjectUriRule**: Allows multiple URI schemes, validates each according to its rules + +### Cache Validation Rules + +- **CacheValidationRule**: Validates cache key existence with null handling and exception safety +- **CacheTypeValidationRule**: Validates cached object types with comprehensive error handling + +## Builder Standardization + +### SplineyBuilderBase Class + +All builders inherit from `SplineyBuilderBase` which provides standardized patterns for logging, error handling, validation, and object creation: + +```csharp +public abstract class SplineyBuilderBase : StrangeCustoms.ISplineyBuilder +{ + protected static readonly Serilog.ILogger Logger = Log.ForContext(); + + // Main build method with standardized error handling + public GameObject BuildSpliney(string id, Transform parentTransform, JObject data) + { + return SafeBuildSpliney(id, parentTransform, data, () => BuildSplineyInternal(id, parentTransform, data)); + } + + // To be implemented by derived classes + protected abstract GameObject BuildSplineyInternal(string id, Transform parentTransform, JObject data); +} +``` + +### Core Builder Features + +#### Input Validation +```csharp +protected virtual void ValidateInput(string id, JObject data) +{ + if (string.IsNullOrEmpty(id)) + throw new ValidationException("ID cannot be null or empty"); + + if (data == null) + throw new ValidationException("Data cannot be null"); +} +``` + +#### GameObject Creation +```csharp +protected virtual GameObject CreateGameObject(string id, Transform parentTransform, string objectTypeName = null) +{ + var gameObject = new GameObject(id); + + if (parentTransform != null) + { + gameObject.transform.SetParent(parentTransform); + } + else + { + var parent = Utils.GetParent(objectTypeName ?? "Unknown"); + if (parent != null) + gameObject.transform.SetParent(parent.transform); + } + + return gameObject; +} +``` + +#### Standardized Error Handling + +Safe execution with structured logging and error handling: + +```csharp +protected GameObject SafeBuildSpliney(string id, Transform parentTransform, JObject data, Func buildAction) +{ + try + { + ValidateInput(id, data); + Logger.Information("Building {BuilderType} with ID {Id}", GetType().Name, id); + + var result = buildAction(); + + Logger.Information("Successfully built {BuilderType} with ID {Id}", GetType().Name, id); + return result; + } + catch (ValidationException ex) + { + Logger.Error(ex, "Validation failed for {BuilderType} {Id}", GetType().Name, id); + throw new ValidationException($"Validation failed for {GetType().Name} {id}: {ex.Message}", ex); + } + catch (Exception ex) + { + Logger.Error(ex, "Failed to create {BuilderType} {Id}", GetType().Name, id); + throw new InvalidOperationException($"Failed to create {GetType().Name} {id}", ex); + } +} +``` + +#### Transactional Building with Cleanup + +For builders that need cleanup on failure: + +```csharp +protected GameObject SafeBuildSplineyWithCleanup(string id, Transform parentTransform, JObject data, Func buildAction) +{ + var transaction = new BuilderTransaction(); + try + { + ValidateInput(id, data); + Logger.Information("Building {BuilderType} with ID {Id}", GetType().Name, id); + + var result = buildAction(transaction); + transaction.Commit(); + + Logger.Information("Successfully built {BuilderType} with ID {Id}", GetType().Name, id); + return result; + } + catch (Exception ex) + { + transaction.Rollback(); + Logger.Error(ex, "Failed to create {BuilderType} {Id}", GetType().Name, id); + throw; + } +} +``` + +#### Deserialization and Validation + +Helper method for deserializing and validating data objects: + +```csharp +protected TData DeserializeAndValidate(JObject data) where TData : IValidatable +{ + var deserializedData = data.ToObject(); + if (deserializedData == null) + throw new ValidationException($"Failed to deserialize data as {typeof(TData).Name}"); + + // Use rich validation for detailed error reporting + var validationResult = deserializedData.ValidateWithDetails(); + if (!validationResult.IsValid) + { + foreach (var error in validationResult.Errors) + { + Logger.Error("Validation error in {Field}: {Message}", error.Field, error.Message); + } + } + + // Log warnings but continue + foreach (var warning in validationResult.Warnings) + { + Logger.Warning("Validation warning in {Field}: {Message}", warning.Field, warning.Message); + } + + validationResult.ThrowIfInvalid(); + return deserializedData; +} +``` + +#### Component Building Pattern + +For building from serialized components that implement `ICreatableComponent`: + +```csharp +protected virtual GameObject BuildFromCreatableComponent(string id, JObject data) + where TComponent : Component + where TSerialized : ICreatableComponent, IValidatable +{ + var serialized = DeserializeAndValidate(data); + Logger.Information("Creating {ObjectType} {Id} using serialized component", typeof(TComponent).Name, id); + return serialized.Create(id).gameObject; +} +``` + +## Serialized Component Framework + +### SerializedComponentBase + +Serialized components can inherit from `SerializedComponentBase` for standardized validation functionality: + +```csharp +public abstract class SerializedComponentBase : ISerializedPatchableComponent, IValidatable + where T : Component +{ + private readonly Dictionary> _validators = new Dictionary>(); + private bool _validationConfigured = false; + + // Override to configure validation rules + protected virtual void ConfigureValidation() { } + + // Abstract methods to be implemented by derived classes + public abstract T Create(string id); + public abstract void Write(T comp); + public abstract void Read(T comp); + + // IValidatable implementation + public virtual void Validate() => ValidateWithDetails().ThrowIfInvalid(); + public virtual ValidationResult ValidateWithDetails() { /* implementation */ } +} +``` + +### Property-Based Validation Rules + +Use the `RuleFor` method to create validation rules for properties: + +```csharp +protected ValidationBuilder RuleFor(Expression> propertyExpression) +{ + // Creates a ValidationBuilder for the specified property + var propertyName = GetPropertyName(propertyExpression); + var builder = new ValidationBuilder(propertyName); + + // Store validator function for later execution + _validators[propertyName] = () => { + var propertyValue = GetPropertyValue(propertyExpression); + var context = new ValidationContext { Owner = this }; + return builder.Validate(propertyValue, context); + }; + + return builder; +} +``` + +### Example Implementation + +```csharp +public class SerializedLoader : SerializedComponentBase +{ + public string Prefab { get; set; } + public int Capacity { get; set; } + public Vector3 Position { get; set; } + + protected override void ConfigureValidation() + { + RuleFor(() => Prefab) + .Required() + .AsUri() + .AsVanillaPrefab(VanillaPrefabs.AvailableLoaderPrefabs); + + RuleFor(() => Capacity) + .GreaterThan(0); + } + + public override LoaderInstance Create(string id) + { + // Create and configure the component + var gameObject = new GameObject(id); + var loader = gameObject.AddComponent(); + + // Apply configuration + loader.SetPrefab(Prefab); + loader.SetCapacity(Capacity); + gameObject.transform.position = Position; + + return loader; + } + + public override void Write(LoaderInstance comp) + { + Prefab = comp.GetPrefab(); + Capacity = comp.GetCapacity(); + Position = comp.transform.position; + } + + public override void Read(LoaderInstance comp) + { + comp.SetPrefab(Prefab); + comp.SetCapacity(Capacity); + comp.transform.position = Position; + } +} +``` + +### Fluent Validation API + +The framework provides a fluent API through extension methods on `ValidationBuilder`: + +```csharp +var builder = new ValidationBuilder("PrefabField"); + +// Basic validation +builder.Required() // Value must not be null/empty + .AsUri(); // Must contain "://" + +// URI scheme validation +builder.AsUriScheme() // Must be supported scheme + .AsVanillaPrefab(allowedPrefabs) // Specific to vanilla:// URIs + .AsPathUri() // Specific to path:// URIs + .AsSceneryUri() // Specific to scenery:// URIs + .AsEmptyUri() // Specific to empty:// URIs + .AsGameObjectUri(allowedPrefabs); // Multiple URI forms allowed + +// Numeric validation +builder.GreaterThan(0) // Value > minimum + .GreaterThanOrEqual(0); // Value >= minimum + +// Enum validation +builder.AsValidEnum(); // Must be defined enum value + +// Custom validation +builder.Custom((value, context) => { // Custom validation logic + var result = new ValidationResult { IsValid = true }; + if (/* custom condition */) { + result.IsValid = false; + result.Errors.Add(new ValidationError { + Field = context.FieldName, + Message = "Custom validation failed", + Code = "CUSTOM_ERROR", + Value = value + }); + } + return result; +}); +``` + +## Complete Builder Implementation Example + +### Creating a New Builder + +Here's how to implement a complete builder following the standardized patterns: + +```csharp +public class MyCustomBuilder : SplineyBuilderBase, IObjectFactory +{ + public string Name => "My Custom Component"; + public bool Enabled => true; + public Type ObjectType => typeof(MyCustomComponent); + + protected override GameObject BuildSplineyInternal(string id, Transform parentTransform, JObject data) + { + // Use the standardized pattern for building from serialized components + return BuildFromCreatableComponent(id, data); + } + + public IEditableObject CreateObject(PatchEditor editor, string id) + { + // Create a default instance for the editor + return new SerializedMyCustomComponent + { + Prefab = "vanilla://default_prefab", + Scale = 1.0f + }.Create(id); + } +} +``` + +### Corresponding Serialized Component + +```csharp +public class SerializedMyCustomComponent : SerializedComponentBase +{ + public string Prefab { get; set; } + public float Scale { get; set; } = 1.0f; + public bool IsActive { get; set; } = true; + + protected override void ConfigureValidation() + { + RuleFor(() => Prefab) + .Required() + .AsUri() + .AsVanillaPrefab(VanillaPrefabs.AvailableComponentPrefabs); + + RuleFor(() => Scale) + .GreaterThan(0.1f); + } + + public override MyCustomComponent Create(string id) + { + var gameObject = CreateGameObject(id); + var component = GetOrAddComponent(gameObject); + + ConfigureWithActivation(gameObject, () => { + component.SetPrefab(Prefab); + component.SetScale(Scale); + component.SetActive(IsActive); + }); + + return component; + } + + public override void Write(MyCustomComponent comp) + { + Prefab = comp.GetPrefab(); + Scale = comp.GetScale(); + IsActive = comp.IsActive(); + } + + public override void Read(MyCustomComponent comp) + { + comp.SetPrefab(Prefab); + comp.SetScale(Scale); + comp.SetActive(IsActive); + } + + private GameObject CreateGameObject(string id) + { + var gameObject = new GameObject(id); + return gameObject; + } + + private TComponent GetOrAddComponent(GameObject gameObject) where TComponent : Component + { + return gameObject.GetComponent() ?? gameObject.AddComponent(); + } + + private void ConfigureWithActivation(GameObject gameObject, System.Action configureAction) + { + var wasActive = gameObject.activeSelf; + gameObject.SetActive(false); + try + { + configureAction(); + } + finally + { + gameObject.SetActive(wasActive); + } + } +} +``` + +## Migration Guide + +### Updating Existing Builders + +1. **Inherit from SplineyBuilderBase**: Replace custom base classes with `SplineyBuilderBase` +2. **Use BuildFromCreatableComponent**: Replace manual deserialization with the standardized pattern +3. **Implement IObjectFactory**: Add `CreateObject` method for editor integration +4. **Remove custom logging**: Use the inherited `Logger` instance + +**Before:** +```csharp +public class OldBuilder : ISplineyBuilder +{ + public GameObject BuildSpliney(string id, Transform parent, JObject data) + { + try + { + var serialized = data.ToObject(); + serialized.Validate(); // Simple validation + return serialized.Create(id).gameObject; + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + throw; + } + } +} +``` + +**After:** +```csharp +public class NewBuilder : SplineyBuilderBase, IObjectFactory +{ + public string Name => "My Component"; + public bool Enabled => true; + public Type ObjectType => typeof(MyComponent); + + protected override GameObject BuildSplineyInternal(string id, Transform parentTransform, JObject data) + { + return BuildFromCreatableComponent(id, data); + } + + public IEditableObject CreateObject(PatchEditor editor, string id) => + new SerializedComponent().Create(id); +} +``` + +### Updating Serialized Components + +1. **Inherit from SerializedComponentBase**: Replace custom validation with the standardized framework +2. **Override ConfigureValidation**: Use `RuleFor` to set up validation rules +3. **Use ValidationBuilder**: Replace manual validation with fluent API + +**Before:** +```csharp +public class OldSerializedComponent : IValidatable +{ + public string Prefab { get; set; } + + public void Validate() + { + if (string.IsNullOrEmpty(Prefab)) + throw new ValidationException("Prefab is required"); + } + + public ValidationResult ValidateWithDetails() + { + // Manual validation result creation + } +} +``` + +**After:** +```csharp +public class NewSerializedComponent : SerializedComponentBase +{ + public string Prefab { get; set; } + + protected override void ConfigureValidation() + { + RuleFor(() => Prefab) + .Required() + .AsUri() + .AsVanillaPrefab(allowedPrefabs); + } + + // Implement Create, Write, Read methods +} +``` + +## Builder Helper Methods + +The `SplineyBuilderBase` class provides additional helper methods for common builder tasks: + +### Finding Existing Components + +```csharp +// Find existing components by ID using caches +protected virtual TComponent FindExistingComponent(string id) where TComponent : Component +{ + // Uses type-specific caches for performance + if (typeof(TComponent) == typeof(PaxStationAgent)) + { + StationAgentCache.Instance.TryGetValue(id, out var stationAgent); + return stationAgent as TComponent; + } + + // Fallback to GameObject.FindObjectsOfType + return GameObject.FindObjectsOfType(true) + .FirstOrDefault(c => GetComponentId(c) == id); +} +``` + +### Component ID Resolution + +```csharp +// Gets component ID using common patterns +protected virtual string GetComponentId(Component component) +{ + // Try common identifier patterns + var identifiableProperty = component.GetType().GetProperty("identifier"); + if (identifiableProperty != null) + return identifiableProperty.GetValue(component)?.ToString(); + + var idProperty = component.GetType().GetProperty("Id"); + if (idProperty != null) + return idProperty.GetValue(component)?.ToString(); + + return component.name; +} +``` + +### Safe Component Configuration + +```csharp +// Safely configure GameObject by disabling during configuration +protected virtual void ConfigureWithActivation(GameObject gameObject, System.Action configureAction) +{ + var wasActive = gameObject.activeSelf; + gameObject.SetActive(false); + try + { + configureAction(); + } + finally + { + gameObject.SetActive(wasActive); + } +} +``` + +### Validation Patterns + +#### Field-Based Validation + +```csharp +// Validate a URI field +var uriBuilder = new ValidationBuilder("PrefabUri"); +uriBuilder.Required() + .AsUri() + .AsVanillaPrefab(VanillaPrefabs.AvailableLoaderPrefabs); + +var uriResult = uriBuilder.Validate("vanilla://locomotive_steam_small"); +if (!uriResult.IsValid) +{ + // Handle validation errors + foreach (var error in uriResult.Errors) + { + Logger.Error("Validation error in {Field}: {Message}", error.Field, error.Message); + } +} + +// Validate numeric values +var numberBuilder = new ValidationBuilder("Subdivisions"); +numberBuilder.GreaterThan(2); + +var numberResult = numberBuilder.Validate(subdivisions); +``` + +#### Creating Validation Rules + +```csharp +// Create a custom validation rule +public class PositiveNumberRule : ValidationRule +{ + public override ValidationResult Validate(int value, ValidationContext context) + { + var result = new ValidationResult { IsValid = true }; + + if (value <= 0) + { + result.IsValid = false; + result.Errors.Add(new ValidationError + { + Field = context.FieldName, + Message = $"Value must be positive, got {value}", + Code = "MUST_BE_POSITIVE", + Value = value + }); + } + + return result; + } +} + +// Use the custom rule +var builder = new ValidationBuilder("MyNumber"); +builder.AddRule(new PositiveNumberRule()); +``` + +#### Working with ValidationContext + +```csharp +var context = new ValidationContext { FieldName = "PrefabField" }; +var rule = new RequiredRule(); +var result = rule.Validate(value, context); + +// The context provides field information for error messages +``` + +## URI Validation Architecture + +### Two Types of URI Rules + +The validation framework supports two distinct approaches to URI validation: + +#### Restrictive Rules (Single Scheme) +These rules only accept their specific URI scheme and reject all others: + +- **VanillaPrefabRule**: Only accepts `vanilla://` URIs +- **PathUriRule**: Only accepts `path://` URIs +- **SceneryUriRule**: Only accepts `scenery://` URIs +- **EmptyUriRule**: Only accepts `empty://` URIs + +```csharp +// This will ONLY accept vanilla:// URIs +var vanillaBuilder = new ValidationBuilder("VanillaPrefab"); +vanillaBuilder.AsVanillaPrefab(allowedPrefabs); + +// VALID: "vanilla://locomotive_steam_small" +// INVALID: "path://scene/SomeObject" +``` + +#### Permissive Rules (Multiple Schemes) +These rules accept multiple URI schemes and validate each according to its rules: + +- **GameObjectUriRule**: Accepts path://, scenery://, vanilla://, empty:// schemes + +```csharp +// This will accept multiple URI forms +var gameObjectBuilder = new ValidationBuilder("GameObjectUri"); +gameObjectBuilder.AsGameObjectUri(allowedVanillaPrefabs); + +// VALID: "vanilla://locomotive_steam_small" +// VALID: "path://scene/SomeObject" +// VALID: "scenery://tree_oak" +// VALID: "empty://" +``` + +### URI Parsing Details + +#### Vanilla Prefab Extraction +The `VanillaPrefabRule` extracts prefab names from URIs with paths: + +```csharp +// Input: "vanilla://Locomotive/part" +// Extracted prefab: "Locomotive" +// Validation: Check if "Locomotive" is in allowed prefabs list +``` + +#### Path URI Format +Path URIs must follow the format `path://scene/GameObject1/GameObject2/...`: + +```csharp +// VALID: "path://scene/SomeGameObject" +// VALID: "path://scene/Parent/Child" +// INVALID: "path://notscene/SomeObject" +``` + +#### Scenery URI Format +Scenery URIs must be simple identifiers without paths: + +```csharp +// VALID: "scenery://tree_oak" +// INVALID: "scenery://category/tree_oak" // Contains path separator +``` + +### Case Sensitivity +URI scheme validation is case-insensitive: + +```csharp +// All of these are equivalent: +// "PATH://scene/Object" +// "path://scene/Object" +// "Path://scene/Object" +``` + +## Common Error Codes + +The validation framework uses standardized error codes for consistent error handling: + +### Core Validation Errors +- `REQUIRED`: Value is required but null/empty +- `REQUIRED_NOT_WHITESPACE`: Value cannot be whitespace-only +- `INVALID_VALUE`: Value not in allowed whitelist +- `MIN_VALUE_VIOLATION`: Value below minimum threshold +- `INVALID_ENUM_VALUE`: Enum value not defined + +### URI Validation Errors +- `INVALID_URI_FORMAT`: URI missing "://" separator +- `INVALID_URI_SCHEME`: Unsupported URI scheme +- `NON_VANILLA_URI_NOT_ALLOWED`: Non-vanilla URI in vanilla-only context +- `NON_PATH_URI_NOT_ALLOWED`: Non-path URI in path-only context +- `NON_SCENERY_URI_NOT_ALLOWED`: Non-scenery URI in scenery-only context +- `NON_EMPTY_URI_NOT_ALLOWED`: Non-empty URI in empty-only context +- `INVALID_VANILLA_PREFAB`: Vanilla prefab not in allowed list +- `INVALID_PATH_URI_FORMAT`: Path URI format incorrect +- `MISSING_PATH_COMPONENTS`: Path URI missing GameObject path +- `MISSING_SCENERY_IDENTIFIER`: Scenery URI missing identifier +- `SCENERY_IDENTIFIER_CONTAINS_PATH`: Scenery identifier contains path separators +- `VALUE_MUST_BE_EMPTY`: Value must be empty or null + +### Cache Validation Errors +- `CACHE_KEY_NULL_OR_EMPTY`: Cache key cannot be null or empty +- `CACHE_NOT_FOUND`: Cache key not found +- `CACHE_ACCESS_ERROR`: Error accessing cache +- `CACHE_OBJECT_NULL`: Cached object is null +- `INVALID_CACHE_OBJECT_TYPE`: Cached object has wrong type + +## Benefits + +1. **Field-Based Context**: Validation tied to specific fields provides clear error context +2. **Comprehensive Error Reporting**: Detailed error messages with codes, fields, and values +3. **Flexible Architecture**: Support for both restrictive and permissive validation patterns +4. **URI Scheme Awareness**: Intelligent handling of different URI schemes and formats +5. **Exception Safety**: Proper null handling and exception management +6. **Extensibility**: Easy to add new validation rules through inheritance +7. **Performance**: Efficient validation with early returns and minimal overhead +8. **Testability**: Comprehensive test coverage ensures reliability + +## Migration Notes + +When updating validation code: + +1. **ValidationBuilder Constructor**: Always provide a field name +2. **Manual ValidationResult Creation**: No static `Valid`/`Invalid` properties +3. **URI Rule Selection**: Choose restrictive vs permissive rules based on requirements +4. **Null Handling**: Validation rules now properly handle null values +5. **Error Codes**: Use standardized error codes for consistent error handling + +## Best Practices + +1. **Use Descriptive Field Names**: `"PrefabUri"` instead of `"field1"` +2. **Chain Validation Rules**: Use fluent API for multiple validation rules +3. **Handle ValidationResult**: Always check `IsValid` before proceeding +4. **Log Validation Errors**: Use structured logging with error context +5. **Choose Appropriate URI Rules**: Restrictive for specific schemes, permissive for flexibility +6. **Test Validation Logic**: Write tests for both valid and invalid cases \ No newline at end of file