From 89dcc996054fa07f4da72f32d25cb89012b2a111 Mon Sep 17 00:00:00 2001 From: jamesbrq Date: Thu, 5 Oct 2023 23:08:39 -0400 Subject: [PATCH] Alpha build --- Client.py | 243 +++++++++++++++++++++++++----------------- Items.py | 14 +-- Locations.py | 164 ++++++++++++++++++++-------- Names/LocationName.py | 1 + Rules.py | 2 + StateLogic.py | 5 +- data/basepatch.bsdiff | Bin 15784 -> 16181 bytes 7 files changed, 276 insertions(+), 153 deletions(-) diff --git a/Client.py b/Client.py index cad592a..5567ce4 100644 --- a/Client.py +++ b/Client.py @@ -1,7 +1,8 @@ from typing import TYPE_CHECKING, Optional, Dict, Set import struct from NetUtils import ClientStatus -from .Locations import roomCount, nonBlock, beanstones +from .Locations import roomCount, nonBlock, beanstones, roomException, shop, badge, pants +from .Items import items_by_id, ItemData import sys import logging import math @@ -36,110 +37,152 @@ class MLSSClient(BizHawkClient): - game = "Mario & Luigi Superstar Saga" - system = "GBA" - local_checked_locations: Set[int] - goal_flag: int - rom_slot_name: Optional[str] - player_name: Optional[str] - - def __init__(self) -> None: - super().__init__() - self.local_checked_locations = set() - self.local_set_events = {} - self.local_found_key_items = {} - self.rom_slot_name = None - - async def validate_rom(self, ctx: BizHawkClientContext) -> bool: - from CommonClient import logger - - try: - # Check ROM name/patch version - rom_name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xA0, 14, "ROM")]))[0]) - rom_name = bytes([byte for byte in rom_name_bytes if byte != 0]).decode("UTF-8") - if not rom_name.startswith("MARIO&LUIGIU"): - return False - if rom_name == "MARIO&LUIGIUA8": - logger.info("ERROR: You appear to be running an unpatched version of Mario & Luigi Superstar Saga. " - "You need to generate a patch file and use it to create a patched ROM.") - return False - if rom_name != "MARIO&LUIGIUAP": - logger.info(rom_name) - logger.info("ERROR: The patch file used to create this ROM is not compatible with " - "this client. Double check your client version against the version being " - "used by the generator.") - return False - except UnicodeDecodeError: + game = "Mario & Luigi Superstar Saga" + system = "GBA" + local_checked_locations: Set[int] + goal_flag: int + rom_slot_name: Optional[str] + player_name: Optional[str] + + def __init__(self) -> None: + super().__init__() + self.local_checked_locations = set() + self.local_set_events = {} + self.local_found_key_items = {} + self.rom_slot_name = None + + async def validate_rom(self, ctx: BizHawkClientContext) -> bool: + from CommonClient import logger + + try: + # Check ROM name/patch version + rom_name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xA0, 14, "ROM")]))[0]) + rom_name = bytes([byte for byte in rom_name_bytes if byte != 0]).decode("UTF-8") + if not rom_name.startswith("MARIO&LUIGIU"): return False - except bizhawk.RequestFailedError: - return False # Should verify on the next pass - - ctx.game = self.game - ctx.items_handling = 0b001 - ctx.want_slot_data = True - ctx.watcher_timeout = 0.125 - self.rom_slot_name = rom_name - name_bytes = ((await bizhawk.read(ctx.bizhawk_ctx, [(0xB0, 16, "ROM")]))[0]) - name = bytes([byte for byte in name_bytes if byte != 0]).decode("UTF-8") - self.player_name = name - - return True - - async def set_auth(self, ctx: BizHawkClientContext) -> None: - ctx.auth = self.player_name - - async def game_watcher(self, ctx: BizHawkClientContext) -> None: - from CommonClient import logger - try: - read_state = await bizhawk.read(ctx.bizhawk_ctx, [(0x4564, 59, "EWRAM")]) - flags = read_state[0] - - - # TODO Confirm a save has been made - - locs_to_send = set() - - # Check for set location flags. - for byte_i, byte in enumerate(bytearray(flags)): - for i in range(8): - and_value = 1 << i - if byte & and_value != 0: - flag_id = byte_i * 8 + (i + 1) - room, item = find_key(roomCount, flag_id) - pointer_arr = await bizhawk.read(ctx.bizhawk_ctx, [(ROOM_ARRAY_POINTER + ((room - 1) * 4), 4, "ROM")]) - pointer = (struct.unpack(' None: + ctx.auth = self.player_name + + async def game_watcher(self, ctx: BizHawkClientContext) -> None: + from CommonClient import logger + try: + read_state = await bizhawk.read(ctx.bizhawk_ctx, [(0x4564, 59, "EWRAM"), + (0x2330, 2, "IWRAM"), (0x3FE0, 1, "IWRAM"), (0x3FE4, 1, "IWRAM"), (0x304B, 1, "EWRAM"), (0x304C, 4, "EWRAM"), (0x3058, 6, "EWRAM")]) + flags = read_state[0] + room = (read_state[1][1] << 8) + read_state[1][0] + shop_init = read_state[2][0] + shop_scroll = read_state[3][0] + is_buy = (read_state[4][0] != 0) + shop_address = (struct.unpack('Gv?)xGO^ zYWME_V|RB|SJ&#bTU=dI76JjWk0Am67yK~)r~PN4{`183thqVFbZOOfE#pIp0H{F$ zfB#?n`OkI#+xPqbgx>yndkESiKEmFw&;W12ZUMoqy&CvZaoSS#0d?; zJbIhtrNt#-vE)VdXR4*ArKfoHB^V3gO7HLtVMx)Esm+CVc+7%1Pigp) zcP!{BFPO-i8+Cz8-2Ca=MZ9e+VixuA(xQa=(!H|!Gi1r8g{(+HS@Ib)My!w+lWZfT z0s_Hj{riIQ0r0UzfH|mq_`v^`1p>f;0a1C-nWeJDV-LwlrC{%W@qe-ZKOkb!77!>% zP()adUw~|q!NytEoJ7|1`D5nhoKP1qh~q`Hu^<3@mi6!)RH-72BB}(0d~7}eJ_|Jy zKI4B<5&^9L%lyxP07U=yI7I)VuuAOK+O89obS z4I`ll1Ga`L5-SY^0p^4u|8m-t23p&cLc+9IMa8|ym5kPfY&H!|wf5#R zqY95P5-0=J1ti9{9haI;!Up1;+;xqh( zg)*}((d%Pg%kvr~!J5BI5s5@7&Df0Ab`NP>8`$xk8cYgj7)WP`i>Utcq3|3Eu}*!hbe!jzcDEVG=5?C>#KL zP+(amNqa=0PALc6FZ>X0_JIOwB9%DLh0cL#*tw~+BcQ4m3PEFnO|Lls>H#*)VF8%- zb$Y@5GkVmaVEFYfyAzQ)$!wM|PekovP!JOeAAlG|j0)}7Agg-SCDV-)?zw(*quUFd zD)kqBk{w8bvS1;w7zueKFsy=4sZ7kL6sMe9xboe_WhQb;tFm2VDMnl|;heiCsB-SO z>Jm_(?qQoGfbu^4=NE6eeCvr2oq}HH#*za?!u;wxYDw0|?=7KJVtW|H?WnO3``8#W zr{cr_JO4j;;-(gY_Sjidzv$upv~ePbHw%F_azW%760(SP;$nr9nbS1yjtl}Tw3~s; zh{)_sE<{+L(ocqzEfn#H+9@>cBTG5iH6`;WDfc>wiJKQT8g)%%7?6rpmXo8Ss7n(Y zyr4MP6^;$3)a0ik?BZ;i@f_7N_o-{m@J_4|c4R0>CLlqatpmTUQ=#o_6MFJyS6F|c zMxajh4@U$>ASQd8qP08<+f+8mj411m!`+SLla`mew;ycSnd2ucNxk158<)4F(b@F+osf?G zs}f0P*VQY<7OgZk8Fa@zMSGLz%AV@ixNj_Z*uI402BTFIPm_4(c2ur7X$7(xT_vZc z)G5?&Q6yj)>Z)1{RFGspc`jZU2<=EIAFe@>>y`n9$`j0)fz!zjh4;(0>FOxQGO5Vf zAS<6Ia@n8=ac-);a2}(Zw-VNymAmDrC=4LXI2Im|^@kzRi0eg2+%Ei$C1)P+2N1W^ z9OYr8edBY$56TII8jjO8Z7^5r&ijMpkJnHKrUuI0nTCXMhb!Z=j#c}}@7|cMUczuf z>N!&jM%ul;SFYvQr?0~7LpT<=FPmz1A7nOL79FJ6sfDS~tVQ1xWd@l@(FPSlEd&$& z3p^8`K9X?Q(2+5@7EY-D&R{@Q(@S+SgMVf&WPVw!U%d}rL&hjcD9jn^&6k>BxSn4OV`sz~@RI!<%@MjVS=7#|><=W>UEtGHv!&ku`sw zC2ffgBspA##`zvxD#J6xzL9_ODT)KUFb8MiBKt{SkOK;=$k0lGHmN^O+IxxaF*hob z%u&?X^2fvd%1;I!s*qa)6j?j)w>%F~uS0c{w*k-PssvUNMj2J5pFJ$aI#%naJl2vw zl^i9Uymcb0Sf&JFHX0y)p4W8e&zxz6nW;5r;x+1*=pY{>o(c-7bmub6r?dd9YhG@C z5j{BeY3ETSy_wTVd5~t=­$6topaV#otTH}u$mnXhs%a5y}uZ5#mhD*px~rRYjl9FXM=8)?7S=Z z6iJaP`jOfgFCqBUp%EE5S%eeJ8zA=g;6|nl84Gp(E(HAl^0+A;PHzBUKH&dww*T8X z{TuN2^nVBT&|^Ls_Cwu$Q;K|+>uvN-wb?3jt66c+{p_xCsSwoNzXS|XhqVxfQMZnP zC}eTkdMZ|WW^t2cDk~O`m*yoegE&nRmLA{(m!1^HtjCnatvS6x*^m$!vSeFR(34^z zymu_(crqlfbe=4hJ%1h;`T(m;ON10^4ef1e1IjDQvf<`}BP-&D$`=OZC0JWqgUBcW z&%)&Jc}0*w0KhvI03XOn^p8P7<)bOW0y1bLD~@c6q=ay$VlkWNc}lZY#?RrwJc*?c z@OWghbVULHWDT%}p#=j#7%Fq{iU4a605k_xmVyS7$;2g_PnP9P6&6-s@==5n1}!~U z=c!v@$aq5*)gke!$xFgun`5#fNEUpE#1a5QH38lhJ_|zz1cEyMM=LM>(Kx7r{HRpb zWGGJKf1Q6o3WOr~*T5S8Gqiw=7=@UBA%%>8JpcePr2y8PLz&)NS$%170fV755DluJ zG(-Zt_}|I^X#df|Ihdt?4Df%*;`2Y^h?f_TeawEnvumu*+;UyhW0qiYEU0n22kfyf zL1@f$RI_?rVc4m|57YF&QVn)3f{*_6RQa$-g~9q){K_^hs|toM$xBgFWGiifLe>cxAwWFY zjL^iw=c~q?Z$-EFpr)>m3?}2Gcmm#VUe*p^jA;UnUPeuhVKF5_qNrRU5o)(H>OkOt zt;mOsDl+m5Dq?}RE>2^ZjA+R<%xe@;3i^e4p~k4n*sz_cmntz|<3h04{FCv9luI-+ zfI3(YEbPe_5vZ#c>4wP^5n(i3gE=N8UJY=*|8#+DT3BQPzd_@wP3i-7FgceT1+yO7 z!*IcJsp5ZvMJ0h%SB_eMJ{6z=kUB8d(n8mX0lwr@M{rYCs*#63!pVD9esBQVgAq<) zft?YovAA>jtgxC5frVD}nnLZ+Z5+-{lCX=WW1SO%?#-2kYmk0Ym{|!ZObRNw+Y?pgW+Xq>#ID0h)YwP(brLSSfQADJ>IN zP26fQ5RR%I4y?kYq6(Ij{e`2cS*iAC08aJ$VDT7bkwcrS7>sQcG&z8HSFxi=Rni>C zoP=7kSQAmIeBZi2%_R}Knh=HoM|vnwEAZV(iHJe9iv~~^$yPBxpb7w>+OB9zIs14UX%vns-bc%Z7wngxrzolM z(rSGujguheqvSL*M1|CMbXZdAOmN&Xh&mlDNXq)cFhF45h?@1%Vj*)gTtBLQtun>k zdCN^v8ZDTb9G8hZweNRliWMbaLMkJXopUL5Wl(~X zdi@Ts`X`+SYEK>uH4~Q)MZi(mkFu6I){qx`b7Mm%4nnT(l-ua01uRs#{e&j{FZ~xB zE@4E%>b)d&FjAgd`*~kheSom?BI12CBOcI{F^DGK87_{kCVip}?|;LbFKTsvBs?cj zgx-#y7i^u94{|oql(L{TV}l~#jROlN4uUH2VnXB{`w_=~^u07D@IW~!iE_nj_)vWU zzl>GEkVM?40nI3_kdeLylb6nfSO5wsxpGvcd|j)_bI(&Ue6ywCrdr9r?dwJWZi=?` z4k=!C%r(8D6LLEg+*Bj6ozavPqH#G*?f#YETL}ciF;h{uKtptC@3LqlB$- zCU#~bu}qQ)-I-o75gi^0Kpn-e^`2~%e^9|Kix9el^?X8n1TIY2a`LyfLMb_u!gUl0 zxtXnYESgHO`Jgj36PpyqJ4<$1WG}0IIQ`EpCXT(uX8Gy-mGGwQe=2?1h7gT+3?1&2 zoZ~VtWX#u1>*+(*OogDmH78P6Z@Hgtl_$CsSq@2^%7W<&#-zRD2scDqcwCJS`hE3E zhk5W2q3yQ(KSxZ_$b*@*2!a%d6elAYJ2=Qy0NLfNd?Dd!z`q#J=KfP$acd1dI~Ziq zPwDh%T{ua^miHyDqBjOS!$c7dFX*8jJbUAHnmTKO0(Q5OiK;~Nw4Mm=4$O1&#igz? z_?M_fo;D7WA$I0hE7c4r?;~?(Jg6KIHLw;cayV1jBC#r_q}4%HW4N9Z-a70_cN2W* z#@0Af#@x!N7Su+RD_4w(Q9pags|*&waf}FpZnh_XzF47`zy@9a(Y+Lua(#upK5^R9 zd)~1$4N_y*hL?mh&WLM)Cqjdk?efOuS#)siw2y1Xp(RWS7vvyfuuG6@ZeY%!4J`E+ z0$@@Q^rz-ik(g~a&sUTxcULbx&3E6s=ICWPsDjsXkmgt&Q))YZ;rW@v#q*#lO6Jn` zT%PE&0#p`9d)#9HUa(DLAsPiN175cBrD{(q5HCgpl%C=i$M<7wDi3#NM75Q~EiV!V zJ5BoM&{14Ty_lJ;Axc#$C**1GkXd54zTRn;h3&P**;3Yob_QGVNP5NtEhd$c%E~rs zk#L)m)7c|@azjjGK^(MlZj?3zIHHn=Z+62=CdI7UZ9+0*up`EfT>J}E?CXxYx>^md z0&vZ~%-P&|7PN+aUe1PAgQs#xY|}(jOVtPw%P%@vY@CWGYyoQhMhpbYLpV}pzLt(N zLRDrRdi5<@;j4s=@6Ry9fzc*9=xHv^k|L>>Ov4|k{9f>W@70j95W=WX1 zVq?}DcAhGE63f_5nzcfg2)GSsTHf_A&gCe#)y2kvpm5YCE3F^|xXzu5*a^K8#XJUjg}hd-YG4*@Dcpf{_BnXhjXJR8(BB z#=}W0Bi~TUQpl0FY_Yh`E)O!t&!p=tjdNDur(H;Oww84QH8N7N6`iYEO4lnQ6Ef@Wq45fHBwO1c>WWf}5;UD; zDD$S)f$brlEW=&{;eGNvbNkVw-Wl=5R@1ufp{|O09AE{GbF=8)Kq|6Xuw(^AkQ27GZB19LcH7YUPwiv8L}cr#JitX@IUPg%Z6~Uf4lx!b5}Fp1QqnrI2{o zmsNP${z@H!WDUt({xcJolbKd1^j_Yt^fn5IK1?F3>^1YG76(zW=gz#^_br+>ZhCBOLR;m9}UF>H;0;I6pw8O9acBLe9p_; zeHL0L3(Vf_f$wiO2Jc_bU1?Q6n3CveTSw2_aYuA2{g)@Ojf6&Y%^oKNQ%|TKid40Z z=jQcGMiaRUq@{}Fy6B4A-n8n5fyeO7Ao`y4ayrWen>wHC?xzUWIx4>B@o-2>VuPOg zc}Ma5zxvG0SGKE_3o~af-pvTW;h+j7Zc#g-9+BCp!opTEkUL>3c+lUSF*yJzn(_>2dp#*n91M%;`ykLa}z<^?!(LLsj%RXNKU5X^e;IOeO zcNcma(~b@;)Vb22d#V#BR1|N`!jY9#=)8>?W~Y<<3mT^1e1azRUyxt;P2=g9d`Apr z`blzGO!#MccpLGV&1*d-r7)f;;1^qSD0>@Jd+mV-3h2wxmq4lzkDs;}gu~1>zsU-L zcbMA(voG=dzrZ^y?v^yAKIjY>( z7)~lz0AQJT3-3PvbXC5R#Zos%Tv@Lbr`65NeL=w%jo+~b$?4b8L|r`JyMU#@4YgR5 z7!2r<0CzPXybV#YR=rAp`IeB@XzQ{(H4y8hVpJt-gRAO*U-6??Xl`y|`Peu(vc{ne zEBi?*)AzW>YFq>_ReRUvPx$gqN3v0t+2@^~APPjQeiuYi+LMRDnO4@88aE>kw&yhm zJ{lMdI6z$>BLWN#rZNw71nH3!CPG6XA~_umE*KFEpxxI+l@EJkDO3_|=_ze?Ed3B9 zN)7QNs-0?@?p~(fAka}#g}%fpJo1RA5eu=kgAjeojhBZpZ|%6pgVe$>vG=y@I2i0# zY{w9CT9N;ClH_jGnZhCI=_-q;E%bQvsjd5_SiGwAzr`2A@KNReOMG$XU%mst>HUAi zm*0Q?R}JmY?LX~h_wV1^zk8&A-bE}CUol*k0x|09@}mNI74uWGei~%w-L`i5ek`r} zhqQBVq3t&_G=r{0mX7$cJFPk)!Z(cA_d4C00?5Q zctc|^B_dJ;4KFghE6A3bFG6CJ#W^qIHJ5END*T;&6Kv#<{*&yq5^F!AOo~CmsxQpftgkDo`LKmD=MMpui;<( zC=QyI*~n8pPgX5b6joNZ1(D?oE30^CS)=_cf(e76@&N!s05=E>0-(_bzp`n51$jZup%a)~>!sq3K<}a-OmFkF~62=IHrOy?i zO2Y%^0M9T>P!+*8g|Xb+ilx@c%UmP>Wn1R0^e>;HCsREZuEelaR#)UCf{H8+p;`be zE)o5!^^xTR{#En--K{tQoM>qOS~OwF$OP(ai3QqNVeF-U#X1`oD;X1<=p?3{`wS%5-S z&`I{=D_M1Wp~bbfafbjZ*8;1xT`lgSXW>Fv6>=7c@FOyTCb(h!bVpI{h13|KbQJqn z^#-&nv*!Z2nm-p@UNm<1M;=Wbdi_S0tY!xzNOupEE_Dwp7jsu%*c%l$ zhH8GFh8;6OGNg2p0RG4+`b*dm3`HOtcq;VNiFw4Hzse#)36XiMe7FJq6MNerp3_v})QP1`xk?+(GV+T!HGC#Pmq~!GjZNI+ z1d=}+kut`ko6h&reNmU>^Z>;hj*Dd;_G~J^J`7u&s{%MEqz8 zx4P!NO3oZ!E@>!xxG@xj#hH{F?931m^v}(OLz1#=PGgC16f)VL%&qfn%z6k={c0V2 z1B=pm!I|pap|;Pmp0JTKNZmA!%gl>#c}h0YvX<43&2g-dy!fUc--{0+YQ*!DR`m9T zdiK~o4Cb2)@*;m|BwydvnH*ZV!_`Sz_D5BbkX5|?ZG$xOIMi@Z!mVXr)+Zc;Sb}4e z_3E2CNO(Z^o+s8IP7LS6A*+fhdzL5+hl^S(8}o}#Y#kx{PNTGC^UdYSqgLVY2d# z&ivzg(24i*9edEUIAivCGE?I`2UzSOvhW@`rBdrMcco~;enPc5Ex5SL6D_o<*z3z% zt?4KZI`|DeC_`;GoUEB}pkypD&!LI9GH**cnr^~_AfN~q8ksLiPn16>n$B3b!0Au(gaN29DlK5n0}Q;k7^1*o(OO+4#>3y zHAZKDl2@b(I8hHvE?;daXNc(|p44-9syASu1~=W=Zki5h8VXwm?|{OQPUiCKkUT^lqt&C6kba3n|(M-*w@6L6sr}3|E`K<4r?(P<~ z{gBqj#C0PZmDVD%rxBDy!^6Nye5}}LQfe*n!W0gP-O{E59${USH&xqLz5d=ar{#`j zUdB6)of^9_b1e;OZe~ifS<3@^7 z{T|2b*3iV&#k$(il83lO1nFqW)EF$L`LY~DONIFH9QL>PA{@NDR=a~# zMwTV{1zHN{pC~4td@gqY`9t*eBVa zTc1M`yC|t8*H1|Oa&pb+2-CCSMq{<=tpE+|Lq*w&eTs7L`J?mX#*$VBau7$616dMl zmMj}|b8(F*Sxc<#Np`JRwh+SX$4JEv8JuZq9*WqO;Ezo!4^GZ+Evu%L?L6Ghs9E2PJOr$qoqRkvou)*G}nU?0A zf7c#KXl5V3X3V-jp8By#qWGD>tJQU2y@`;^L|ZXI5HVQRlGcEm!*aCLc1|~>qzMDX znPI(cAaG-P@bxi$w)B~%@Eu;jIhdh{C{A7lSj;*-dU856GQ7Bt}j4A8^Lpxk!Uey`i?Yr>=@jlK7_*TaK!QSg*;bJ`(|oz&7A-;z+*ERw3DYHmeCq!^?mhdO`MYWz9Pc;_TG`vV9?>dgkSerf~gjI64Ladny;<^ zx+3_2OTmvtlu5B{I<6}Ru1=uiSX?cU8PQDRJma7Zei#X-VI8vLtV}AepOl}_GH*pO z6-c{MMdnZG@Duo0z*-AL$ZF^jHHSc#U~x;uCV@&fEm_6RHuruI$CE#I`cmWQBFuDq z?smZ#{H*-QJ8g6ICrAtw=3y%)=oT3wNB#NKIi-FpSXEBj)nHg>bX~r^F*n}zyosKr zD?7s)RdL-(NK$LVfNIlJA7MwwZf+!5vVU{ZZp&%!>d<2!_te4fHS1z*tZpLITfcHR z?e0x;ibEpB_nCaJfB#&8Mz+3|w+JnWpFRQQon66F4|Re6(?iLNf;PCzbd z{2~$lISY)L@zG|()12T&VpW$_4kLIH`5`@IdaBx2ED!5@1<0YREF-$JR zTN-D@n^CK&cci&)AGNW{j!aV9Yziy8#>WC{p`1+Sm?fblFzv%>n-C}y%3sX+jjEOO z6Q&WFmI@7Qs$Io~sa+U1276`c2#C`0Fif-qQ3&rS?o+6R_1T^KYw2=pG}gj7tvb`H zvXqpI@xUj>5)ZNbN~jsa?uAVYR3oiFC**D=KlVdjD{jvYCFxm_s5torUg_qb166`X z_)7@H6`Z`^KaR-yDR?oyF@La#Tn?O06@a^x=3Pl~q#?+laqNs-f3qW;FiG8a!ysrw zG*g7PcWHOEBF1Ea+QbW2aSaX^M4!s(I^KytoiuPndoE&B340apQuZbCKQ4WcD}a|Y zUR%xckCDM=O9skfm4gi1Z)jB8w{$*F{0*GpKdZFV`_7*;xk!|aV=#S~ALYl6tW7|B zuz19^Zb*Mc;5N9~k8vf<^+^-qnmn>`OF@*OYj2A(+{v}-5ceUxwVhJxGH@Z&KfQ5-D_e$b|z_n~0RBNN45e7_mFML6bjAd^P zoZrng((AtUE2VcGxsLxj!K`BOZ6puLmDvRLxDdaSa1}jjtN#R!)aQ9=A8ikdM$c6?W!iI`(H9;#(LNXK=GPAr=hj&;S|`*q_y zr|c`ZFt+$4A(*6Q6v?AyzX=K=iJ$eX!O};&9x;mM7$)X7w~=fVEI-Yh1y1@zJ`B~nOr160`Q;Crt8|Rb zSg#mlPhWMlaC|m%t_2e=pyYzHbG-yz5Z#M(XqdS3O;SI2xZP^1K3Y2FM#e61A%^0p zYdA?QjWr~$-n#9y)%@9`eB9yWxWD;XUGDA}Z$DjJb122VY``0ok89$pF2gAT8qlZp zi*p2iV!s`%7qD>e9!Gi>O7Onk8H+|il5s#OrEzJNhs8AJV88EqrIzmVN>p)thfrwZ zDzZq{GXB~p=JqSoKtWib*KhZCabhuw@TZ)Iu8!n^7+3CD8aQiWKocx1OcO7U1>pOh zjZ?Xpz1Aj2Bda>|D?Af@$0e8A;AcWNDO3(g>~cPYt-oW+qp1nQW7Y>^jPobK7EIRt zD|Fh6Tb46Ri!)?U_iN9>yA|hue=w#0cnq7e4;PZ=9Ll8*hsrPsZ5}NoX5E)l>rG?A zw2shIONmm8x#cZkkoNco&+7c!nlE}Q?Nz>#lIm~_3ZUXMHS}Bb=aM;UbV^D}4#OB6 z^_)poyBAdDDrVC0M%K_XY%3+U`WUBbLen%njshhHSut5EtRV~`I$tX?X#=;VxcQ~F zMd=D8w^}mZT|bZhv04(ckNV#vp;X%K;=)Go>itnV>UiuVdA;m~zdv4|-?zV&d&58* zv(wy!=zV6AVi045lci2np~U(k6JMUW-j5Jny#MNDeB~R~IAU8~r1ITRK4(M%+P09r z0l9A;Ml&p13DU6bZ?3G(3U---oyx8^sbT@q!$6Yy zvRgYAzDo)fr7MV}RMB#rCiKN<|j}X4butoj}nJu7tB_{{=Ex)uvACqhh9+pgV1j9@qydRn#I|p9fn23Z`zN&D6{b z!FWtshTIkS^{Y@IQd&TpZpA_rp2u6vS)dVK(`oyf)VD=leC^iKOXJoy>tEe7tBO3# zX)~)#Jm|jCHcnhzhqZpt=~35)T#xSKZ~B!IvHss>P!v}PO-rw7lB$;(fGsW1;yBNI z8P?}VFR#$i&b$r(uG0}W1Cw2oW9e$X8|N0QgI#WyZFXwNAE$@L<$pGVoL7;$5HD@( zkak2-9$1c#sXElP=@=b!2ju=*{Ck>p*cDb{)Jhvx%wsf*0uiYxU+ik|SLtR+4{mZ#&`Ahq@S34#8sb8Rf9DB$MU978T74tNxX%+maL@i@|j z{Q85a=d2Ip+BJE7HcWVKmnMj@LqM(~tT2**V?Eu_ma~JuQ`k7NvL7fh)*=WMa|EWL zW=D}p;o=Yfa=0J*E|Qg;9ghYx^WyhQ&>NBCRrz~jUFSA?fc!OE!iBRJ88&IbK-s78 zTBdAy$rk-(x-7}Rz5Fhpkr49wFkvuA zfcj-}tx>2}qtKhu=uM2GyP7fJOk^D3c~Jk&LLiY>GrAPCcYedx3UrmOBaQL@ zT5_C@>kZ``lxhtFVmXf?np;-FOMCztU*)%8E5U^K|E5U&u(!?sbQ zT$#>v-@s`9xbgOxed{k3=5CuCGn+N{I{m#@eR|2T@n9wG_B&O-r74QZAzSBa>$vj! z^cq#{DCILZC~D1%Pm8n(CtYu?Ar`Z~^K9wYl9T742QcBJSmK$N*-{ex5HTKC&Eak5 z%+%RVSP}2I6~?!o{rixGz3)Mb_a69ys{?(e`*lSlgxG6fCH71!uBi~t5m3OVn0UQ4 zU4A~GQx4JDivc$A@3@N~nI_u^oWL0{YAZN0ES!@PUa2&+>lSlR9^aPTxOqqEYJ|La zSrfZHrz&tWygZCX+_hlw(#>=XzCnm#m>GNxoURxjRbOEB=Q zNF;8f&9p(c0~Ut3vAT<)p*=dxJ{^6ri`kJbc!7Q-5ZE%!!QZe?o}VJ`E44ujho~4P zyLZI+N!4e%(2RbffiilYcCtP?Z4g?Mv1WD&HUA>h)+ITmBIlZFV(#x`^JgOc7{(Pz z6|)o`5nnYH*bS>IP9IQNn*?*$AXZ^Z4=%i>_%dX8BKn(Et%^9iK=&=;SWcW{vm38` z?tn-BD1acw*uJ^zcMcC5)6h?DVZv;kYs zPf?r;{-<0~e|H0Y@kgQ@v0fWQY!oe%M4ElQ2dFXX%x0T#b3Wwgq;&dXBID9!eM`4! zg<`q0rlj$f4Ar zFm;9Y?o2FM(OY?!L8alf3M2E5&nIh|YF(GucOPtK8|JDa5RtFne1A;et*Rq ze98M`=5{=`CX;VzyWmE(a_ZSUi6#PRS@cdgp%rl$6v3$~Q_8){B!clp03}DGZ6mi? z6W;q84_ttXSs@;quUnHi@E?&_J0DDoYys57!jt85_%q-3r<_;6pe zm4F=gXFxHN`7x57M|E!D`9ZfK*fXZbT-X6G=CAlTH??d6cl+r4@^aTcQaiq(7`-m3 zE3;4UtBVVT6D9DNPiGMD<*dsj48i^;T^K=8+DIMHnDTxQ)ww(vr;+e3twEAc=ZEu_ z$sn_-dhfGEIN_af+EFd3OHPhHqFm&2CZ+5{zLTp#@7&UToXzxS@HNnk&`VB88xs_$ z$jOH;pS&71NTg6Un=q4(FIN93Jkxo)-|@ZSO!f?refi;P-FW6d%pT-||m-fuVehp$8jLTP9* zmi>14U4v$Qr{2YlON%bsa6%Q^*S&qswshH$HnE*o>wO|FoeGL-xc#0pfMJI@&Su{aRS z(J5yG`?UVGZzS4-gr%50Y2LISRRWtG9+^3h;(D0AjA-z`lFe5Zi zZGBjKRaF!#WMSTxv5#ERqzGk(7Y|ifa=1w=ZAfQ}Y;?SFAS}xsqvROmZtLk^3MUJ+1Koo{@S6*ZU{|BF$AV%+X*8XMi@TKD# zzv&ea9vqSPv#V-nb{ej0MS_gFcHCIzi%nU5{XIQ*PS?5NEajKTPc9SdmaV01eZCGj zzpl0zV`+Q^&AXe_h>MdNL3W8h8q>&-TY%~_$xfB#BygIRyL zp`~pUePI-N;eVDP-=U)r0dt=-9hyCDeVj(mskk|KTVb=Mm`HB4Sx{ z?ZDc@B!#OHRkS*HK**OQmO`8NfFuo{Xz)mFTcd zmt>r^G{T1c3xYLe5eL6uW3jb&mNzQ=g@q zG!^yod>#wO+grT;bStQGAr!${vFWkQB%M2?ul0b?_0Dy|_+9-^n|!bko80N+9aF}Y zkAHI{MzKJWlBxBRM#WceS#GR>+^xD~j-JVStQDk^{5)({xp0EjYU*CxZ%YC)2xiGp zppTHqOtXwcs(gLiq09E8>#w)&I&b=Xx!rkWbht{4H@qeTxrqp-zX1XWWUJqPsD?lJ zR)tVxex6U*?(&{ZfNx7ZxbWkhxIRNQT&j7CdH*X;AX?S%qV2n7)iTQ}KPji+2}2s~ eg0~|W*IRofQ; literal 15784 zcmYLvWmH^IlWk*-HSUeOdqdFBSOblFa3{FCB)GeKa1HJd2=2k1-~U!}ZzI4fsmG+LXZ&Mu002t+ z`0xMZ>?{@lY+FdGj0KDc8iUMYAxRdM2PXk+<_aMYh;4~94Ja>ItN zEgvxGb>?;LKk`2c0D%0rkBF$uC|)L*x;Q(#AbARzMXj8DJ&jNTg#f@fEdSXKMku^{ z^#Ne4R}brTm<2$f|8*Gr-_c(8ylw{k_r?FS001DzC?pqKGA)U*IFtts0HvkpaaeA% zkqB%d5FivsQ?e)up=1$o2aF3{d`(&!cdk4h3;cQszj`6WwtUgX1Wn{oFWl+$V$M7# z=F0^0U2%g_PmA3&)l@4(!J-sQJ}>ojEG#@J#3*c!RgOF)%28}GEd~_dKQaK*XXY6k z{NT|he5Js_>D`VJZpR1bHDk~`k$X$vSoEP|;N2*KQ#|lu@(cxT39tzQg`ou*<01s( z;c@i!gDmKOU4C}Cn<|6XqMLxu*_fEgq?z8Ai%_=-?pTmcW8fj&Rq+bR16cy<^p^Nq z7l9{iHjQ^C`n9nTKKgVz+GsjNT0BHVGCZ;!+_9*zs3?>^T$Z3<5c1_%jNU*r8aQ2$ zRtGnC-b7=M1UyEXQM=YX<3RICq-J`!Aq1qqe(0-}{QI$bG);2Hlkb{bxt9s)Ba;cZd>ir{We3SyO6h{%PBmHg!iWr8?l8NZBRo zb5jPV78ZBVv$YuOIl^}_HQc6@{EuNCf5G<{J0~iP;K}`(IB{~l6}bcl z4iOEZ%nUSdc^)AUi5y(>f?3O=!_W)~)6gQSWW@ZQZQb&*6Xaj&DVf^akKy$eB~)IQ z9Sf?V&uFEV$d4^9`mt%8un3`2eJV|r4ONVJcBHyGeJMi&&8l>dCo_Z$0g*l~Xf~Q; zDsRMS4mn*b$`dmxu3FxiB7uoAJQ5RM3OtWDp#bSX|24v?_?S9d_+ z;xUSV)wTarlu-COa1Ec$GV@IT^pZh|~o)p2`dXO%_@YX4S-CkG27oE&;L` zvhlAt5fH)g(Gh5ZR34PUES>YmSba3;DUh1?!lmYA^NdV1BjGC?K*>_HkwCC+mhh(x zo?2llH_Q=OimaS8`znBefn6{xtXmniGk5U7L#Xa$`C?(_o53nVfVGKhOan4IAupoV z*-j7-2tA&{%(|(iv*#wJO3}yGok&1dN`a)az`Jz}PEeuhl8#7p6@|Z?&0fzm;iHna zyjgAdB`Rs?tXh^WYlvYDyWK2TU~Ma;ybxXM{>(G~b8hh_X*%4OMHVfJGh0!=RHpV%zYVcqsEYtA`&^zL@Z>12V?pUXww~OG~Dk-4R zD5lm_)Mzu8{&YZWchtH1&$WPm;J=y3KYm?SV~6>lOipE%uNa} zmY#@k>CLuKnk9*_6~%}#W1%=u254<+E+cJW+oJ$nf7~Sf&KZr!$5gm8qFyB1hFcR1 zG;*t)prc6iL&TBe**EK1%bSEx4t9`vCHja?vWp6`2*O1uu5GP51iSO-$NndV3kFaYsS~8s_rT ze>@YXzc*)D&l8GEX$hwP4RZ#JAC`Rej8<|2hb6lzo-9{RHrUb2fzaa0vYS}NIh!eg?f zceS3?v%@s)5}vITCIPjoHjY$`hryar;NyL%@x6_UcBv>Vqgd`{cZ*d7Y6^n=T5pb( zA!xg;xD6@&CwrsRb|UaiGpURPGb>A?nTJkMyESTo=3S`I(ip3xe4a#-`mfz@`yjF( z%T+ZgpQuZj7^W>!7pvykG%gpWrRbVClR5C-b`vZrP1yb$fC}Bd&{S&*DY1bfCwqNW9gOIJp!o53Jhh4PUY>dq%KP#=K~_D#024 zu_Ng`O+Rrsx@xFF>5T4e8z7plHw%`!A>2ocU2lW`DwkH5wq7S8ZA}tqiA3hiZ=n7T z`tVDx$~Cn|TlZOZ#C+T^sMHB&&+i`PF8J=EcH&i8Pohf%lp(iDQzh!h z1r_1qN(Ff35jl1~<%_pL>o&NSbLC0{%$2ibf;mifeoBkxey}V8*f?rouEHsnGFm)> zT&QGYsp?m@u55|H3a9F@duK*DM3>y3YfEoN>!0#1*{*V4Y6%A(?vawC^ zlNO*Vk1I$%wE;>iBS}NS<^Y@5EC36yS-^s3v4BA~0MgLK*Ek4;uP762vwhh;SQNTF zKwpsWTv3#M`KuuVY!r(uN?_9Xqu7BEqs1^ZuP>9oYgd;tOUq$lm@R(X<5NVn7lo2%ZaPDHHK%-`_uk>KUnQ>t5Kj}n z2&h-1+7!3TL}p+M&Z*0_02~1gS&*LjOVp4XV7yw2tUBs3tg>&O?7&9eybiDTkf%oYn)V=BFdMyGt@uY3b|)xPLct?6lpH>W0Zh-reB)0 zd=QakRHPn$6Po}HQd$soDPf;1tPSBk@Puf<^cd^jaA?Vtc(y4zH|SFf(Xwf3|--bIarrp!Yo3HDi*z(1<26cV-R>K9hu>||YZ0%HLMTL}wscZ4^A~yzAZ_?5E;^A*$ z2+jfA8)WK&XijEPp!Yi^K0%qhQ2ZMr{AD`-WLe3ks7k6lEjej`oFpDHmOdH=wF8QY z4n|E(P)tSx;MPF5^;o$jm42i4MkHJAVY2w6|*j*?YPGlbJmEA z!m)#a7#tJBf)*Vf!&ZGxj)F`ihsma#kL)4aR!Dczh%5s@B1t?w#*$>GW28Z#F{VRP z3(|Imz{*vkv}2rHa07f$EH&q2wDYv^J3f1)Xn~LU_VSeg$N<2~8H>J*QoVhuu>3XZRb*-8GG4GNa>y2 zw%oNhZeNsw)OR)3E;7GXdLZ7SJT``|ofb@%bA%`ii7dXz0s!jO4_}PQ2$4^cAK#r7 z>U|rW730KXj4yJaGs?*2`_xWxZ}cNRzxsu!2lvD&9QECV&JV^x1 z0YyNyLSld(zHD(bi>6Izm}%eQL?v9P8%i2R{6j$zZ)0A@kPYzw3Gp($qUyBgjoM6< zMP3k>;e*0zPWpJMwp*2V+Ge+fVwT-L9~9Z!fOIf2Ge+keNc3hUcnmdDJr?^(gfDmRJ#vT(GK!Kwi?atSejUYc%?tW6=Z0?Y33 zhSbp<-I=;w3o>pcG7*=s2t?$hdr-02*f>)mA~tUg+8kR|)fnzs{+8B?8Zk#>BC&qv#{;mx1c{?;wJsc%< zwc$!&OjZ;^wC~2C5el(f)XCEg9?sH_h~$|jolbgUPf>GlhC9eI69+|m_@Ks$tLi#& z`o0@#VFc9*TqS~8KG}#*RobEE`?bxZY$r9*m|kJ5pBv?#oPX1mI&P565 zcpRDIF;5p&5yc&$BeESsFrDqkdi?xCQy7#Ul&?n#>vKGehB~9ESEmsxic1Jw+)Ly8H6WO<}1|btSAAS|u z%D`kj+mF!-ql**+U(gVX!7>5TXB!k7R7#7G=yt0oECy7U_s6mfZkS_T`Q}QiCkP$B6)`oh_i=z z2Y)D(>(G;}+LrBTk^W@lT@WJ};5dOVf2CfuMJSmgU{e(7E)R`&o!>&S4!t$X@aUsz zQ6)$g2g31xPGhXuc1L$>j0i5HVp0B!Ce$-RTl~S4%dvQJtO`pVJ@IWBC3p^ofjrQw zek=hOIc?!-X@BcPgFP&Yx`rUm{X}Fm;xhDV8?~(Oa~WW=k~Cuf zVXth-CEsEn#F4cVzq~0Nube+WvT~v+J?i991Oitm5pk_+0IPl&MQGMtxHa(H~iXLPML6dB;oDg z0C;4jLBHyM)Ony4_X~~B3cOB4K=jr^Lq>cPEz*FY*zSbov`WEhiwJV9gw08g z&D@1C%JMiS%YK!~OO*%*l@W!Cf-JFoK`A{qJ%<-{3mjhPYiVuOo`qhU*eMTL4vXdq z9-JF;e9LHs91vh87IUrv{{4B5e!h?3*^Q~=FYnAEWwGcM^@y$gqc1nr4v1i4{AP2Z zR!se7lqmZz-i%gT5F5+ovM&ZqmxLhxOgDN-!j>Z1L~&0H9OY6%-(PLf=r&@GMJ0Vn z`;oj$bt#r`e}hbyRqh1~YZlb3tIMHz#q5ja4!0)yT*iY;=W09J1>REk96PS~rfX;H zRC8SG=-nD@oU=cjRD+BFrx$i*%cty+pg3XKTzmR8I=Zbcg&^JcWWb9{I_(>}55_2h zSn>xK)bf_Zs(F8_TB51xFzE7xmRM;u&QPu*vdu_*F{ys$3{jQ=Uhu3FeW{u1INl4O z|3veU2mkr_;e^AXuQmk~-JYrqe3tgAs>$LiLA{8OL7)dW z+Bt!tFq0y=;4hc?OUZ}F zU^l~Fmii|(^jD?}{)q6FQQ3RHktg@B{9{L=APjaB@f-_PQS->uMwlI$k^6f?$5?Fc z>cM4mk8gG`NsKRf1;QrQUyq>~zo*M|GR(enqkrZD`r?ro91|OYok7cI(se0R(2A}u z(=$Wg=22lDwLHa*nQGcwZ#e;DyqjkoYbv>o>N}^urzblY$ea~got>!j z4LqZ$oUGl^wytk%sXJyWRZGJI_xOQ~=D8@VpmC1LZg0aLG35@W`+y}38u*BX z`p4{_r4zxI;haS-i*4qLpSccS>*gBR^`P|*|1xA$B#)QveAxDHdK8(a zh>H{bp&bl}9V>ZvqG2h+ckP@Syq{+RwLWV%%8uTsgSPmuR_?1eV}t! z(D)uJIYCwcuH7Bs!0naW-7jODRJq%B3znlcX=qTb=evyraoKA$F1fv9uwUnQa zYCZk>q#(5`VNbhy>WW+|jU_TKpHS`)K8u?ncj%XSDr{&92xO4aBtno?Wn-x%i(-qx z)@NY>TlTBGOG%vwA#Z1`&3`a^~M>SgRc$s_IaBOFbUIIllH&>;zJuXPKO#jzm_Tvyd(f-L@u{vntOgM}(X*0H2)(0OLZqr;es z&3F(cqab5oTjmqF9KvViq!L?x)>B`yB3MCA=mb?EWE~12`%evts*qe07W7IhAT167 z>@0(_W&yN3XkY?pPC><~L)8gnVOD^gWq}vAcpX;|UFfJRmRxiY5fKEKYsEr+r8po+ zi#SWX|HVOoku+yR)gg9l9{_M?0kFc8GGDehU!vxk!l}OomHJafnxk?h1WQb9LE4V0 zEAv0!CVd03Zm34D!JUSjZz#7?U)kAhJ1g`J#ZTjdHOg z)9X9Np?rbx4s3hsD|ed6uwZ9fk@ibjnM$5Yy{Pp+%+9MI(Ewfp{SGeozAfO?CCr&h zE0rc^PbIam)P@ZQ{D(&r%pJA~-=LfX>*_MmQ0K zcEo?BU(MrH3zaZbsg#=SlIXrE!80i7ltGxUi%w@6n-ZFn+Yu}3i$TQ0mx2y;@Dc#} zr$&@Hbu@)@L$1ro2q0DPLWsTc^J3s7$GD0UEM>JHfd{`EJ;tBZ^ zLIZPfnW=6)(B`=0`JoC#IUrD215jmvl#~k<|L*qP2n_*)D76Ni10p)pFBOJO)SGc% z0=_K^HI(HPmL|{LQ9gyHimEEWfz#e9$7odVJdKHl&T|B+$K6gMQY z-wC|lpV_gR%Kg<0Ba#id8i3)N8IBVuIm6-b&i>{&toq$^2n|qp(+Xl+(O<;CZ`r zvB19ncl-Jq>G}K3gDRsmH!d)kF=H+_r-hS@zx^#OaEWcd$Mx59M6QNkX9h8!20ni? zDF?HND)tl{vo%|Zv8%CcIN!5*dSs-uTCGhtHdVCUtzMqP>Bik&ot~Dpq{Wh5ezL|^ z9wuv{Sc09Fk1J4DLCav=@eL27Dbv1OseHAH4bOG&L-0S`UXI{ys(=FOqBX-0C0b9t zPO?YZAFZ>q!#YXPqR5=Wj45BOCo_L=m zAel+rEX3QeEVg$+7b6Y7_VvHLEVx!7 zIvJ=*mpMuT>#?gO-&7HV3o(%}gaquHD~1hQ;0?5bvD}R<)fU6k4_lz@#?SiWDNMx~ z9rVg$cpomujYc|YU=6ebrxLuAauwX6BE51?a=gXA;9E&A%wqgb~XYQ zlXqMUu~mnRC&FM+SlklWF!jjJ!6F)#%}>ot)!)N>HbYD}fd_;lmVH`NTzT+*&; zS7L+<{wcl^s}*2%+8#QlA6PAl+QreZysJ9fvRHavO&API*#5fh>$=aOpmZM$d4#pe z=t2r_9rki9?AFo}h8XL?OxW-J8T0a7Ff~{hK^9d?$&w(hZn@YxDOr*u{-*U&h6uw& zNTm%)`BW49F0kEq?k$I~EbiM!xZXm7DjKD#XvX{A;YVu3h$GSOwr$vzNL%m;YX;~b zEU~kH{PHVNqtw1VV&#@C11}kPb?o% z7VuP598s7A@y{?KlSPOo@a7uXz`&8EpIw<16-Mjl+ch%srP4}fMbiUL5Be`7-yQ_- z40GGgI!6mQHo`(t_70Y{fqFuVMONb;W%PDdRh!4O84XkAGI+SPUmCL7FZ0WklC3x0 zV3=+^G6VT4Z7F$sDU0JPAt6nBAr;V~C>i|9IkZ9C(YJHCsTbY zG%?PIBBto3m1m~&j@fCP6~*hUI3zsOf4}b2uX_6n4%rAn+0O9+_n_!8;?GihYH>+q z5!%Qywn(@!qCrwFdVEAco^-?|BbwW+O~;5dko-B0Bv-Gy-$c%t5apfE=gH2`Hm=O7 z9J^1y$hkfUw+B-=O{0JSjn}Z)hs*m7*x8O_-^qZR3iP!>PxX-v7f9_Jj~f*wzPMG-#|ZBnB<)e34}s+!Zq%@@cH{8GaJOqq?X^r z`x+lafPJ8E3dsG@e5S9>HKl{?)}K9b>c=;)nlm%MueQ3g#3d};x4knnP)Sc07u0wB zgptmU0JXOH3Zk)l%BGt81l_Srv5L#r$66;$7PS{9ATCg=f)^~VHW>#=0C?d~{~pRJ zLV{?#6i`YXkPZG6i;JdrX-a2#V`2=d3Y;q`8h~^0lJY*#t0N~9ZDgt(kAdc~?9Btd z{BDf;9K+7@NMp{RXai{E87%oKY~Ng*P+!WhPBfWuo<}E4%A;Sa8qy$@!M{a5pf}XP zH%&CCx(oAe5UH+*L(Au-%}F=(^tgds*RXfLjX>)^L+$lXa!|sg?45~WUcaaLn-iEg z_gX#)-TvW)|JICUo(qrB6TVtzSw%&j5g3gW=48Vmsg~aYMFl(j zz*WV!jAYUget(?Thaj{&)N&kT3BW@_D?_FxwW<8I7;95Xz#t6|th13u=2m2xt8-g0 zg!`AN8H6(uD2BK*mZ9hK@1t@)cI(Xvyy5s^mBAZf>=9;#&x_U4TKblEBsM8@VK{GM z*it`05<+8&z29s|WF`mYqA~Uf31`uefc^BgW?(V)pxBm3i2NapbfmbPaZ_uyNS2%H zW=v(ZM?PIYo!KeU7@089u*-tUb%yZXV4a}UT+KpnK%l5FVzFYXUzq5CAV5%O8RY93 zZ`q!!R>^2=t|R|V1XhBcrEX1^YW<)u^`AwPG zEb*;`nR1ta_uaK}yDJGcbg{oG4o1076UydlRfloF)@Yl7E~j6Tb>o%^`RQX@`bOo4 z0-Dvziq6{xa?lLkUux{nFSJuD?M)kgj<=b0eg_Qe4)1s1AWcqbmAmtMz40Ggu+BY~ zM0<1!j@yl@P?=id={Nee<|BRL?i)lknwFe6xssr6_A`n=6oM`jco^V>c~V8oqC!6d^#w$B5Z>u(mHi@S* zc$Xb&%B=U&*SU%FF3Q6>0w{o^jEI#;vPq$0OltD21qaI$>$$e3JHu0#rMPNe19xe| zvQwdz$z;*`t3R*!hmg6Y^qkX#r)#vWf*lJR*sj{N<>73W18$(HG!e^9Svf1Y=!*fl zsPA**g%fjgdnfxd$-cy8WkWeRy?)j33bW9UMCh~+;Z8fH$Hc*@%MY3D>T&_=&y_uO z6}=^i6oUu~%JV;cy?2X27}a?<`0obs(9Dnzylucf_~=ztoH_m`{n@q=L;XlP>d=M0 zVi6woE{5q4-^avvrEGKy%RliMn+P9jmPF^pVU8?bb;VuY2p*Lt|Ds&kL}zBk&K4_~ zb&zt%C?aFZ`iUw$kM4VZRI5=sw2LO>h+P{$kyEK!gwi>^Fnsjwh;KUOtsCE8tyQ;d zZ#vlDn^Kf7WL`ZeURRQ)G0pLkLMIsJ8}{yRE)H~DDW-52MUrFDNJNS#LU(Cr1n*pr z>3$u3hly?7UaEui_DMNaK}{w})MD&SBM zG8e^3;Pl#}GK0H$$UEb6(cS->D|d9)N1^{Cj8erh%^^1_UE0UpT&fOjyMVCiS2Gr= zTLOt7itQ4wh|;609tlj zISO{!-5j6oE~WyY*~vv$IQ^;T*M*DznwqSl_e^`wW$xk+&(|api&0;-y{nxAHw3Bu zSO0Ea8}MnkuF)rad5)s%Ra5)yj#51#0oUCaRX`#1nIqUvkhka6_(oiBcGWHM@K>Vq z$hFPU-PdZ%%s*qFa@rzGhEGNLcTZVKkz>jmg_-&eA93=X5Ar^8&gYL})q$z!>YYBRd@%YD@le%isnnp`Z#Lvi;P2oL`zv-QF0@i(3FFAI2H+FU~3vS_?=P&G(6y#6c!*1;6@go=WFwfWC z(Mmh5K8DEQl8y$m(Wru9V2q({t^AHL8veJnd}}7#QHuV(A5LsYv5Yr!*J<$S z39>MCSweYqJH!t{n2uy;FEH3Qhu{a3z?V0az35o9U{rY{6JfU=9lv|L2t)RwD0f1_ zPv#L0r&5XKJ69(%A!syW$SyPDV~a40$Wl+H{3uuJaU)+|)HfwV)Pa|#5|Z?^(J6CL zL$R`j=$XVzfuB|CyAE5J?DWcU5Ip?qDz2WebDN+3ZP)J=7)%&k7~3&gS<L+lRd)f(H!#(dvc-q~s@WfI3KjK$ow7HeZ3fF_fBM{wlr#&^! zqL974z5SP$jC8NBZy;@t`sWeQ{?1imgut4W%Zl%-eR`;3@WWOTvLtYxMuyI+*spA9 z=)UKQ(dU5N^smaHv+I^8!B!ctKK>?mpJ#9Okea?H_*c28Mo9!d7A<&iT1$rWkd#nr%=ev?FIC^Sjr32(kGoCmGld4v^$pW> z^%S{5!{FpJ5dl@%s6`2S1PrM^-Egc1sRu6+nqIaB4ZnwCy;bGWv-*32u%t#Rar>fP z%~!$hHo@pN#E>1XS8LCTA5dJnrj_D_e)UD?4etPn)w2E1m7m9=pp8Rwb3#8qYFYF& z6$*}XqJR5aewd!of1WnDPeV$134Zh{xa*_q*o(DIj?wFR-n;2NZ!^bkcYS<#pNJXX zK4$HeUa+*8M5;1Aw5LV}wM=3F^amz%TDcGHJupTuHVX}xI|Krdz*KvaX5?wc+*BLY z-DXH94?iw0AEdt$Dyohz?)i9pAPITlP49u-m9O6M;pzHc2VOAzg1ESR*T>An=T!>f z>EA(5#y=dxj@DCK)YH>wtLQVQ*r7Dz6j|!bGxoeNLF&5e5m&?yc!JEYBA%CMQC1D! z%Vn4}#DRpUkr_ay4!ev4XI^46Grvb_M3!spP2dg7T)&Glk}k3}Xr>NO@lfB-Fsme~ zyy^Y(srL6`T7hz5=xTGzO1xoD6vx+_TZauix2(p+b%GE}Y#+3CKHyvXv;G4wdA~4$ zoyfloxNp11Cq0ZMn2M(??<8UmPcQANA$Km_tvMIk?b5}m5Qm%GT=*ZWynAKsLl6Hz zrmTxa=NzrjPcBcof3r>0+tn{s^i@qHRV%uGSy}N(C^{Z_<~`LnW%3ahda`YFPi`pZ zde?ZV3ip58v@vUCBUkFg7X|YvGv9eUDOzkL$8%?gq@MO~|4x`w3Hh!|fBNQ=^WJIp z%KQDZuBECE9R6{40e_zy>qO2>(rebue%OEfx@~*$RabX+ue#}>dTD#jcZzsrG`l@K zQ00?<#q`yOaXw*|pI^~v&x-ri+M1lVuf9qyFR}1sY|wcyWPzhsByA$+%smysT1P(} zJ@xB*H6BQ2PHua#I7D*;l>TJZ7OS4BqARi)BkGf#Qsf30VepMRi03@EZxN?#sQa>U z5G0y_UVdLk8p@LMUMI#$zNmb*_3w=M?2^~%NawjINa#n6T_H#yf`C*z+MfqJp!CNx zPl6uPtj{|F2)Ih^-|bIp)VX#KmTl5xb(qV@__H-)}Vb+ru#@T{{xYqz_xZ ziW-b8Z}JYU9;&UC(w4uWqF>fSS(zJIXzXXYU+*+oA%~gZAIR<=68{PB&HwGPF{P;4 zeiKxV!&bxzS~ z6>469*GG20si3Mz^Tq_!h|~!Z1%v?-s$b;$O>@Y(B9AWUO7>3;M zBb;O&+q|BOUJ=VtHu;xgn1jw->nMXE#T@mIM2&qcTgjWNE1Ng+N!syBjD#~~;qse! zVchgyb?-6G*s*}s~_^!rb2Hn z_oayBQN20^==|?FLJ$NoB}4Dv zk3yP40v1QG|C5zo+0Aohwg@JQH33E_}2VdnsQ(nW4yWBT`{7J>@@zExR5oR|O! zjj*~#F0Qf{E(OQhc&_HtdXFWBIT_rFs36M3f&KJ*gQ78TzuKa~vLUCgS7gwte3=~k zP()5ya0jkaY?p=Un{|2v9Qsm9u=RR%ZzZhBB4E0 zzX=!Z^q1?ZaZz;veLNyPGIThrYY0!|Ta_)STC|Kd#2o?Z;TRJ~8+Og|72n}2T8{?} zqki2vMSoiE=T6CG%j!zes2kpohXQX#GRpNky;%9nuo7Ei!lMPVpOlL4!c4&;t~78v zUIGm=O-wuGMwmUSZ&OS!m!$9HQ*{>kVX4u4x5d9Ozvm5{ zJM}WILQK&~*CF8-`N{=q`+SBIF5o9vqik(md_(#9{ocL3I2uOuk)1OGKb1xASZQHh zrP|jdz>B=%;*oh;I=#LQH>0vPhUQEz(RkMVbF6(Q2`4TwvATSlfCT4B<7?Xw!L zO)_O#3oD#RK`*lW4Xpl(cI|`e@m;E)7=e*B@O0vqEkC!t%uP-@olTE9LyhZ1^8AA5 zjDA_v$YhJ1SLs^>r^8%o8J$)Yc3P3^3taoxyoF%kBpX)fv-L{NHHQy5b?a8}N7Y+E zbP%_RljTre^aYm+g(l{W31kb&QeMbiwbU^#gnKrZ^xwW+hym7YqyYpIoid}Z;3 z7232-fA&R>8vGuU$ey2!hX5s;%c5@G{CL4(UAFzwapwL@xRO!9)=K-5v~_e}w-Wzk z-SVHZ+BP!O@h727W9VQY-=uSGN6wNb&#~K2p>ChUrcnSFrSk7Dx4ru*BRvL1dS-_}63!3m+x zrZ(0;a(_3k`YWrSt|V%Hv5n@q=i*W@()Uxajf#0R<HUh*QrsCqV zE0oOjN}y`;%Xi2SDTtj}IcW}&O|1_!YTz^O+NjZaHCcIFEwHFT+|yr|(M~G6aW6ki zj8#UAO8xr*bI8eERsr4AC{Hiy(_$V;fNWD?IYI=9+}BAQl}t+1=3ST)uKu);=nDDy zf)Zv@mB?q5>o|%KAQ~QF-Hh$$Hu8Ki$svEgN(L^L^7^~qWSbIH=jU}>7F?t6v;Du? z%NW=<`!u`oyPUAIn@iP38>j>A*3oA1U_9$1DtCVjJHpQ|zWuE(@jBmVciQZ9`!Six zW!UMYoGUI=>2N>AGYI0T0sUtjei17NnjIa)J=j!ead>Sk3+*RRwrx1JZ8({q!5R8U zOU;SB)!*6)r;@FI|4`n#qUZr!pt>ZxCegZxTg(z=lvbyvhhUlJn@6>CQwWEBRo; zPAbJE;;*($ZdG91u)-2F>jdVy^?fDWr?+aWijG4@KV3=yN0lZOdy}pZQbx& zgQd3aXm>UqtGd;n4QBE2?HT?vtrcHR-S_I?pBcQi%$~Zw2Xf=2N`>a>7Hlu1;z+xZ zcB5YUCfjB0=ScYX>M%yds8`&~)sg)ivP#rC63cD{$AAiUp&H#|Nf*r}8?fMX#-mtx zwYspQpYM+>P=zzrmn?!^qh}`islYK;t3a$_dgB+i#+gZ7vPG_T_KcVOO=jMKz64!v z<&)n6aa@01mhNu4kMQ9kb>-2N+XJb*IUpyhC+-JdyrCA4`HzB(hj6z5yCr<1R=HM} zBy2e_zHNu-JTHx0CVN@v>6~jLw}5xI!C$iHEiPkJEEVt!eaH7{`OqX65s|rtJzqHY zW#n`NFPVVDYWzaBeiHb_TQ%_J)Ar^(S