From ed7632bd2ff8693d7c0eb0fb7021ba4d35bc92d4 Mon Sep 17 00:00:00 2001 From: Alex Dewar Date: Mon, 2 Dec 2024 22:12:31 -0400 Subject: [PATCH] Finish moving over to new binary file sys --- .../chipwhisperer/capture/scopes/OpenADC.py | 11 +---------- .../chipwhisperer/capture/targets/CW305.py | 15 +++++++++------ .../chipwhisperer/capture/targets/CW310.py | 4 ++-- .../chipwhisperer/capture/targets/CW340.py | 4 ++-- .../firmware/cwtargetice40/iCE40UP5K_SS2.bin | Bin 0 -> 104090 bytes .../chipwhisperer/hardware/firmware/open_fw.py | 9 +++++++++ .../hardware/naeusb/programmer_neorv32.py | 6 ++++-- 7 files changed, 27 insertions(+), 22 deletions(-) create mode 100644 software/chipwhisperer/hardware/firmware/cwtargetice40/iCE40UP5K_SS2.bin diff --git a/software/chipwhisperer/capture/scopes/OpenADC.py b/software/chipwhisperer/capture/scopes/OpenADC.py index c2a0a3b13..ff345ff80 100644 --- a/software/chipwhisperer/capture/scopes/OpenADC.py +++ b/software/chipwhisperer/capture/scopes/OpenADC.py @@ -144,16 +144,7 @@ def __init__(self): def _getFWPy(self): from ...hardware.firmware.open_fw import fwver cw_type = self._getCWType() - fwver = fwver(cw_type) - # if cw_type == "cwlite": - # from ...hardware.firmware.cwlite import fwver - # elif cw_type == "cw1200": - # from ...hardware.firmware.cw1200 import fwver # type: ignore - # elif cw_type in ["cwhusky", "cwhuskyplus"]: - # from ...hardware.firmware.cwhusky import fwver # type: ignore - # else: - # raise ValueError('Unknown cw_type: %s' % cw_type) - return fwver + return fwver(cw_type) def reload_fpga(self, bitstream=None, reconnect=True, prog_speed=1E6): """(Re)loads a FPGA bitstream (even if already configured). diff --git a/software/chipwhisperer/capture/targets/CW305.py b/software/chipwhisperer/capture/targets/CW305.py index c85ee9e01..0da681258 100644 --- a/software/chipwhisperer/capture/targets/CW305.py +++ b/software/chipwhisperer/capture/targets/CW305.py @@ -121,8 +121,8 @@ class CW305(TargetTemplate, ChipWhispererCommonInterface): def _getFWPy(self): - from ...hardware.firmware.cw305 import fwver - return fwver + from ...hardware.firmware.open_fw import fwver + return fwver("cw305") def __init__(self): import chipwhisperer as cw @@ -477,7 +477,8 @@ def _con(self, scope=None, bsfile=None, force=False, fpga_id=None, defines_files if self.fpga.isFPGAProgrammed() == False or force: if bsfile is None: if not fpga_id is None: - from chipwhisperer.hardware.firmware.cw305 import getsome + from ...hardware.firmware.open_fw import getsome_generator + getsome = getsome_generator("cw305") if self.target_name == 'AES': bsdata = getsome(f"AES_{fpga_id}.bit") elif self.target_name == 'Cryptech ecdsa256-v1 pmul': @@ -505,7 +506,7 @@ def _con(self, scope=None, bsfile=None, force=False, fpga_id=None, defines_files target_logger.warning(("FPGA Bitstream not configured or '%s' not a file." % str(bsfile))) else: starttime = datetime.now() - status = self.fpga.FPGAProgram(open(bsfile, "rb"), exceptOnDoneFailure=False, prog_speed=prog_speed) + status = self.fpga.FPGAProgram(bsfile, exceptOnDoneFailure=False, prog_speed=prog_speed) stoptime = datetime.now() if status: target_logger.info('FPGA Config OK, time: %s' % str(stoptime - starttime)) @@ -533,13 +534,15 @@ def _con(self, scope=None, bsfile=None, force=False, fpga_id=None, defines_files if bsfile is None: if self.platform == 'ss2_ice40': - from chipwhisperer.hardware.firmware.cwtargetice40 import getsome + from ...hardware.firmware.open_fw import getsome_generator + getsome = getsome_generator("cwtargetice40") if self.target_name == 'AES': bsfile = getsome(f"iCE40UP5K_SS2.bin") else: raise ValueError('Unknown target!') else: - from chipwhisperer.hardware.firmware.xc7a35 import getsome + from ...hardware.firmware.open_fw import getsome_generator + getsome = getsome_generator("xc7a35") if self.target_name == 'AES': bsfile = getsome(f"AES_cw312t_a35.bit") elif self.target_name == 'Cryptech ecdsa256-v1 pmul': diff --git a/software/chipwhisperer/capture/targets/CW310.py b/software/chipwhisperer/capture/targets/CW310.py index 0cd0a6916..3a4699783 100644 --- a/software/chipwhisperer/capture/targets/CW310.py +++ b/software/chipwhisperer/capture/targets/CW310.py @@ -148,8 +148,8 @@ def _con(self, scope=None, bsfile=None, force=False, fpga_id=None, defines_files if fpga_id is None: verilog_defines = [self.default_verilog_defines_full_path] else: - from ...hardware.firmware.cw305 import getsome - verilog_defines = [getsome(self.default_verilog_defines)] + from ...hardware.firmware.open_fw import registers + verilog_defines = [registers("cw305")] else: verilog_defines = defines_files if slurp: diff --git a/software/chipwhisperer/capture/targets/CW340.py b/software/chipwhisperer/capture/targets/CW340.py index a74340615..fa1e510b3 100644 --- a/software/chipwhisperer/capture/targets/CW340.py +++ b/software/chipwhisperer/capture/targets/CW340.py @@ -94,8 +94,8 @@ def _con(self, scope=None, bsfile=None, force=False, fpga_id=None, defines_files if fpga_id is None: verilog_defines = [self.default_verilog_defines_full_path] else: - from ...hardware.firmware.cw305 import getsome - verilog_defines = [getsome(self.default_verilog_defines)] + from ...hardware.firmware.open_fw import registers + verilog_defines = [registers("cw305")] else: verilog_defines = defines_files if slurp: diff --git a/software/chipwhisperer/hardware/firmware/cwtargetice40/iCE40UP5K_SS2.bin b/software/chipwhisperer/hardware/firmware/cwtargetice40/iCE40UP5K_SS2.bin new file mode 100644 index 0000000000000000000000000000000000000000..794f385a073533187691ac38aff0a199f5bd131f GIT binary patch literal 104090 zcmd?Sdw3K@7B_sVyJx0nGRbscfB{12T)=SCK_Ui?SP2nv*JX#5RYb+%B1S}wh!`$H zO#%|+7Q8?ZkU>NNZ&6TDQJVnjD!T^P3kvE03V2}+URG3;?{|8F@;%S{ywCf+&-c&w zy+_hrU3I$ZSEo*$I(6ysB+<#48<)=j;D+T}ZY6yTJZO?`dSG zqpSZ%ssEF>VALj|Nb>7(|98yUL2*09Z*Eq&b)-`{ zV30_Wa-+Aq*J47Nw(Zrv;LSo%QSbZ{Zi?#7NomUHb7{?~FlDxe0>mIx6l{jx)CwXP z%~KZ5HLJWt<6K7Nu?JF|;=z;>N;FJLRJqZp5j75I_PGxfp{mf93b2t_TZ$;5*QUJG z-M7!(@B{K8paL6Z z?&1gOe=H>teY8Mq#FvEF}Edbo55N%nI)_L z_jk$Kc>GAjaHShvJ+gWOtUfrA{2ozar1+y7Tv544B3GeFq@?f%lJ_D%U*uXBEcx>s zH+DN;LxLqsdW%B6Ow9#b1bHKFZ#s#SE%nL*7hsZ~TFDMFSipfoK#YmP-zA%FS;{FL zT?h`bZg$Tm(#P*;vGG)<4S~>I(pCB{7%&OP@S_376N5D=4R-wLU~f&i{CfF2Ug=ZfaghjGE^dQduu+P-lAW9=gm$FW01D;Ot=IS@QMKm?BrC=^ED5pd z53pQECJ|?_BPhyp)7rBdbX(!uo+86*oDP;0($Vq*Q&9^=xM~nCGP!uMxA+pti6B>I z6h}y!nqr-0a@By6&{>obUUCX-0s2fc-Y4&rFTRzM#Ih7Rm?%$rk~%WdhWxGuoj8|M zoG>oakH(K1Nv8;<2xPYB4 zWuXK;hU7%HvlN(ep9w4Jjd0B(R`oy{Ltar^DwOAUutG6Ac_~LP8y}C*u(v6$NR-cB zTf*^|v7LqKIIV;2ep-@EG-yt9TQFp~9W0zyMpHyvO&7nLrqVe{0P8qXLPX(KHQ){g z%Gp-v^01xF4752038|h#xk;3-av(Vf0IaS8X%h^gx$I;JU^=B}kXyN`Ey1KiL9#)z z_0#Qa$K=VdlG)||YQYOW)>#Oc{JUUVg(p!a@$h>_@(4em_yFHYQULYh>LxfGCAGb+vSSAm3emI&yD>2xjy0o43`YJt+ zo4g%YzqnrVL*a|Va8<08DZJo{%p=Mar-8)5(g?sx_kjYd2Pqa9*aRyt+gbh6)4-ZJ zB=2F~EDvdltU?#8Ywhz?&F|L0!%70swtExzs<0*?K`3cF`yKe7~pbY{-ZZ&0wLkN^9yJaNE#zWPHl9V@Mm*=_;aeavl+m2vPu|B#X=0~U4f_5eIa{;4F5B*f)g3b}o6}Ooj%6B6O;4v8T{}xv zJz`!e9yk3584>F9TPrE9%UL^Yk+iaAl{zi}Q8%msV7-(}@X;egM~cEKZjLwV&hCL zh~Yi2L7Wl?$FF3$-QVnTK(Yno%dN6wXvC`2UNlRUf9$*DXxgjuhwJ1^`>^0e-^`s9 zJRT%3{lvx)Zi;{I4m$9BokF*ulJ+$iOndytMiPkqS+gFJmD&z^xe*f18h+sp_$R$9 z*IBT$X)atjTpL{@A#_)K^|~^LD~C5R=9k)59k^CM_qP3Z$9q7K**i;AwynhT|J$%YGZ>2VSju>71u z_7TkGXfVq}6Aw%oghU5<$$ik&JM#Y)QpxQP3v`OIdry4FSU~3XGBpd09ev4 zcAx!|B+I7EaWnFL=IXPj-c57CngN1jMY!@8&Mu<6DcaJfP|=IwVE;~HTChcut!4cn zguVPLsJ5ob_5cf0e))zN4Yu?CbQ;*IP+z=_DmDT$nykkVTnCOg&QeO@?-Z$8^cykg z*HBW~8R}isNumR>lyB9yzXz{Iwr@=Hx)Vm4vfc_(j&B+~YK)|*9Mo7|_f#QZ=Q5kZ zAM{w%1e;|-j@f79IpSN7E75RxcWrQwqlCi3&bs7CsDX`Z4QA++fB(9aKo{3U6Qa%; z(qeHEh~ZGQ#G0o^n~Z?$lHzCTKtu47ja0jaJbg@>ZI+A1V#R4`HSijil@%_HBoR~n ze5C;$8vp)VXg$yT2kMA8nsn-D#Z(M~JkaYGjA)6P2{Ok>tGm&IGWIZw9ha=Ep!7{r z($ru79JWCCR|OmiRl9KFIwUVS)`Fs$5#m!Xn>)zTWj#jns?fKp0+NdRsV~x=5S4hh z{I}UQa{_Fh^5oQta&Jfu*cO2S9kKt+3t(r*FI`8T_5Ox7Nq|*&MTH*J4fGUAZ}d|U z%&BMC6emcb5N!sATHfUbm<$Fye9+@FCYv*RlV z5C;1y+KXy_fK(xRSWe?Mp-va5G+Gt4#$v!Ci7lKfurQCDV7 zOSYbRt;Epf7#=|NSb;3EvS|D)Fc=>;9^6Sr1dPHmkB&#tz;wbP5z4%Gus7z-p&kj$ z-YhI8ag}qMu6FMLYnZMKvM;9`)CqZ&lwmn&d<4KGZLX0eX?9i^Kf%QFPkcaYjP)vnwLfK^9Rq#y{ zQF*l(eThtiy`>R%0YqAG8?{?gcNKDjrts>3B+vOb0I)pk9w<5@05+Ib^z5s}H8F4~ zD_$mqa0>4c)PCNBzTMq^lbz^MZ2r^|G>8XTd zFUsEjy$!}VCKg~@aoKhiw2H?JeN@Uc*r=@HY?q*aAWt9#Gv%oKUA3ky{qxSjOg@Fk zv&&7tcHc$9WHm62c>M#8TV1rVEot87C?&LUed>#$Ug-`7+e$Wke$QJPEXnfkN+4j* z>sNeJNZG!Sg(QPp8|+bL%c3Iy3o9^v9M)W-Lmp}S> zK2g_BS#!9+=_6Y#t;Fwehb8@8=EeJ*q6HlZoEcl{NGpVI98sER;UuxWmj2Fst~F>E za2?ffk4xvr(L>vgjY42FV-F^oF>13b1*9G+&?Bk<)cHmP^qz{d)JP<#qnB5B z?Vb)lgV4d~Ln^^ljCp_I*4a?PYdN0IpVkE5fatL(9`uPMYyu)O!fd)o+)wpINPvpF zG_UFs++|_l53n|M3Z`KCr;jSOi|MCVPr^>qfhqHclQkEfRtgKR=b;f}IohRQL;vfi zP}I6d+rc-0EDD8g2e2|~7&)51H#4|k(egUj!mmBIn{@Kjy#z?4mF^vBp}L$T^;986 zF;t(yz%ie71d>9xN~zqnLkvKf#g}mH&)MxTL)y+pTom?%oTSuLNe3R|j6+K~b8ej! z1#{1Ll$fiSEs!ND`_&m9k(#iRsBHXFaG@0e77G-UvSM-0)s^fL7lo8q{2@)!l zW|!Vvh~$$o3a$uJ57K7L}b;A2FVE#ilzxF}Zp zUmHndp4$^6pO4N%QYTf-Z)Y)BmJ4)tNAuGc&Vvu(9onpDwpgwWVbev&J<{!tPy-YQ zkqQ6y%?pan-n3%b4kQ)d^r?cO#c~gia7MAq){Da$?Q@jjS(R0ykVF25z$R%SX6!Is z0y=vdSVqxbo4N}IJGKT1B24`s?@!@a4%C2R0|hdo9Jfxg2RfM6B$DUDbg^<5lDCe0 z5@mSDl@$UJ%1MJ|6l0n^^{A;>!NpncimP9TOaX|a{6_zHQ4X{>t62dY|E48UB^>_o4 zmDOK8biYClHkja&Obc5W!931k`!uj;vB>l%U5&dL20-d$CQdW6(+`$4UOeBhhWSO9|aLFbGn-Lx- z_$^Xy8>C8)1&D;wO7r30BUP)*c?t6|ksQa4%-IplAK}GNd+01#TyK|3rF&!3MM)h? z-tY~QWJ9W&0~@W;)k-7UlhhqcXa^x#TCzdNGHO3qZgnIcAyJh_0(Af}DlLggr-J~4 z%~ND{y~J!Uq-SJ52L`n5&o+v9eP8mpNRG($>R1q<0jb0WPuCT|O^>kY(x~I->j%;} zBb5bxR2dCOfSrxw<`RP)mRXoY;Ti>-@D#eLLZY)5n<3cQ#zu$}gTi2V1;dsU*5Tzi z+gYxY?m)`!w8mVL!iz+Xd&LD{i>Qkt47Of$bB=!$;x%aeV1N}W*IPUy_y~qLozBP@ z^$=0Y%U~hQb~9Msaq&0`B>HbTQM#=V$sH`p4QP|Z!#;rZSnS))&K=h!gd}nJj=HkJ zj!{Tw8+(>NUV&lJX0WJRpq6jwZ31iSo;cYM^(jiL!AUe%vN&$`Ye9TyCQ8>BEVu6+ zFOL8uxVS~4;jZKLB;+`lE{*y+*e=t|xP&#JE0v0&S5m=0Tl00*!2d|t!Mn5)S5M%5 zg<`vpy8xbuM*kL4Qp!2gppuTYvnmqUJdt42>MebcLxaP%>#uC_5A?7)_NMTc07B74n z;ZtBO*WQRD{hG-{2WR=luWdX|rfI%7L_uqODcj7ZyMD5)6p0}Kt6FFxz#6DyA-GR# zD?Fva0zDcGWN(rD}4I$++i&c}72uPN!Hrwiu8b|>xE&&)6xx|!q z7^0SVXayUZQAYthtZc$qL;BmOQ)$#ygO&N45w{^hA+EnUciQDP)L?ttoQl0zAcD7sOZ^Ow8$=+E<5m6P|)K|qZ zYA-fL{S}M;mUjICj&es#ZT4!TDk0g3C$TnV<2c13^-)x8WZks9!tV2-upJu@=wM<` zXuKg%pGRsCV~0jAc*CNt@VIQP_E^i2Q((`o5A`(_hBcO~F6bkP*Gd1!WjKd`qY`*E z^4ij7J%{;O4MZS9ZGsf;b~W!&(c+sSpM1LJshA?OZ$t!*nj1FVH17#++}+EUm%%CweA2&}Mgir1T~4xXqWV#cV}yuHU8 zO6pAt{SdlqAQE(=drjf$wA*ok(iiZvYiH564-gG4dP^auMTkn=eQS;YVaG%*a&@zf z&lNMV`X=HAIv8nF9UP7@ANIld<{3eh+R&OQ6FPB+0ztCa%h2v4GVM?c!kB2ZS8z?` zClZ=b^=n*VITZ1pIp$kpIM!jy6*`#imP8U#!YjxYhTiZtwS)dMG1y@p?~TKceq_8j zoF}v;kB-^OgJj{|EtGANYOlCcfjkeaSRWxndD4>Y0C^dj?-L_GjI7(dG8$?QS#y{Az2wm?6p-<)pFFsaKMO)&Z&JD%j!BNjCjoAewY=E_bdlg ziv~erMBS3HYTXsCIYx3yb~Rf z(Hl@8Ne26B-MO2a_XuyB-64g-8MsD6IyU#}Tv#?82?ldV0n`HS#rGE@}`N z^36sO5+Td%8oglz$t-fM0c9)507V93xMo=tky&c=jg%)jmci1(BraNocnzb2i2S(8 zv}i$bC{hH73MupkUsUX|p5qh(>>>h>YvCxL!$l|n!m()J4jq+Yu&}da1)ZQGBRCr= zk*6ndf-kYgu=EVI!sobH$?70R!~sl=J#wAYLaME}fy~c*+xD~7rYd%YD9&#(v7NQ( z`6$gMZQ^IDR#(B794=5|u#{xgc00ks1ZnjfE}W-H=Ysx4I!B*gxaLKme$ z4w9MDl8qs6n|gh@5it$VD_n(Bx)I2@o{=l*DLd*SJ1UFaa;%oc8l#$R};*d=WXPt^b%B{6Ys=nHPmh$bSz zJaCQD-DtM6LQM*`z#FZOud^axE!_pruSr^k3B_;TgIXdlrQbbkIJFlQ6tHBZ9aak} z?FsF%;%fMl7p)kXB(EKw@mFC>=62P921OB+g`pPQ0^S7<8KpBa5bnbLs+G_Wk1L`& z+kLh(ShDmubk-`fXhS7{OYdf-)pIhy!X*aSAPv;8WddMxzurYddttg4uDAntaW2k_WL*?x#1LGT!!ZI%3hS9SC`|P{4(9c|S2X=YbvBiM!^6cgVI2CD1!Fu=x#Zs(#fYj3~})T=;URfc=_F>iO`=Y_A_ zHyhnTKrE<_*Qv+dxAzkpH`z<&14?zz2G5v6rjsFu*yBBYPY zS=)kJ)_-r3mKPnxAv%vd)du!0^<_t!k<=<#(k=y~SDg46F)^y%gOjwng+vuQX$PteCQyfE=BGIr}MP`w}GFZ-Bn|WPpFgh`kC7XL|oFtePpDq*S zU0-wnEf?M+$AUtgE+4E2`3Ozokt;&twLS-Ml>#~o1V**870084c}Ud)ENL25K=VnL z{17jC9JjuhL?l~nSGBM51fra@AISZWCydp&)sVWK9}nazZ6ycX5scL!NR;oK1cVQ_ z7;$=y%J2L#39%v~!h9%)2NtZVhV7#$TTlvr@U7vM>S9=8ZUxFX)0mLVbD7y1SiJ0_ z;_QRyaF)*g2bD^K#o??JuQj=ZX$glaZLgzIe$r~x@MM&jRFtRFytu+j)ApJGZ}X(V z_E6lxB#w0H92J_pivnc_b~M6qs>{8q(V;TM@kF=rKCa#4rcsdFt)E|CPl32stucbs zE%yTl>GsX1JU^DK)lz_UgSCTIBMaDkrS4V_qUzVxsB+SFgpW1D z3wTf)Kn#WLgh%*F73Qu@%UZw(Vmpi3NwC@L4Hx}|M}Us6e$$uY+1o#Ef=0CKGD%67 zQPlWWf3jX;v+LGdM#1fkZMe&z38MTtrHKs}-~G;d%bP5&9`R|Kn$#;vn^-> zU)^~Nc0}pE_*aP1{OcZJSC`2cakA2sxOaIbg{3^2G-U@igsZFIt_V|LmS$`i^XmiO zGHcq-3a$1XBN*;UhglO}y%FY78^8L6aUSwy@Wj^uBhDU(Yhwy7Y1LG2;^sAH)hk0E zFUcFy#UkFV(F%)Z{0&Dny5p$Tn(6c2}9? z?3cN_lY&A4FC=S+dpV|GQS31VmTfZp>@nQaY9Q%+IG)M&y+_)J8Mb`OKl4aCH1`{n z7wY`}2MUoOEo0TFDoKx=S@r2C^qP|FF$+|{Q-1Qf6lA4Ju#GJ5>Yc;(1O&-yh?XAG z2d}Kx4B_dxnjM*N(EyZd9{(aWIn7Ao>DPZHX=n$|Si{yQORL0$@vd|J{3%N$Q(;SC zwze?zH@D+(2lG(-I9|2IC7glkIu|@b-h%F7n{>q~uy)7J{aF}B{*BOCKygW5xB_(| z`oJM8gvH@RI@(o(HRG5~`syW7B5>7WGfJ}GpJ8W9suq4fS!mp8gcf`Bzc8kx6$32i z?~*<>%6H#DT*PZvzsnQnv}8>>Um|G3(Thvfan279qY!z{u_Pk>|Gq+TBFM~9@gcFY z3gjr=2p9uaknZ^FIC4EO7mxceGo8X~!~I9!;zr${!l0lINM8z7i(Cbf zX&i5cvPQ`v7(1$XBa%rdFevf{aWJes`Y%0lJ*y6rE7^>5I2aG_!25dOJXnLE)_v&9 zh%@I-gFMo-r*^-I^c}5_F)hm`DwAeJQX`csLB{y!oOGf)+;R{y$}3xrYA?V4WM53+ z%H!T~aII*rAR7jjFh5ltw&5;q(qtP_p79Hm)+J6<7{;0J<{q)&!@1tm4o6rqFtfC@ z<=Flct3C?80Y75E+smzJ3B6Qm3r;2xtvcGIxqU@_Yl>u2Y-9=Z)A51Eq#_@ z<~9F7n#X*i7f+qE=eISxyliLD3S@g_Znb1VxJUov;!xKnEm1ELo!LtSiS=fntzUY@ z41VgQD0!1Z6TCF^so_E`o`25#!W8ICJN~_4G*vcDZt{ZLbWdeb+q1f_UA4eS^Q_He3-u|?*xw#=V6nRaNY?w*+66zQ?Ow{|t}7!UJ1MXUxp*4Qqq+rcp0 z9=902CLwjI8i=DRuP;skYLAWz+LNZbE{bq~thi_!pVW=4opgjXz4(zTbhEo(`bHAn zJUYc~17gV%Hn`>xdU~V#;2Y$S_pb7X`RKU9a|Ys+*O16Qh?1k{I!Fqyo9f|*=5AV|H@s8$|?#^ zuwtrotnZ&M7L#4Oy8lmz=ziT>D1#{twjheOacz=mWw9EFtO@&&YSh|8j`g;sF9E?if6DMMa2M%H2?t?Ocv}kBgEHG zO*vJnIDaOjFNQs~aR-Wx2XiN58@XYVLUSo?7m}FZd}H}a2Uu=vN!FV5`B|;^&_WbX z^di-`jA*?Ug|11d@Iw-g%mYimR?yk}ugd|vUhf8HFi0K;44|~>!cjPg5d}z`=ksA_ zgS1p{2c={rrVQr7K-d(xJcj$CY1=0Ev*X3PQ8$w&#hDGH%~^5YGDWI8jr~< z?-29oVmpbPEHNui0ouOO#nq|?xq3gF7F}+{Nkz1&Erwr@>tpU;Z;50mr!6ZTNUWCv zr)ApH(6L{y!eLBh_FPC~+8jO+2@7?V8hOY8QkvP#Wp>p-(1lURv|K5~NmElsjEq5* zaFa`pwesB~OLf~v%@r_Tx6oCcNfGg#@_u6<%BD8syWhGS5F zZIoFe=S1nZ9rPzU5L}aVnOi$pPdpXh0I(eCX~1R7UGF|TJL4j=KKc&if`}qst!W@N zs;bjYsVQ}Tej^m}kZ+?lyJ!H-EvcvdrRU$Q+05J8!D`k+E^&ZGUFqM4$^o4Ifd`F_ z4K#?72$Ft`PwyCp(dX-=)n<;F^%c~_TVf~smRXH!uCIV9$qO6x`r5OoFxLh?TzhDnoF}WXzl>T<*a!AM&=N6$lpBbOo zE;oY}G!2r?I&-w!!D4eLuE^&U?npwU;mBbN4TrOU}34EuEetBvE=ad4^&5^ZO`3j;}KLs)WgijQXD;&O>HwX z`h_Loxca4NhKTi5UvA_Jo3y-?-KGMqXWrAKkkm?;kJ-tA znLGLDf9B5##Kt}QfKtqRWtpU*1M_Y%(wwd}Xu){{EQ*xZyKz6_Dz&^_kvs%e6xnX1 zdnv>+l(xP1<4FsT`!0|Yx6V7!05qrIIKndg5J#oez;9}|*-#V@)BsM#+vhu2SQvB8 zQ7$;=vM(Z}BtjHp11XcWj;o-^E!t-@XIf{crVqm8 zmp5ZEY++=J-h{0sd2P~!bTX51iT!^FSwW5#^pXl+sK;W0`OB3`LL)0*g=;4kbyCwjd-YXh z(Dg>A;g%kXY#Fczc6Pdhbf)bqw|*pjWRGyitBvM6xy)7f|~f-+T%^wPA6u_q6burWsGcbX}}`FIcwc=H9b@H(drb zzFf*;s|W^SX4}jx4Pdis`tMtZxQ>sWQ|am$ln;+gGV5@PAldJWGzw5j3wj$onO<=; z%HcT&V$9NNXE~Hbqi6IREojT<>>}#2>}$=k#JtrBoSu`+kWIBU3ik>7e#TWL&Yfpd zjW*K^Tb4g@d}_00tkkP-MiOXy`j);1x7R`SLb`)aT-e0{2(kJECU7PvYv$(?)=KLC zJsIaMjI5H`lr#$ddKhWeGS=A+sbcqIy;ESn9m5&n&3L(IOS=;|qCsO`IflCHi@&>A z;x$l_STOe|i{gbgPOfTpcJk((HCp)4jNHjs17CT^@q5rV`ab3IronplPjsJ}HH-4< zwC#XdN`Hp>M=>73^B>B3wok=8f zN8kLL?J_~KA{x354~9JV>7;@(^0bD!_r7uj;%HOvdY2FKfrG&`_~oZk3g+tEy^64M z_|4v^hSl}_qzdRM8>>G6SeJ@~d2+o) zb>17kXogv#(4_k{?3#)f`x|*>H1aXW5Lp-g1AUpvRf9QXt7g*5=$HlJXVg0MCzb!z z8ho3Oee7X?WmW+XA{ynx(wr6f)Gu5gF5SdLu z?{(84^b+Mx7|A#E83{cQ-?ef1pvASTs(M^al$>xQOSa+F$KC_f!KH5wH}yGz%bx@r zK6Tp}ciCOA%~76P4O(@~0x0t8+wj_$pFOxnpL))K#X$%~)DCEnScJX(i57IGNUR7c zTA}*lnmo@FkSklIuRpHH&Y1ts4bo-AcM59K z%P}vN7W}lvjC5Q6LzPA2w8P>VEID7&<&`U>*N)%lB+6WF7c8GHz+`JH8|D5 zv`bS4mP1Y$^6V|*jXbFw{d&(j!Y~+_m5_YGg>*}(nd>7s+Fm#h9sD-!!!s&}@owc1p#(Y02tQ1YZ}s z9Fhg>Ug02apKDw27A3gLgb_nVqo{osn}3e}PYV&|GfznPiTSaOB)T+b+!BY@$Ucv+ zVb)f#8iQ@`!^a=U$eOVWf^>3TN4CO$@;;Xjmzb!Z`mThZoclD|`lpx9yC2(ihkiqQ z;(L%gUXEc&cueQDahILJ#`vr$QGW0J7H*k7tRhnT0hgS_4QDPK+?X_Ld%huYH=eh# zdYoaQgJF*GPk0v|YhgkbBB^5M+05#K#Sz9!Qdz9m556l5z5z6=J>pyv z4YlyF;Ys3S1dXzH7MCI)->*AtGKWM~EOpQ}qd(dGyJR(TT(DzSDN?}aYr(rYMLo(D zoo}svR^rK}sNSncBB#<7EwBcW_sbD$M2F1B271i1z5)JLx%LECHx0HMpW+pm*8Iwq z7q4TU&Bu>+y9_U(4=WB?{s`Z^v&Tnv#sy{X&hL#P;+Jn7j{VJ5OY}uoPzx+$ki{r$1mO zZVv9sh62Ra0N;w^kgOO!0rncNt~>t=Y6_3P{FxNdyogUZ%;(aUcuZ2Mesu!5#zLRJ zVZbZ!KAR%CYUOVmV%B~yl^yEJ+Rkh*Zj6Ugeg;?I)sBFM_< zH4zz&x!|c7vQ-^|3cG)06MiGn)5<7c&ubT@?u@5ZXN7x6wtbP%Dj~)vCfMk=-hZue zAYc)}D2&%ZCi#AXaJygsr|Ec#eDV1AgmZtlZ}eiNLG8h`CO~3W@(-~1YRp01@vR0{ zl0@!1J0##0XXW7K=$b7pNN_27@Z2~I_MkIYG@=16dFIm^M30VPeRfXs(F9Ee9eyEnXY zf+lE(k8V<;ZqED;FCd43Gj4=K#soDWdizdX^szOB3UphMk&=*2S+zrg`aXT3gEW^+ zUylY1mD^7&%*LRgE`Q&l3h$JYgpKDmyk}jyE(VENXD!j3ri-t8tOXv`gYU0)u>3izY~AmY z)waxQtiU-K!+XpUre}Ved)Uqvl~iGmqGV2COFCP8szc9*4JSO<>w)tjg3mpNeP*NI zmyaTSM8@P9Z4w@VE{fjWGJFTH$mK1hxxyG@!*o8wm3_h zu#L*!fW0NbPQJcgRE7(PpEdMVw18UD5%*c%Bu-g!p z(4Yv`vT?AV6u-I=t377cikO1MSRO7ekN^LYti+WDipnIyAU{|8^)aIPq?@$3a)lfgx|8iuF~ z6#bL>)$1JM&^WtA#HE9WH zAMOELvwDTwU-tP`wSq0ccQU|$1;V({WK=%A1j@KOJpPI#)Ii+*zbROO#8(Ez^3S3U$DR}I`dE@9-X z_`%Td#{sN%!)J7r01xvQP3jx70%wjNdOMy5tlnSE9cMkd1}em#*uD*)&;c&MLY1^{UPcL&bmh;g-ZHdOx79#umPmO20n?z_y%;w7TY&s-9S6I^X-@r^SbC;>WwUW`d{aO6_f_s+9(VbI5v@ClZ|&RYCH<` zE=4^wcTIx~i1JslKZ6P5)}FHsm36_-Wty*B5q5zYtc-L>{);>|Nu(NL`6k@lVhs_g9bm;i$~j{KR)DG_ZNJ>9&{I86T~1+t zm-=`twx|1KFuUB4EcQ}>NEo`a(jkNHrhXcdT%DEl!kTpP%q9xr(!b`w6|bdGo*9@Z zEi|)}w8`0$IAbFGwZRT@75L*p0XI-RjsW#bQl(f1u)@+`O(`m5nDuF}y@jfM!LqXL zaaX^LGSp9%SaBp@VxI;mbpFE_rTLPc?kkiWOc;B$>iq@0wp;$AXy*+u|Qy~ z3ZVwK;j;o+G+-zLlse<8Gd`Qkhzd&VV3#)^81G&ucL^=zrd_5m zh494>Lp4;#uPc@O;DFZ*>zD|BHv}?MB2JR|p|coiGtsXkjiHBA24!>#_QcCBMbkH8 zC5w_(e?tl8gyj$4XXEz`0{z~0aLo4RZ}w(KBSKGERBl1W(tQPLVEZC3-T4l-*A2I* zsrzqP!eejmohh=qB&y?SMk>)){n$Z~oh!Z>g%!D56%PAyH(FEywd~5Lk8C$b_rj9h z{la6ruvA!3gQC!wfdPnnSpWD;(t5^{4;gGHm_GcVYBCwJJhLeUEikzT=yxOb@LTh? zA2AHl95*hlvl$Pre)(N&cl-WgajbahJq7l=K93o&On1DdSg;_y;kz?p@S>*9Iv^#f zN6*4Lrf*#C6pMP?{lLZ2Woo@JSZm!&02|g`X>cPahcO5gP8_uqf};H`u=Z(c@EzEk zhn4oGMR_PYYm$voV{+b*a%gO}|CbXQCBdI2?qGfz2$7L}-Bnj3Qqh#1sEzmb_Zs=& zeqL8bYRL-}=d%8?KS{dX<*x5z z62iFVYBV^AB^!O}=aj;V%xZ35GT$x2m3rg60sOG9;;s4%%W!lH10Q_Y6N4~2U3G08 znxpTG3)yshd?Ow}pF8f&m2AW1?>ktS8wZHk5n5Ne1#8df#&Ptj2bcD0Cbu18162Jj z7)ieG^QFNjCAQaK`h%|rxBeX;0W2Cg3OVGsS@MO!#`L2(q(%?kN(%0KhWF2k_24hO zXGHUzumTGJ=~zV=FG(|^19zfd3H|eZq@>Hp7X}Nj>sm!mh9?b8 zBEjnNR1cugo?5jTYZxo;8miI;u}GmVXaFjD8)i<$viodc$-X|Pg{a_x%db!jV$WWQ zD}#lEAH(J|;GM$;)VKKD?;IY@OAELrTea9A63^iaKFc>y!uqhF1?$hlrA!Thv@q?C6iom(okdYWZ26bvf(PtmoTr(tIe%7WImzmW7jf&n)#ka*1lEZz6 zBT8#`5321mFFQMJd8ij02E(GnWU+T|oV1Qm0xV%(f9B)p>lcgjeu7^<@Qk0hi-K5Z zTfQJ0`8eI5fLuHon|s!b}0(yLwSk%bPB{2BK5zFCz@0Bxm}4b=bK95moud$>w2@^(I34jkwtb%B}6uM z(Xk}9qG$!1D<;bqXpTA*!mrHXyl%MJ_n(iIX2c8ICE?dKyw7a8+Ub%d7A#0?P2ys< zecQouTIFxBNo38lVXhQHuq*x|+>Y?iT#)QG|F#{o@o{yZHvl$b9do^lFiv|=e1SrGtbQq_eHPP$hPxdBy5JiQ(*xr0W% z{Rq(|4bMTHaWW_U*-ct!uXNuk8#J67G1HvJ9Q})IWL85zYID#u51!rr~e0|Ys{9R|TckB3lHrWxW6 zMtOf-4$}~uf9gjZ@!NNgZfM4=K+?~B@jIJYo5Pw-;emTEv|-ma6yepiPVV=U@G48T zz)VIskQFZa=GA!AvwY#^N({T2=igD-)D+m-M7tqQqz)?Yvw;a<&8p|)4j9WeP;xd(M;N?U`L?hs$;gg=i&%$DT%2B<;P zoX6v24O^_bW11lmU$j2({?`f)4#iJG?LK^V8n(-_U%R7i^?|DRT8rcniv_V)K6aVm7jU3OW|=_~5LJdZ-9Ugv6A%BIVV# zaa&s*yw?%^I5vU4-t(f|DQDNibmjl+v_S!e9@&z9-@Ppub8;tLgNGdPO+PBb&d;P& ztIks6!jg$(=<(pYwxXDS#Rf@b!>jq1U$tuL$BjC6-!>=;h{2kIk8dW)zTrs;XKB-a zU`oVbv7{00AMp)U%m;!?np8aD&s>W1Ve2s)A?>i*>cHO-cd^q_R^>9{!tK^LKRy|H zK%O}V@Z`_vreM0nr)S`Sj#j_RH>wLz6%~PS?8{mB)d}tKLFf@b{ABz&bBhT zU_Fa|{%frx2$PozKs&B zX*KXrzitZQ${Wv=_@RWg-HvcdyE+TAk-#gDLMdFDySREVFxy^y<3>fxUw8(>(R{ua z;yCBhx%1o@#^|aMzx%Uj3Yvsh^}*UhDYhp+Vrhh^+l@GUtL@I5v{|^Bf^F`T5Vog$ zD?fY8k=O9pK>=>P*i)16|6R}r&pOiRGP9k<6tPBm*Mz4{$9V%!ti#j@7GC9OCn?tZ zRkW*e8S$GkSyp#Rs+g{tfS3_$f5!JNz;}pOq9!XNZqUl#S*vsx!#Xm4%D)tTHn(si0IbAgn zi>41jWr};;JPP|MRZksUNfmne$_^=A76n%Hw+Le%UiDA|902ituV3#cG+)=^DvFU; zt(vW48`--~d4iAJ@zw8O0njtff?qMNcy}||&DPIvIykIw)6oPLUaQ1yEsBeWE3)UY zXU4$?k?l{k;L&`3zJqOK?UT>gYkgw$!?4tYpF`U)xz-@^;{u1olwM`fPc)qGCWwGa zxBnLiJC;D2trYRzhCPINSzIUr)U;*dUU+QT%>qt>0$?NZ&7GDm9>dHA%=tLjK8dDc6k}B zzd>;|=%y>LlvsIv^u_h0!57?^ggoc9{Xij!DPj_USKg(MXe$K$G-oZ=COX6?dXg|^ z;?u>=)=&~R9FBuCZMtIak5rI;=bQE1FlJ9hGKZoYVaAScJ2e%D8hE-jsGwmNz6>^B z*XN7taE!UvrQ=as>+Kmq5wLXM>P9zLSF)Y%xF5>cJwB4PTD^2|v!R8@Ozg6m>|V|l z9TYv}vYO=WAHkfNI`*?sxMd)73`jIJOUG zz;GmMv`T2CF?HcujOC3t}UIjp~VpfUk= z)|I5GMo;yLR!)mlp9T!6gEe-(X>liX2*aBfO9GGotvgZqPyk2)#-N1P;iH4d*HE@iIrp>m2Mc=fFW6uQ}7E)?ADi{qNTc|Fv zWa|$WLwx$dkKcF(Eft#iiUSxowIHS4PoDpay*Gi5s@VR8_c^DhbUNu14A4M?0|X2Z zFp>yi5Q>0+S1+~-7*X*6G0YMaBp_flGa?dX3WCrGD4<+|fS@8A!sHMoco`L;QDkzU z5xIgQe7}7<0q;v(91+7jov_W+`F!ODDG4 zjgPP=_L6&Vj!V{V^uTUWOc(d(U84cj`Yv4-R-~u);qkna<}w4Ef2@JgGTcChxrqEBAP{^d!7t0YhCvk7Y zMvis2?;e&8q-2JKPFJ+yA7hzMJUHD%7wgRqN*j^&?39hU4v!4p0w6ytz>m&ZQMK&IO3Y^bP zgVFEhGa?C9^xP-H7fu(D7>MiS?~bXTcF1vf!!|aH0V#icCW*#2I(Nzxlp zJyt`N77`K{0z|L3`l%jBP(@6y*u;9`eNO2APdJ>{Pw)vh_U`XE|p_BB`G?@=v z8{$JJnv{bG1uqgxioSj(1Ky`=*C>LhO%G&PI0E4;yV-+boIi7XMA9m=?UfQBdjDv~ zspOx>HVfuj4T{;tQ20-g=A?H-L!PQB(_5f31+j^ks^J3sR`?m}*uMG1FG)ET-L_4s)55(@w3vC_hj?P0TgA{G)p$p|? zxyDrTU?=ePsT+_L`1o=d+Q7TvJISukGVycQ#5+5^850Ai{!QIqnK>Kx8oJ?r<&g$l zI|XCAfaLPE*XB;}X{XbPqsGL*`TB2f7r~x4D2U&nb9k2Gbw9i9f{HqPsYRlICqq@~ zx)>D7+*U_AfWKEZ;AH`!_TBoUg{+Ey+asNhn=Ra)DFohnzffY@Ji*DarE3nF`P?Q^ zKX1yCaSFW_`{UMjn>27GqO8Djf863;&yhzo%sG!T(G_>rHSDTbjD|;$sU!)n_{JRn zfB22H*@}{YE&l-s?Y~4)he9(Ij^Ve}(^$A^#!TUsL{{w~PPzB>vke{5xa++c^KDzVd%G!oTDDGFZ-n zdf005y z&yW~=8Tg5Fe<9J?r0+vkYLU{P_exyCsRgh)KB|W_RD@C!{z3R8Z5+CL8Px2<4eC!6 z<#PlXO)PZQ=8H3IBoK=w24(A6QY}{>&PoZ?X%)oCw_s4v5Ex!>dRoRX(Ty>n1a((V+#c&pnAjMouAb2_!lt*cF4;$%!H+U8ViK)l zcLlLnWP3G&fN9S$njHA}Zb7sqsnJ=kxQ6o(1h6@4+sM&6;^m-ot45$s``Vsy*vFKy zU@aUoDZ}p1qFNf4Nt^JYE`z# z%Pk0l7aSJ&7o(B$#QGp;c23EIBfljkNDNG@J>tNsvi2hn=SJVSa?K86Ryyh3pww+= zjAcOMaf?dDlly02RT(%K%{e`-Pe@YQHaX5I0B#aXYQ(WSf}zo@<1Wb|CMQc%Ck~Y` zZowP2x9*Rt=Cj~ifPW0}YDtsx%AXv8n~BxPrUvh1=3MPbNj4r?isko)@w}y{SDcLp z@sMnBkbL2|1CLqh{-(?vM~im_MnqnSwNH@t@hL`%H87H}2-UrA@>~s<#^LZ`!tn(z z7gF(U%2mS-M}iC%xvG`uN?P2K_GfaFJ<0td9|>&0l;ByePr;1OC)rqk5d-RAVeUam z3rproQv0po#N0I>{z}-0klzZh-Ae9BO!z9GBFM;UJv3Ge;4HROIMh@+F8eebk_k%> z4J*f4_Qs$;Ko>u5o?Fr8V@a4{O@f#5PI}?6bb+aWKt&KO;JGzqC_?&W%?EtdjMGds$hf$0MW9{18k&ZMNbp8WHRr_5y69#XKt1OTX<(USf!7E%por*;Y zrDMB4ezlQ7EcDYQGWhmPr=!4>8M9ZB)Zk>nV6S8jWRT8kB=d zpvTp!v&)gJH~vwuAXyuFyNwFYq9zyKUC4(;J1x2l{w}Ju2a(Bbek5STOIwe^MuFS7 z6_s|m@cKqjQnSquI#z2OKm5d6&E2Q~82OvNkHCm=){iIiC3b`BiXI?VpLpSzN@`C3 z^#*Aa_Y3CS(nckk{~2tKK1Z<k)Dw>%P^BuE!dER(l=MaGVY=zPY2(q zXLR&u=GQX?(5iBmPVNUkL<#_wS!G7;7hy~8GlUz}aP7ropmNV|MFtq+*_ez8E@Q%Y zZ3mDY>Xi{Bab#lL$5PdE4tm2_2%*;?Em-QbyvPc`#J(RIYGRA#yLAU6gjbkv{22_A zXnX?&G@|PV9{?>t1SDlku+MC`9aG2964yJqP-CqEf4jvZV#Gf5!QCFmf`+;>x!E072%F*ADk50e5EOvSFUwk_R zQUVXZDSYaZ^y|H2B=A6{*we2M*6a7IyBxu)!;(4gL2))zhBXs9))u}y2%-VHBXk+b zTBI%bVnh-pbjw`zrGsh@`xqEgPC|IiiL4G4>GoFHGXWo8MXv?4Bjn1X zyjA@^Um4*%ZDKXgsC^cQZO2(Tm3TgoqwL&;`lST_hK2%Y3=by8zbQy89#Y8C5_Ru{ zo~3%BljY!YtzY;<7}P5F4;$4MgJ`V+C{yip3k;{IZgI8w5@C)jz3>|mkC1SJSe0;=y)7z5tv6sinn3pQ#&E>t z+~E(Cp~*SNz%s@pw`YUj@?hOG1siZqa<3{wa;10AEkFvi`F?>Q<@35A8Ngy7XBV`E z_4L>zi4AlqgOU_c|9rRuhEuZdZbB{$+10lWAVHDD_lmG&Iqj)Sa2Wab_X7*0HZmJ7 zYW7)yjmlzxf%F3w7QK`Qce0c zGNl3P#Wk=uh{c)L!RHWUgPi8XAp|X7+7#8==Ck0f3rY?uXY$KaC&IdwIHg}=YB=Plfg+#Ho)kl9)AZ$?#idjk!$|qcfwFz-pySk zl5Aumgn>C*kTk9UW5>Qz&Y6fD>NTMV$7x)3J{5SeWzMy;h-`y$^4BuF5^K_B3$+*j z@MlHXVQO4!w?I3bGvX|WrB1vo3gGc9?#exArBJm7NA?*R&hpju3vppTf9!9D4lA=4*g))$wmgT890_Sgj>#crxvep z(;YQWWJ`x|jjgp_=os|9Ga!bTLGt}SzLDVhlgmobyVoeGBOPHQ?a6(y38R7$F%EUd zlC@7mcgzt2bT znqCH)yQcaJwp3D@LC-=3hX$n^ric8~O&ghsb;pgLWx+MT;FkJO!o?IpnpJ(V1w~i% z?B1@i!!i(q58Z;o@*bR-QmA16S#%1D$huwtarVT2!o;<0%DNrEVjwrI0Q>a*$=?Uz zvNqusz9 z*jBD4Nl$5X7SRR8xAaj+>AMYrf;)&+23xF4z)Sza-_e8N>s2=r!Nm8AKEfEp;b^$i zQXO&AqIgh2UtDh}TCWad5G$13=T{>S*M+eC`e24YGim5H5t>U?GmhBVlWMiPKqe_l zq(#`m?!>~(a^&IacM=;v;$m@OGB%#g?kO3!h}BOVmdImJ8F(eY5f9&6p;CdyF1ICF zcJ}0m_q;b7i;eK(R1je)= zJ{B;-ky&pvw!XzI$He<7Bt z?E^*W&7x6YcqU>F0j8%Gp*q6kPn4C!QsPR9m!0cBa674DHmyP3;0=#c1-Nb^pDIQQ z4vIrBSxIb->8l0+gAyXBB4^EQYl;x0Vg^R{l2US(lrRBAv2%Q`RH);PO%ZZUpQh&v z+=}d%TOC13%dnBGsIHmV2EHi<^m{xg%4&T7KGbjUtp@1`>V$bLIYQHWPCyW+>T`SM zmsy~wIru{zJgc+9jFz&k9JM!Hn<|XEQfP|pw_zwEGYQ;_u;}m z6*>QP3>Dldd2E}P+h^rv-Imi=s6nl5ZZ;cDjybr^M(1OqvXqB8vHHugrFTwr~PDym**@)b} z1!9HcTg(1JZ0$p@U{0TyinoGMo^zK1WRW`WC!y(8YtGT9*+k&7bz7Ab#H`zThVCVQYyXRq|;70CP5ucmo}WT*ug>>V^Ea znkG^XndlRyKXP;u;{g)5Y>?*N*boCDCF)Gk z_RKtAgeEwn{i~$tl>S5%B~&8dtlhwL0c_R})aRuzISg{G;08ulHbWpEn!a*{5~qrW z0lpk;bJiIGi%_pwjsHX|$qBCe=or!yO`Snr5aFvCK@R7)1SI&CLwXNG=~_$|icBT` z6fFcP{e7eEwYa}1gUrT=rCpLOnkKqo)aB?fO>27y@w=Vh$XOm?F%{W1as_E<0+@lfe57%y^C7bSL7Y-gfbQSaX!*XJ12wbw}`c= z$VzK`3g65o_b{xl<4DIP3q6?U_xXHZ7;uN3D%f{d*+&>b&ZhJr2I!*B+5%s)i2Jn( zNa>_@g{H0~7L5SAy>y$6URot*?F#~C1=lCmqDpwc2gwe$y;SN z=A_2x2i8;0Abia|4T2PDu`6t2aRYPOHm{^6>(LWN{g^Oe35nTXUP)w-zQoa1*y=fco>rSOad}t zz@rKf2NRE^B8m7aLnQL1nwLzW%A^UGu>hsE{4UCfXkgHi2xhqJ#3V(PM>f2ljugZ_ zd|-W9?YWAu0~K|$7Z#j#?pVGKdQ->8$PnK5&vju^g|C6?-&o!|%1?O#&z$Xn(SHON_#ftL{KO)9f6 z$XxVwONmI$tRSbr#MZ>`*s~bVYD@nV;8}n>eKPv;KvfMcV?E0dh#97;hPIX}vhLzJ zxGqU^)h7p{=O|x&ja6_Y^}-4pjfpipkA6~$Otfz3+&m9OR~BpJHPa^uR-nK9D9Nr< zMe)Qgm@49ip?HJgOq{_rgt9Y(lKkF>8%RuA(i>x3&R~myY&!%|%?96PkU_PBk4c>x z4i-5a?l+%cgF!k;!HAz5Gddn}Z9r%irDP%`RNiL=M!ja@s*N0IcM6JkL|a(ZCc{#Z zYLuSO5>gTPMu1m28CdX{q`HDpAB-=mDzFe$|7a^LC-#7 zrpNCUHX;^e>4@FY(I8tf%lup?&^EnMkPI}wgXn4@_NB(8g*h7v@fx5-w;wLh1D?b> zJ%a+d^y-1+l&K{nVF$P*Ij;_YC8tFK*rzDfSE7JoOs!hnKB}h|An45e>Jb<*&N^vx zTvv2qeLiId7fi)|7R;1Gv&m3Ai=L8TpbcK_qQD%nQEzN^Igcn!a}BRY9siDnK<^BUN8O8mNi(xid40I>)f&t#nJIWn0&6^<6sdU@{t1gS%R_(+`6ajv!-b+AQ zT6aAT;SK(YJq(A;d6c5)R$n>c9;sSib*#S&{eRd+J!%vlUnWqgfkcqgW<7k5gk1ZRRgK{+WCv7}(s+P>ei5m}kK zGRg5H)$N9_1W-YE0Pd9V=fmHCrmpoaZl##-rQh1L!xuQFhKi+t`rT@27m3;LK z7w&lIlFmd%8gu{&>&oaNEbZ)ZcFwCB*5aml)CVjdbyt6WN(7a_vaA7As*5@YBQ^~z z25!GS6;Ds~ed`I){*QQha8KS!>&lO5ynFik*N);Cw7Fc1R{ zWp^I5lP2gLi*Fq*nI~LfOh>x1I;LS6Wa5R+k8X(p%}VTsD$hzE$lu3^Zmy5o1ASL# zOPcvowZBWG2~cL~k7i4BLS(E7V5N7tzyMWO?_8dN#yv}Y!@|0lF}kD#7| zJ6ESqPf7Sf3{*_XZi~RWQF{ObJgK|+${nfO-+*UQt?|&a72ti`ZtL|PWOb}NwQIoY zn|`VQ!3mo)k$8HC3;ScZc6VFLgr6R%i%E&@T>R)P3x~1QahPt_%U-?=45$>x+ui@Ehb{Z;K%X$5DkbUh=!AKaBFJNt4#wxvB6Uk^EqT%^+lr+BQ z=b}Ok;`I^GK4>_fv?o>S&U(1wr-^1e!qC*kOFr7gYhBkL0s_G9!D={BYL$9_A7QU5 z)h+yLyc-9p9dfqfdvSDh=eP6F^3I%EA7(~JU7R;v4?vG)U%v6WfC_&3x`jwFVzJqU zCP>M~xDf`t+#Qh+sdpb2i2U*k_rW3YuRA?oJ_u_{{h`QjGDUu5w2t$?mMo^d_QBCk zd}{N)f>;k>@D@UiRfunHPJ4Ur}irnz6FJ2 z@Y`xHf;?KkS7ei9Q68`dEe!jU5 z90(??GI6}L%RLjLAo=An8J2F$Z};R{!^UOK7AF0e2FK}?{bA^BW&Q$-OMU(_YD)TV zz8#=$d3^=yIxc6H3?sl>UPn^1e>Ajp;QJfU`I9qe+w?o?qN8sZN7$U<+9o}c92vK15x^rk+HWc4hFa)3BFkKf*@X&wChaKSSy7RF! zCRF~u^@U(h-zDE$HY%^r;;oU+P;R6aV%yKD$JZ^!kiGP$<-cf{(KLT_nvIB=zy985 z65lbpTkT2kKN3N{w`?~>+zQZAB5$gLO-|hr3 zXA@pg1+0!iPcUZ-@ee8JE8Z^x=e)P!m^*u58?;u7sRAo#P5#F7?cjn2#X!sH_G$zv z6fNMkPK_>Xz%PK;4YI?SZ<^}2;}1sg?P&>LEWF|k7>r@pzd!6Cqp_Y1oxxPxq<)cV zCXT!ZWPZ>kiH_qdR8+VQipeDN_Ve%oFtHSP*lu9if7=31C`uy_sO;Fu8-{(x3kIXb zAn|QB8x6aJ-{7Te3)y#S#z%W`5q_{Rl6 z7AO(y%&Ey|?pe|ubF0v8XE2_1nY^U|Uc6nwS=>!|>zR>4q~?dwP%s#A{g^8pDb)K@ zq0^Rxsf$tgj^i&!I8uzWbx!y{hQ0N%Dh7;mE3V-pVa|dw3&LHL`5*@Y49)Yx>{3$N z()pc`Z~Z7%eMsF?w!JxSo9N{j>PlQHVl4__&MMnSfU{&~?UHE3iw{qc$hhG*nNZRX zeP(hH09#8-Ul@uprs}xO;+F~ zv@TkYL}v$QuIah(3gaIi21(p@zXW}h0#&0HB)kbukSqOU7>p%Vz@et%#|E3&eU0ZS zp0Fy}$5XS{zjRQMhlDUL-+`Nu9`?tc*iU`9ne?@Ge$0oy(p2U2Kn?a5&bd#BIu2+wMDe@5RS0}`B74S2-BR$U3T@x)#@rOEg| zFpju-Ce>7T#X|L@*T%dFNe3u~vZ&>K!q=e_BpG?^$3Vs?*Gg+o2x|B=it97!LuPf3 zFfJ1dq)Xuf+NGG!Z^tw#J`P=z&ma@T>cv+NPMH@&Orqe7vDfHJZ)atP0~-)2L3|gB z8a{I)06iO;Qv&^DsIJ#1Nk)%}!4fIZ{8RrHfRC~eCp7?dHp9>Vns+@ai9wa#_i755 zbe)~bj4>P0&x&@X5x4?hq9Pn5V6}nutTGj&fdOj7eNaNEJ&SN)OA&Nq3>0Y6#S2wq zhABq>EhI3#?~pGuF&aC8r|M3Nb*}ghh_*0r+a2)K{MxfyQaN zPD%$k>0j}Z5D171^sHwIH19-qB~J{Sq$igyne{AO39k;u3RWkT_j?#@F<8f!Y}C$^ zjvmAyL;kWrVtq#0F`j2ygxla1pzMAd+JG}og`wo$8N>pFdIVws9tsmvAs= zRgm#G6YI#n{~aiNEJ`xs8A-vvnuhntOG>eITmQke%*Au7K-jXr_x_A1 z4@&PdHaMt*ei6yl>ir)fmE2P-#vp64i{YAKJP>O(;7sLAMeea6AA4x70VXrAMD;A7{~H3*z-boFg~X@WeWzl1EIQT+9MlK4bA$G24`Qta=1aEbc9OPOJPVFc@J}?(7?9L zu9z5LrXGiMsMDG-I)z2NZa|4on|4KMTR^@Ia`;sfdRxnB@kWHIGz#^6yO@lWK7Y1` zA}e-}gcy+9$14v25UYd|$IOsKvffv{;S-FEK{k}Lc7=etqEXXfFx2(a^RT;o$^%^t zX!?tN3ROyWR1bwAvhhXtFw;{LY}5*wtv;|2vwk(7>(`^SgWyR+>s1dZMG0vpgdaAD zs`4WXdglh16&mhP^&g7BqcP6};8#>*O$epsgyD*bfnRr3hqYRxt6&-Fld*_}$oIZu zflL0wtzyDOX>tBJ(6i3&ZBO8BwMj|4qqu;pMI1ljQE??@!2}CRw26o@HrCxvy$HT& zdt1DA3gQ&!0%skRcPx|hpeB7FL$E=BXS5w4@yyEMWs-7c-`@IBNqFp~&bOv2m5W1A z0oda~L@z@ImkG@}w zfO@-+ybFP!X`e{3Q4we)HdSxja^Y52B&Y)Q3+ES zbc0l5%c2!qD6vD%MrRnGk@1e2Wq~EBhRv>+%oe(ltWQ02=pBpn4ogN&K;&veuW?Cp zwf^_QV921VJnU8ay}Yfvt|tUeRF`C$bY+duq+A<85T2lq)q>4gC!vAyfh}7bD9f7Z z;CA1;muGmWL;Qzm(F|B#z$ggSIZ6Gw85uNN8x(nqQPyG@kW%d7*hio+6d4-s2%$cP!5uZHO`#0SbQIwg**Jl(7LB<_ zZ03XAs(SA-csV`U&zHj-cmXuul`U;7{y}YJapB!3OHV-tmG&J7iRSZbB{)Yt8e<^E zy2pNx$>ywzPw@g&N1q|b!O?Oh4+n8Iv&GU3s9AC}mO2Mx(CXiUr(noo+_#6jcfY!d zyh1d56_sZAAFVIYt@IoFn~iIWfr3)-#?axplR%4HdKHN$YcCFBU-y_*Y%ml%SC2*R zl()fzHl~SH1tl7)iD9n;pBg|}RCWG79t+#VYH!Og-2(PzV-);GH`T}Q@*JFkk;aqp zJqP2Z40r(ih>a?$-y0ns+Cm59(J^Q4g%Stdm)K?&ho$om132s0;(Q-spzK*NIgD-t zCo4E04GVJ$*j~55U?)J4CYXsG>xhL4D1Ll`RPZ|61iCQQXXr{_8xKFcZZLJp zv%`eXo04BRoV^qN*r-xJv%$L&4Tr+s;~VGjRcM{}y}e!WR$t@Kds2p4bW*k@i@KEZ zbL~m~=Pr>Wkp_OeHiMG@v3PLvqBQAm%H9K4B49$G+AdT}N}I)7UF`=1rYF=UN$kOzuwSPcbexFrAjz*0#@_O@*a6{O&F^ zrg|%1HsSJ&`9x5HfDM9~h_>KLZ}77hGNZePEXERi=j$iSQNB9eA+w4whTLpm0Xf`4 zBvZ+6SL*=I8_?stecIjm=Nzh;qAcC^r(I1@rVHn7Dxd+H=zSop6g8y@F3Y8LAN`{} zo?U$s>jrW8!wyD}R7_@R;dVUjMOlq`fafiz*1HhqNcjf8P5q0?Kstk7{lS#BFx7S! z+OvDvmNMbMTS;XWDQ{7479^MQ!%fwN;oFD(`T$ScaXySEI=t1>gE|IiqpKio<=ls{ z8o)Vx`F4@sQI+67fOR{&y`b@ci!$v@uusK!qfCD zwm9e(v517*4JB+?vDXHLpB$4F^z%RBSKZpg6UFf6;4lG~>$t@4 zEn;a18PqTLF{I&-+Fhq4H~0Z0Y&ID91w-w5so~G~TPT7)apVUm7`<=pl@1@B`B1i1 zGk~E)ac1%_oWQWnl z38^G@^;h%3P3nE}sN}E=uDuC9kIe*dFUX!Y@PNsmA&NO!2#X+EZC-sPB-EKv9(k&h zzv23*AXeGGiqX8+ce8QBEd`sDByHm_Kbi@L?-a($3~db%``Xb02TJwbM;3eI3xCIMQ$6T&YPCo$6*P$m})e@1V10U`p6!95lg!&<9) zL!LFwJQe~e6~xBhZK??JJ3>4o={goar16OqPWCSl6Nd_7;hzD{j!m~q{bx7_9;rVq zgJ4w>`+aSWtB7+UiG-@#;#p)UjKA_yGuz1s08j+ZvMu56(=I_Y`}B@t0d4TY=@Ejw zO(WT}ZxZXd%N7GtSzl01ViLD)Bmos{K52`om z=b{A6gDX_mONS(feg6AH7L2jmOVn2S7OtqWD{@&{g^QIW2KQ%c5ggW!DFxr`k zCJgUKKQWstIIF#%1_x!{`MHGQ`-&afjVBocPe?L>fMoK|{?UNIR1o{=Yo+j2uRaij z;b`)rg|?-{&h1nXyLmp>uaZ8Nd8yRDY^IUJcdUq;(~LF|{KjDWBLDC5$dLt)>va%x*=jWY&U;3UI%@&eF-_ zE3?Jnw=o<^OO9d@i#$nonOb%)A$d~_R=PwUP->MGM}TNG=47frRT97n5FrgBlRa>4 zpw?p8K`dyIjUP4gp()<}rpOPpmCcW(lj&`_15XOb3eMuZS$0^wR+VmII zMH??6fRwqtkPvx78`$OB_s?lCjxOqqUmILq3d{nQSw8Vf@rwqzEC_i2)o{=UAGE`- za-&WcAU0ZPc3#%oofd_$3mg?%w`pKbG0v%4|Vt znHU-6hqfSS2|6K)uYUZl$W3D7rWU9I$2?|zG=reJYGG@RwEj=QZcwn*P6-RZ z<9mcFlJzVoqAsuQf=hKAp-B$%JtVc|V2I7Hn_@tnaj=Z`-5R(sFoJ5_@O++9ry#_3n=7F4my&+jgZX#|snrgkcTw}G96am1sL(C3$@l9G8ODc#UJO$XB2Wi0VcjE; zd2m(~ds4`I0(w@b<=ww8Mg=%u_?0H%UdA6mNJ9l@Jrl7Ug|WekO>s|Hr0DGY&{#XWashMa4ueLDVSJqbfeG>YIs6QMN|^&%;=6{XkXkH zM30h++=^VZtjk&)z@cgFtV%swWoEQ94jhBn(V-5qSwVh8bjGObt&kC*N8XcZK~t^% zJFVz&Q_qGQ3FN3H7I{fxXpdu-l-cwXy}Th)kspY1wR3!{mDlX z$$RF#QVG>HECGeD6obq{7pg$>)jHxOGGGISI&(V9>_RZ9LbzPZum1zQf$9ns;pEh~ zsC%s-G;9go_0LCH2DKsg2dd!17~l{dze#uk|vqfS$Dk%hZ#9lE;WTsGU#YYRLNQcvaH(0;>7yNqE zJtvf~j%Po|_lI{opR9$TCGc>a2tO&QRD8ar#zZJS5Da)VSQ5*)-Rb&Cq`U_AU6~w9y z{uI!nHG3CvcY6bk4LN>rHn+%99OJfXMQ}1WqxDOXukXe_IB;W)+92DO79klXHqb1Vl zk!=bWEgumGD7os&UJ~lqQ}wfA1XU1AeJqaU`y!52e||xWba2-4mcZqjUDBDu7~-EC zY3WqA5kFWU-^6%KbN`4&EmKD-JEcnPw=FEL@c=D*&M+ors9nCo4yjei*~uXb z#5CxHY;iPTl;8^M@}j=W63#iR`^h8(0(_5CN2$pcFMfhnD`#w&ko|OqmNyuY$T{j% zC*3fb4hh3iDF*p?85zzUR|6^x(((m#dF|P+!JgULz^@Ii89@VwR=rKXLYb)VxYjNh zVe>7CY74pB60RFuzfL;h$7D8cc9v$r)pVW|z@%g_g!UaNUq)%Zz1wz9VLyxqFaXGb ztsYOear@V7&Z)Wa2~#diAxZ9b*=Can^+Y?#Hlh1`L+M?h}ZC>=>s}S zN#Q<4DL|Xp63u};$tSWSH;L8SBR45);;{{t^o4U4r=rVge)J&-ga7kZIfx7}jKt?M znD8p?4&qI5&zVQ~jXrJ25tbR(xN$q@O33U96t{x2)ZqiPWS82jS3w}lqs7UbNV)v5 z$0r0Tsyu6@P2*It+_A3LF$caZ-}rb9l&SIMlD?*-H;%vcx+c^akB9rXY~)dWR51>Gs4H7e!RD!Vu0K?ClUU#910vvTraxMQQun~q{Q+H5j~0i* zde_Z)^+5$7Ozz8tnvhg`^G~Qr$HI4qfLQI8_T&*#e zDjS$2;cI{7Ml~4ga9tYtjeRyAP2{g{` zs4J}}HM`>kzUZs2bQx{2fq6UT$FcFOBFS+fgGd;SL%fzbZQg?CIhl*yxNB0HtSgo5 zgcSpEHl6<}s?Fw8B3;F(t8n2mNpW+`Qg|ipf||WaZ04iK(r`&n|3SjD;p3~%e5}zu z&b2SqMciJlbO(GHW^DeKYeI&4cVR9Z=~}2u7<%@t{l!?HJ$k*G``!%iM-PO~-CUpb zebOigg6DYpAV(hb%fIRxx;pv1z5*@r_D22gWnXYHe%$EN+a9JWzs6K z191+O3StoC9cHja$=}3A<}WRTNy?ESQAmq7`YUH%?{s-l1!p06{We^4Ky?i{am15~ z$M-LNE24DQz2Sf=>FGzQQgzX!=R`xuMj99!rZ~+h5I*}~Q+dX?`?bV^fmlU6se98a zwSj;6?>WH8Sa+FnpxNh7N{uI_>3K!TBkgJd-mU~4kVU0Y>&}pbG}Vd+Ddva2qOB__ zQC3~Pd2KPxrlbQ!@|Nla4mO_%Mxc{k|Mfc|$=^eAf42C`NvtSXb%AAj(r_$k z>3u=yCtt?s2=Z9Ug z!evAtv&(&|sO%JWPLz3IU#AmCQ5;u~2BlbkYtsW7A49+|!viWf>$)R*EGj_heuZmK zYdO5{*@@(Ddp58fUHZ~6g1mF%D-<(O^J!Q!Z65t)XI>ekjc@oJ?$u zmPhJ9&#vp~!b58`;w$7YE3|>X(N6-g+G?A;xsvkdOh`wdG58AneC?kpl`t7xZ?FA! z5>buL-%C_s>ZJ*+X9wJ$RF1H4n~uA9&h*#W?PG`dg$C`eve^<0_OAqUsPW9*WC$A3 z%Q6uQM{ejCN(-ShZ->(;(lvV|?p7)tp z;k*2`7x8`1{hC%_sH^ngMhqfe9NJmJ6BpUi9EW#wLhkjU)Bx72_{t=1rtB;E6`kMJ z5%o)SYSBB4kV?)T|GFC$;3eDKAj;m*R74u;>+aXlcq#MU?j|s8=vmT@&3zY+NGP2d ztGJSz_2-2-`e!?7O03WR08LXV1_`&Xk2t}yaf;W0DthE!s7vLov3gi|e4h{R3_lyZ zv+cek^X@<5;gz%?i`8-0!U6>PW4jW!KM=kB7O|K=J22hvVy`ngX8wZ{QQn(|?~~B+ zLq;rBptNe9|13gI{S8t|nl>y4Mz{l?XIFQZB&)=;Tb%r>B-S<9K%YQu#-0Nn)jhG% zfKfxt#zKm6aA1yv3*hlB{YO5kyxpvDynzaM^<{y?7u#&{E#HczDa^sX2Vx~>tJjQ} zaAug?Y&C0mJ{;JVWtN3v+YPW`?9e)*DwwK8f*ze*mkn@=-aZtDm+Bl9$s^&Nd!dHB zIlFbPJ!K)9mW-7`wA48=Rgm`j1BwIJgAS%5CxC)4$}E3#XSspFKFxr~J0Dng!$^w{ zN;KkVxHDo`?f5yoDv6!hQ^2Kl+IKXJ_;+%BQT)_pP|j2~ed-4=VYdLRIJd8<~-Z7BJ=$||!spDP0 z3NSqeZBAMZ&;uuzFtItu9gr?1djL5BZ zoTHv2v0Pq#yBrit6RS$?%sh~>`o0<#gr*Hx3C}m^kqJdX5r}12{UiUT z?JhyZQ^uF2V=-kIG!{*s67EgsN@NIhyfmf@BrWs8>pF^2_L^nDH?4^-A+wuO-4@0M zKVO6}R1$mO_hu%-s^+2qM#Cq!s%DTHY^y`aG=GA9juY{vWB$9zpoo5{mAeYdxJxG@ z9cot=O+;3wTL`?im7`%mCM${UFg)D12!+du2dik%c*^Qa%F1CG$iwxt+E*erFL}ld zLl=d@9FSgt@$8rXNQYRRzN$!z64qjDK;Ka!IB=8Lp06D!Km~s>=%H!2{Lw?I!i7*b zEelY-1j|gg0NQc+44Fx?HYrbNc*{x!;Te!79Ms^J9TCD~L{Q_;|+0$YKX&;_tf)W;H)Y}1K zpD0PVMeGZQj)P@tuO0heLd$yHaYkyBKD>AL47^P{pBEUx3~)%zr)qhyPr6DaMRaeE zP>y_r8vS%~+UzoQ`4x}SGS!Y$1!rY$uitjN-hhSm13|^<`)!Tn*3zo4N?;K zzxge~e7l^u(WxQ1nyO5+XRjoDxUO=^wmWmPgf?9p9oe>*MNiBX2{b7|B=ewV-Z3Q3bb;7>8q z;vf_SWPP+Y{*+u};bth}XK^CXSvTL@NWae=A49 zmBR%FyGW5dHb~W>hifadK;Mj|zWQLu<;M%0l6=cIcC;`-cU!22o5VtwJJI+=s7NQT z^Bqnmeccui>u5V6kzHtC1TpAF!-+-?3Ph7J3I1Jl4I%*JFlh0hC&{9t1kDKAXjHNp_H#HzqwV9qQvxKxt5; zhtf@fLrU8&U^=R)x3$yNoihKP<(fuUJNTt#chQ5Wa9*WU*_P3eQt3WM^o z?%QGBA+aR(kzK~uY6=5!{`vKK4i1+HH`S+2R*`X&vpukgg@SzX6(WJyk{p;-d+Z27 z?p8064tN4oxu)iu=zX;2XLHZuGjA`9-eU=xef{KOggM*qO2e}oZhTd-Vwql`e&1vs zWhS2F=xclgJ%qbPm``Q6)?$-|ebFjKbWlzg9OyYEbs?!)&78Uz($yA8QM^_X-RQDt zFSWqoh?~Ub%O|o0lKq@xJ7#7IjQtjdlU@^e#I0tEn|+zt`DA9J>$(=7n}XfH2Fr5< z?gPHXr?zYuMR6$~&n^L9Vlo>yuWc#)@zKl8tRLZE|+{99gr1o$2mkQ^JHPle53AxnV z5ihz->jm73N8tpmz&~lFQc(3B^Sn2S)$=EY(7# zQBsaecO1Jb0(Qh?7DxtWp>4mvjHMRO`DYJ+kLs!nL{4(dYPQ!xID>CDX_Ay0D{WV( zMd#t@R!&`yQ$8loN2FqKNiD2tBr1q?^ysw}m|CY#xU)?ET*;9j_LX({(g;owHkGft8@AwX-YS`(9mlXZdKP{$K#2#V3ZIxzW zV0;ihH^m_H`V=^o*J|oI-keTYnQy7ahGZwWsLtq>XdsM1EsHj5jkT*DU9;c8Yga%TTgQw>5kogNG^E;~ zVxjC-2x^EPkeDA$Nvr4auHI3w2HnMzLpnS5-o$hhKcjNwQs;Y2(}ky$G;uE0bzftkYgCkj-P_Vs%I4T$E> zwckk>v?#VJZECZn>7DOch_@~)#K0GSin-@`U=~xcuzQw)B(4RpG=(L|^qm5p%Hq+_uE-Hb!t4j zcJ11=YuC`Z3HvjjIs;9>m;U?92=WfwB*I~3uALQrach(@XfN)hicnS_`>{c)x3TZC zdjpw8@BOW(DQYFZ#isS8!Ht%A!mWvQFy&RfD8@^1j|OVJexxm8pSgkt$xKS z3}m!F>yN%>J+e0I>*;=;3ZohHS*!a%vviLa=Uew22oawV*paumF_4joaxVOqvptov z&+Ou}W>NVw)~97JNo-&(_S*h%ieexhAFNnnG_XN!D~J`k`{>!G9HMD_=1GQW&7h5t zZfbQWQw`S;j}4tN#QVMhrL~~Re^v>eZM^GDOQ^jsKA550MUI7irJ4pdpxOcrEn*u` zu>=Vh4N5PCx$)8S7)R)NU;7-6K+(Y*MsNq-eKGsNc68uM(gfUF(DN}H!fYEkvj`5U zXr3IUEEOspi_u4yNTsXycsd?`@^t@Vu)+Iepo~&2J&LXOc*g>UablSJ-DGN~obZ>! zda8*L9bhF3Hi-5U)s3)$b&M?9I->;Roy_~byPzwqKGz(zC{DRExZ^Gjxdd$Mc@hL} z)bisN#Q$Z~Yk3OWf;s^-{54x%GgoV%Y+=mS$tc11Wst+MOd7*9dP9$e2O}7z!Vx`z z8V#A|kx5DoZ&Grsq0tED5^oxgCsmWBuO3^1hKM3Nmd2dL4$Pl6J2=?%)17as)O+a{ z`373Qu`YW=Hi=Pgu>B)EK9^7fu9O zxy1*5;oJTpF;0CK;cz9jzUHD3R%7n)g1+_OsO&u2)W~NQccf7HbFlrAlKl{oNw)7e zrNY4TfbTvQe842#avE85PNgHR93L%t(aR83#D1elLUxX)2*;(SPHU537r3EKmYn`T{R*x{Z+FWz>s6t}^ z(C~3D7T`s1^VFp|<)9jv0Dy;ZXOw7o_L^&;tA~+wLIL`DAk{qptw9&iR!9z3vx^uMb5@8m{i=|RLd!LMGD9FBW$2#W}$m% z&ZFY&4|+}#IaW! z-3%#JL?&~3^yVTgPbqVb9tInvpgNo#JeG9WiuUEfDI&czh);g_lT{#2=~vpA0>dhotW{hmnQR-b0CP2a8gX*IZ%M%OK$%79Gs-dYYd> zjAYN{q>*-ip-uw+O9!*i&mkET#x-%Ub-BlGUQmVh5ASD{oRjM1p~&IdF+p|*$hrFf zG!7UW!@9wV+5kKb*U9Y~Tp`9-n6eVK<;xlbw#`|`MZ~SEfu#27wx8k9p-TqB2>8HA zxAg4-P}VoVjb>HsB}#}%ZM)Q>cTmr%g-GO>cSKC%Bb2p1LVcjFW}o>^6tKBhIh0{o zS#T#C#T;(S!u=h!us*1L2I=kG9gJnrey3ua1im#=@kG&h zS0Byd4WcWi^_#K@ek#Eg-epwYJ&|;h?={JAO8r)rTGwf!R5$JZcWG;!C2+Qw(E_Hz z!Sc>-<*0sKg$j(`|KK!I-BJ=-qD3i-?V_rxY0{tx9P-Q=+qRIQ*UqeJ2Hq{CM5u3~ zSd8*hc9%d@`ucNttPgHBZH>UQXcGp3-eLxTbugyE z@pQlfNN@WqXvr`Q7&#Tl2|?M<&{b*S#|OnV5waUIx5)w1eI9c%p2< z>6;S)B)7d+N4mTBYuC55G$3cc=i$RRqUcJc=d=JxgLJ75viy&?(fpM3)Q%t&a#F;F zWU25{az5K5#PKCz@DIpH zM#`U;mvACK5_mMJ*Z#$L2_tL6wzs;@@a34FOGu&2K0Dfkqn;4@?7XiBAqt?8+gve7 zP1UJyQLP~bUA3dflv(MM-*(x|e8gh_(UnU#KYTYLXF;8hSL;}5R!kEejIxU5(oq-= zoqZZ)_1;xxPVm9UMulA3^u_SAhbjJY~t49`Ll`n)FWuH!l ziVZfSt&mBnEo)(hQO!KUnz4@(pPV`XEK@y6^Z@U^i z$_CgEC7Wp9YHCJE5|dki2FRY~=ERgs>oO1pNQAD@q0p71DQ#xYL*s04l;AojY1g5; zDlpi&VmZ_ssVtoTS7ggjMen2llmq1WYsE2%cIJ-3F=lu(C8c81Va}~x>8am2!YvE!wx!EZUQsnDNuH_~yV|;=aR*=s{od8xU z)>@rEZd=vR!3uE(30ThlVPFlSi`0ool|FHnNbH-Ehvo)A9Fv?e+9KN*|JD>y8a?gD zBWH(k(mAjH7$i=o zzMrYV7lsW}1M z#rQ_zwhw2N@d(daUOk0us`HzLcDQ}NdI?;Wdj4t+JkGTfwCx$$o@3Oz>t3NGY7*!dt{^s$UeQNlABS=I>^+JG4Z=KDUfT`UTT9B z-r)zFbDm6ZOixrV>PQ=A%%oB%t!d*1a-cWx=R5}1zI_%nGK^r> z?4a&gFl`A%d6F=(+Lu^PYKoen&kyqcRQ=roNzqU! zU_-M7T5ruid{46Y$=1D>{JSy1AJ7EEv96Kd1me=9{s;b*Xhzv!{5uS}TFnS0!zp|P zlOM0V_-?vrV~X#>=oiuu3UC;vDo+6MlxmF`{6oW5UAjOQE_Y}_gOIpQs!8R{#gJyHQf|E+u?u+_Rex0ig*x@3}R`kfj2AW|;%uc~X%x~#+BVQ#3- z*Z)cZ8XIhKR}_=j-G-pTJ0? zwoSf%wMhdT%>G{2pk!<-4H_8Q2AAp#ocH@|Vk8%G2KEmFAKOX?gDE~H@kA`p7$>=y zP`ua_={_2AjCNtj--8QO8#>rG*LH#nl^tscI1g4;FF6}mPb+MY`MrO=IRGJvi5racW4)3HsC}r9A73V8#+3WW3^^fdLI*f7$1ra zVp=nmwHJjD;}pc^2n@%W6OvIv{5>c2RN`yK){5A|=VyWhj)hl?c|98-%+aGnM77+x z3&toK`3&oVQZg?m90YA^&(|Xxi|@6`Vkpmf)0~aew|3h}+$O&GM=kr@B5zREME^GIs+oS3d-8GP2bT@{Qt zc5;X&x;1n-L|WOIH^X^EV%YC6)bKV>u0h|VXFkZIfgr)&Vhp|#X`h)m`+4+rp=3tj zo=ci4ULE;(v|AOk+l}+T!8%FGr@`HuOOh@kVUZc8kwuq>^d0(|#N{VXSpyhgR|bXJ z`_5usQm)&UPvo;e(|U+IjsrB{I5QkD*zsGIi3OA4RR$$sSyw|%!vO1yNY-W~IT-lm z8B>GLbL7x`PVo;IGOTX)-y|_!L}2|fSdlRmAKEmONVXXzF{Gg9Al^o0rPQs=i*%`e zc|#Uv$(oW`l>Cv~bTys^T4O5lzDSn3dENy4%1PojFdUDRDji?z=TN6^y)FV0T9p)# zCN15A24!j!uiOm=cmj1_-HeIuok zuedXEQSU3<0KfEDe+C*r$F~*&f2w$|c@Gf>kT-O}C5aTsKK}H(XkEQn2PdhY7!sO1 z=MzHzqv!es_k`1mhjOPh8jjl80$qfveMt;z=*??lx^MAKvleM0k+9G1U~roB=C&gI za%M?q!D^{jDadg4qMOhST3uX~EK&j#hG7a3;3s{c>7_^4mJ6#;qRR0JdHtdhTl&=} zlM7!kM6$#^(o#*ce=${OoP6!6c^b*K(&ip0Phr1}jb- zT;^%(MpWKgzn+}I>yuf>kcsbMVWO!YMzgCK>2?(cO-a=d|NM`vMryol)hv`CK*lD> zMS1v?v^vC5kah6p-N2#(S9q2|{8drMtVlBD>O9>}$}?9d|LGwb{*3qrrS6!860SeM z3TERx*tz)?nn*2>jlJWd)#TJ>-q+%^#G}o27Ne%PGJp)oYElBcKAEdW`_@PnGrhv8 zFgo|t1Xwf_=jZl==pa9Zl>51Ki@9sw5Ro{HY|X3Oi zd-DFv6&@z%JnjD%S6kg4Oiqam3fR~?jM8RcyYS(sF&ZeDp_8+SyxVF}7Q6;VEdV2{ zGTkJLc)x7gDDGVP>E2$+yDbEPNbkIQ!&6Qv)_7@#85wRpE_xFNWODv}(`HD`tGi8+ z0x*2;69ve`OyR|p$dCz^XequQYr9QOPcx1K^ zO}^|}7SU(9NRDp7+PqOCYU?ZQQlitC%>AO?M2dI-SojIncb!^13!Xk-4f1Nl_J^66 zO!bMLXP8VGqt>9JH23&5DyXuz=wIx%@vuINwp_SHL*hm~Z}Q$dZPmy89c4GVd00B* z(i=;CiJ~|&Cj5@06Kad4NhP?0tAJrzL+ar>7`2uY&SAlzf4y!1YuIy!_~O7l98%4> zUq@e2dzrOB63Dg;myR+4@g59w?H{^~vBNUZ5M*i6|3r{8`l(rNNgGlg9qz7b(7G&v z-X`)i-ukJN5%*o01`nu(=@qvJKMyBVVGjP} zj7J7?avqJ9u&}hIlb-G($J`?o6g>~7;k=*N@Ye2mLWSLx2PwH{m+>q=_1G1Qs(w<)K?1Od$ptTk_@bx|C@$D z6EAC7FX1j9@Pv_7HMepnGI8oW_8e^&pKhOZgnCzgN$WI-N7)~1h*CA`d)Fqp#^4>Z z%~o$CBu4HwTczs9vY_+NYE}$BL||NUTQUYqNWCDGYoae%9aJ`!; zh>l`qxsQ*jHresu_)0F2%~mRqYMFq%DVHz*s1ddf-~k&#{C=G1hP(Gs8X<-^{> zbG*lDDm1s_hqHtzfFbq%p;$4w+OFUaalVkOoJ!RPI(=S&Z#X9xi0TT6AZrliwlb%1 z?DDM3N_I=0kG*|rG-~&piPj;2M-@*ugUscHXadcoSd(JbjyeMY8_YYyQ52&jPc1nX zrPL%Gtfwpj+g!w#xv!03&*%K)k?HNAp{&0lcrFYYp7vQlgOnzC#j?vPMkPH9WNwqD zIZNkP2r+D37mzYW;K~3kA`K|@#xaq4=%_>Bb}dsoV_M;dwvZy9yK2hd3;|#Ss}8$C z(eYv!VeyF&B1Gcb3nXQkTXqbQvi@4}MpWhFXGcRm0UX$E=QYFB8$6YYp}y7B(JT=1 z+iS>CmowQ$U>UE`H5nq ze!l^dLmF6TK#}dik)2L9n%3S6{InW^jGg;iT4=He#;?1^VQi7eb6<_vg6)>g>?!Vq zS4WCHy76aL%d;dY?bOe<fl@=paPfwS}C;#V2TjAN0WQvUNrMQ~@mG$1TaT=$m~^(gp;RGAj8oIXty6CS)> z-~2HKIRGlf4%U_ME3_@>CyNWAmtoza?iVilA+u_PL&AuPvVmhHmpRNJ(~@}-DR%^O zI7uCo&Z546E{Fo;a=My=p&q*du(oP=Q=CDYfq)^29!`E&k?4PM|GBvx z<9*WR*AW#(Hdt1OL#Of@`Ulx@D>*Qg22D+tb^_V)pa)9*vDqNV*5hVsn83YF zneq5k6n^B0DCn*)KCvQ~YsmE$791(L^akc5DIG>7BPv2!>vG5p49Gde6M^gp)7v8s zmy4aHRCRW#s%h{FP)OEEZsFWzlNe3&?S%AUe-6tG&7!z>v_2-des_o>%b^l1YDzjX zVSxjnwR`1B1{W(aXi-4Au*M1iWi?fTkZ{xrZ{r>&F#q?l6G3>MZ#6*Ga4o^3k`X}` zV`4%(rjpilHPVs#=vT-O(2B#3yu%2)g0h`=FwhEY16$4W%`h*A8r_jh#5B{vk~pJjgf=o6C~kY01oD|bjHOueD-fA z#MDk*iQ8Ufv4lqrY+wmw$w+wT+m)n&tCuEr?L_qCueC-PL8Pn)$ItKSz(u>a7Ef9e z%iF6svkUCNe1aPQg2@C?y3^B>A*B2|L zm^gPU)S6_8YtM5GH{{9vLD*;K2B^4P@6E2#s=ZvWf#^i8Izde7zRQpXw(7=jwnpV2 z*^8E>7oPRVCR_oQ4}blP!&Swcr9LCcv&YwM#Y?l1KNm*}wg|j5+y~57GyqlvyBwLN1Lx=c*0T8=q_H60y$ zW%1J=!W{MT?K{X%Npt5yv8<;o!=dArm=`r((L$J2ZNH8?jWXH{zV3))GUHTGBFYT2 zgboLX?w5dK=_CtZ%f+*CoPt)pYi5I4|JsWs*JuZGb}bTYU~m2n($Ty+Dgv1oRaaJk z>M|@gP{q73XBeqmdz>c{mxl3!HY~X>A4l&>Ua1CpEG( zQrpB!&WQ4j)Z=Qgi<+dDrd3u!5;xuouBJ*Z_zuXn*D{d=AfpKcC4N0BWKqmJTl^f# z^WdLE)S0p_ql1{poGV_vCyK0n>}q78xI02FV!v8mvpFtU!XsC79GT;?atfw6OA7eTkQi;`ov3&(T4Qurz_EJ{aIr{Cv?5EaZZ z6%i`C-MF?*1%q@fG3ODd=N=^4AnCjDHdsXZzrN=5cH&L9evPDIX~1yjN|M=LC+V4f zU{vhXNyWfT?aGs}ugksp7?oOdq(#BDfJRVGyjQc_Le3({ieVsT1xuEL&;MP*i(;FY zz=ubWRl2?wBUo*mJN>2Hv+)`y4vLhaUVoUY@%P4?r zRBEOBsn_Z?E18Y>->XZ!S&l`J>+UGBb4I-hI}fge_@3j}YkeaNbo>ll(Q`FFamJ~n z^8j>LX%}O3IqRIguf5 zNnvXDhu6lpVAeuTZAGC14v(CvhliN1>jcjhDIEP`%9@s_N1wn%Pf(B#EsizTIaz%M3+fZ#!}tjqqv}!4;Y) zh;DSr8>0~zEau2MWj6!VvJ05JxE*! z3UVtKMYv+(ixjgngVqZ);mK8=`+*v7*Md$SIJ;@N&gPp*$+!b%ak^lAi<&7Lu;}Q+N z2ynk78Z6GnIFJq7JvcZGu<9Z;3BW~s1JB-+8GQ1>(u8;M8RfPyoKiRC-Fy{2$d}(z z7RiAX3@@ApVP&qr@WUnpDTd$^cqQr5jj@l5;KLuAVPqu^PiGNgIlbAz1a~!O8YugH z9Vn~#BwfUb4u;D{!St+Gd6gg{B%uf%38384a@qyUhnnH$#{KadNLeEpt$II)!;8A391BDo{8 zTLkI>CQ=k4I~wthO{74U8@DXs2;+IWjL2|2n2tmGoX9d5D)49w9_w?jqSiF^i6O}3 zSXeZ_c2E>qdtADLIZx9C6(A*5Cs7u@F?PT}AU%6=XX^_L`2hCCot1+aggEXM*Z56& z0!h?pT?detTu+{ov3Ap>cW}u+9ZXr;MMYeXr#ab!bms(XzzR#{`W2LqQB6Z-5LpkY zq^BIc$suR0MHV5B*RxeZ?R{vefn;*8Y1lEqBb0U8@9=Zt*~+J)Q(pMqEaBK}d^5j- zVeQsuf-+HvSx4J!{r` zcl$<>m6~Mx%jmU~XOUYlf|Z_h(?|X1SGk!buwy5vEx>IFX}jRh&5I zf=|bm6T^u@R@)*-G6VaP&GC|nrfy(^#dyay$xGkG8<3gbcLv$%+PK3AbZ%4fOt>U5 zJml>rZhp=F+J!PIy60wN;pNp~RD%k}DgNzX&2Pnfl(P1~NDX-kphjcER@SHxDA6>? z#k{Na^z$AI3KX#PPXm%mUUzn=31lDKsC)AH`cY>PBQtDNLGN8)Z(6~k$kJo!3?$EZ zHU>hPvO6IYNw3z>AB^HMSC3{I{E%?=2ior7_$ldNSY}@va!updaQX#CML|JeB4 z_#waF7n(@}vU@S5B&l664(SAx;_K_asI3JC{Wj(BaG1cSz06Rj2`+Ii!itmNZW!h~ z-bg$VOIU6K^$2Cr1tI^jePUX1eTp-6XsLshElzNlP>zB!VURbBRNLHTbKHJq2`Xxv z+eWu*3^(*FF9*AbjXsoe$5}V3(IC1?kdOPC)GkR57tpPS6z}-1bw|n7>%tCb%3*N8 z8m((5I!~A@ya`ts@K;t2qw+*eqV}vKHp1W{L{!0RhSP6I;rN_fnBrF1EbBsRh_vAR z{ja=?unj{NWsw$6W!;bhrc0wQ$4ep1(H^kq?0%a6*Se;u*f_bA%Uq-qk9uS^?9@T2 zINOPbN{gn(YohEpKZ;+V>ljoMYyWFPX(i@RRutRbK zvaXbnYTop8X$@lbt?3iO6yS$%n!RTI?(dTbV>i`g=nPFk$T8KLHf!`yO^&kd$z=Cf?RS+3Jx)JV18c zsG1EBsDqKrt$KTX1A-*=dAFecJeWZg7zr!5m-ew*$XS==DaI60pA&Dwf}*Dmc6J8Jv}35fu_zN`e3Y`j`-hAJvJNH)Yt=32sj6aG#U)KuE*%4P5RCRLq>-dz z5bE1Cgk;NA!KJSqrB;Z0uGdUF!%%-w6JDMB+W2Ro-b2=l*=^-lU9u2pPQ|VVdfE3^ zD4ZA%`{M2)i$;x-YB|FxsgF2J7*g|Jq#EvydAL}v=Rw%)8jyV=54xY!;j$>eTIA7- zpc`-^WUfvMALAm@z;G*>1Ovnx6Tij?MtDTGX%xIS)LdfLK1=y1ne45;4+4O)-KR4Y-sS`BwuWVPiYiGqd8;EKgxJYU z#&UDQzF6wrzy{gY5QbFwbKnU0;xQA?M%io7Mrz+~C1SV~06n1)j@0OLkPCa&X6W#x zK3jn&-MA^f3vf4T*qQ9?k;V|B-4#yZeRw-OG_%yrQB;%Lw;RHX;_NFk81mZIRJq)^ zI@{p{jr>oJ1c$gCKW|a$Q`rVKAe(H}MOa0$RE2Efr(m#sv&(hxEcLx{UN9E4XB@~Y zgB?m7O6Kr8_j*pR(^Oo+qI8TDC1d*nn)sM*>?Va8Ces z5Owxu6U8*Tm4nsP&CQ00({%thc^@wzl-lo6;dSm?U1-YGat)VAmMv4x!}4iwIUVvd zimW}(6bZGbFu_L?ELtsmGtbft^p<|*oYP$mdoxO-+dJrBJB&A%p^*g z;u5-I^;Cuds2&VgI$l!uhG6kz13FyD;}8FL+jz6k|+x$%&@v~W9?5^V@vDaKdj-rqqpHB*!P)?%A zio{;=s30@JVRX_-qhzcwVd(ZICwhPc6h)2)R8EY$aTR#AeOg!88>4K8H2YF%33M!tv=GAn z{bfQBPK2^}1Nr3qb9Q9FM%g|l#?@~w*%AK4rzVBR-R8K?>Vo(JZiuQu1btSQ2Vc|W zhlQse(s(;y5~XY;FlAaorFeZ#FUC4n=0gJ6yI(%5N1|~+LdD0a-QqnW#M|;T?11tj zhhz$G7!sQcOrpqcurhf3>on0cmUG3eG4=PgtU{7mbB>z`6TsXXm*!68c(cRcN(0(l z@rz)J3AY!iY25k*|M|aAw%x#WBEH?sJ!0b6;^P%owAKD!BoO4@cS=MQz((;Ky9i{% zJDD}>i+|5l!x4wV%mp@}Hb&eZ62c;s^~p?wPY)AGzO^&dYdItL1cGcAZWh34fclk& z0Q}ZT%4s;aEe;7SJOY2P0PO7%o^@`c(IzyZV1+<-*2l|$1uo0r2Iz9j?+jrLz{FdO zcoddpq{C_ctkCo$fEg@|aSh0dTDYaP#b}{~iXTEbCfMLq#YzK5MsAp*-XJUv6MT0J z$ja+HU}jVLdh!m2Q%6BupD+u|L!+y_B3-R5ifr?3(9>{{#eL^EHr+YC4&ft8=Dw~M zu@RuzR&k$H7^H7*Ga0E1N8GYhvQeKSNjTYX_qrR&(gO4LTFnZ}tpJHdkqvus-}DHO zEMZP9-;MyQx)9qhZN5(rMq;7l9$6;d?;h?p++^M{nxPSWJzXMf%LR_7GVxcG5JlE4 zEc#Z`M$JXsOYfv;Dr|UaivV(|&(y= z&q|qJR^S4X2(pZ7KxL9f9trbF=5Mf$QnGV~C~V^mGhMj#&{G1LXFe-fTWb5JH5!b* zt}xJiRN1(I@ei_M*8_~i$FN5S>AyBRg1dU3AcN?h`<`ToLl*InOe>JRlM8O?``)oq z5hg>X(I+Kx@{u4>j7eYjR&E|eHnn%$+X9<}T@{3HHTrg^2cE$LFt;cBxEO}a z(6h0-aI97c3E@kOS%QGRS8}u9cyS*B2&h~sM0MJ-x&~y?^YcY<@`7<9zwKpBc|oJp z&f9R{4Hkq2enA)k7Ms|RAs6mXM(Tcpw~G2^eSiT1Qut~*5@<|J{-SK)+{;NruD>{< zXw%2m_GqiSFH?mL7k3ryhEq@32mUbe)|9(A{A2%Kt-~0e7m`A-CfcVUM>pX$>9h z#S099@+(E6AI0Z*RQS5K2+ih1uiRi7d;m@zu`z*RkND?xGfYzAe%2A1n#AY8DY>M! z$2@1(=foR2SbF`G(^Wrn{B^3;Q%1^L_v9~Rbob!vqw|nW^z!&0w&ZZ4lnGMMATqmT zAXM4>P}dsBhu1-Lh=w1aP1{YRg|(#nf)w7#`e3bM0Vd&24-yR4T(V^ zr+bMa0tIm#Qn_fGj?ND;c373a8AwLvJ<=KOZu7@F>+{--vK7f9X++K*SnP)#Nvaud ztHPWhwd*Mf&9XJzhzalJWr>u8pdC+HdqZ3d{k{~Ww{I(u5v;DRh=X(O5GS#h;R3MYWYJouCRt5M3K;qaS zzk2j;onAZl*D|aRc$;Cbu9rEVZCaxm?Vf(JkjrZ;7KcRI2xWbT!szuME*W5hZIg3M z4fhi$aU44^Z}hLHESRzStLY52csV3E!&N(d42MCW525v_+ARnrpBQGV{Ri1yKQoBy zw9`BmE#PalKyY$=Mzg2IWs(t-t_=Fi~tbHwe}BY zA!( z))eFwz->6!c1wcHTf9)&1xYQ$+na43FMIH;_!&CAsKK$-Beb+I+Pc z$c{efWLnAD~>u!U%^+6nc1(w?&=4??mxObDv zP>}6zLUo+3X|3UFS9Sv5#1ABH(%^()_b}+sSltN)YVf^DlnXSy8C=xq_hzyeQ8X^u zXkY{Nn=Ft3GNnS~RxZS+3uLzmPhYpyYKj+t^Hm`b$=6W{!dED(Iuif6SJboPGf(z0 z(KbEizKn`Sc(%NA7o=0FhvJC~tw#Gfgv_-Q1U5K!KY3?}U_h_;)KsY7mG>P&J+1G& z={NC>JMjsL-v0t!Lf~9--nm2s6qap8n2nl?uVVYw7>-7qTO;~Kgt8ZI z97AULT))Xx2n=k|@NDA08pkQQ`cE!84S-=++lXnX)7MkoA(SvG$Il>+m&LS#(|3Bj zCOgu4u>&D@l(LpFB_TvLI=xSfaes9aJyl+JB6tx9`aCj+SAgZgwWB$vT`w&sPGyB< z9LP#b903DP>nSHqn$h|uHD^4 zdwl3x9E6o=%gMsU%`E%;{tCB~O1jJx%cq`>HALGY%D43O2GkJkD+YaBv;+l_q``U? zd{UowF-$`!z`5`CyztA)IoK)D=;2(^igBeCCn|W%zaQy?J7E@o8A_)9QDiOXN@%LL z@39#o+g62Rr_Fa~Ff`fl^YEGo6Hxf|-yN_-vW_mpqjZ1LL^C#B5EILAo7Tt?XdCJ4 zz6l>SP?iSQ>PTqsvJi5X0uPTsak#;NyWs;qOgI3{!A^3l53N`eFC|m;B}2z9&7~<> zhQxEajw&=EXJ49?%%b`%U3&)A!KT=u`3A=A{aTomZ4MyJhD8q{9>d`JXhc{V94f8= zvR$uPIa+V!auMfyLNJSxJ0O61Mks5U|En&d{ucWmX@??&uHtOP;h{_auz_<|H-WhG zy4eg7)i+r&q+iQtB?DpGK1K|^9e-{%9Ko|Vx8QP^;OXA;_Sg*#ThK!cq*cs~h$7!q zIopPm;++(RWcc|kG7M%N$E=)FMnTma8TZ?NI}cHcUgQ4UTaTtxQU&59PyUn3fOq;nSNquYa_bWQ2r{j(^t&V82z;_`xp zK@{W~a#0;h@_o~i=V%mn*Oo%Y$@;<$-heDB*g1SXWJ_q*lJXAJDOBf{1A>}^ZIlg; z4pa8zW%=~ch@1s39&n`hS%DUIX`(r>^fyCvVqYyD^Eswbw}ooLity4*rf)MRlbEUr;D2XYI}}=p+Xj;zOvM+gF@K zSW0$}A823@gnc5!@<2=;)ZPreiMWZ+AM=5Z zZ>;{ZPApw_m36}D&fBlAY_J<3M;8zD**o^vkO}dPpKyXDB1y1;Iyl_BkOHv5QI4nV z?pJDn^7s07n;4aITrY#6s-HUT#TIpm<-=AJk+b+F$fvd5WedV6qM21NPdmztzHX+jcnjU7!$DZ5#}5&ipBeyZq%1+ z-p~?p5Pry&MYz4gKIpe#2pYnPB5*EcEac7qLDuD1U0_q`&o4w~`-@vfBSrk07rCEP z3ox!-lqxgI>0&Y)C9FR?aJ2?~$0$IuuGzKVDsoskZ6IY*kxlL#MV2fRtqcSSy~0uJ zwHGd;Ah~90O^lcNf3}*?>i`~{q&cN@# zR3dUV`4vGI#W&Io@#<&=`NUaDuIa!x#x^zu$wW(5?0yB@BGZ@GY^!jr;j^p7`|9xTG%ul+?fY#)zwFy|Mmt)@mPkjp6O zj|&Hp4!gqwklZpG9dc{%3&<=((@^DPN&!1lVpLZDqiJh21Vy z)4eN4dIFl_EBeF0PYhUeLQUTs(8RW?VZvA&bI^lqbLs*H=11SWj=a?27>`W`V_Aiw z8UbZ%G2T4QQ6(s6XF_nAmfKVEVNp#AZ<^m+jYD)%%F=~51Qux-V%H6w?8Qpa7ZdKA z%vGoykNG(Q1vmm)jEOq6I@^+xd7s4#h(_C&#^-a1$Nf6`G@`QR);dBB`s{666FmXs zgH(r*zP(huWlQh8no718{uCo|J$yfPP!F*2zVWt?29X+kHit9Z1M|8-WrJfuTky%4 zd|Jc9$U;$&|I@XwK4Ywt+z*0h0X?1;1nGNt)pjnt0889O;rKe7n8QpucYn*`KQZ!; zuQ3oc*iy)WY@R_H3$p?Cd896)0xwB<_f~*rF&}0Ld7Z6FJ-Lc(R$bFYpa6&RgHOB_$yH^PowVL5A))C*fgSlaDjt?Q=T8KO&Gr;A>!Zp;|HMH8_IIuVjhn2PRP z+l-^9-k(?u0*~KYY(N3bN!L9f;vLwt9c2T0_z6xrDazC;q#!Dg&*Gl$jwZA&n|1_3 zIs%(7ZSAa*l;8gk&RE{R+ihnOwRz~}Wu)?PTS=0sW`LE-jABB%62kuc0zhrW{wpH>iRxqxhozAuTEO7_M*1>z4+kPfiayI*;SC1?~g z>4jDZ!!nMD%KL>jM0r+{c5Jb7Xh8c6q46&D0wa=a64*e?TNv~ssvaIIKZ6&?PPeN? zioCED^rC`(Ej~X`D{&eRZn08An>CI=gPg5Z{Fpt+?&9e&&A;HcVzT6xR3;=fUx!SRj0-))uQh9UdgYz;5_9!lPXY0@j%_!ikF zZ4_PJ>@~;}aLW(o2aE{MqW?>EkC?FI-M22B8@Js-Pr0W*QrkLyU8TbfgEOm`F|Zv> zpBiB=A!(B4I6h3oDKU32-u4C*ZFl)Cd7VWR zE#UOV*Jc*T$5Ut>4i)$N*bmliGj=7dLJ3H55u(mZ>l&7pEDwZ2MbOc=z0X%MS(!dS z4Pa?&gea`z_fPLO#fz%iT-)mOJ^}m&bcKX~M$HbUV}Je|)1?il?gJY|of6}>N%%$t z*<+pF)PcpZsTHfB@b84~}1qHU@g6Q;&c@-k6 zx;ui1{y6IXXLcKZ+j-F_37;7v%J(qC6F;6j5E*PQl*TX(egO}kmo*%7yyGtp90m_B zPX_}Jnot^oWvtixqd7y8AC}^i5oDiPv>nuz3sFDRy;aBx4pz3!Mk=-NiKAY)7%DJP z`_9Zn?YCT^FoNFgoQ#aS?8`MV8%bBlL6};?&90g=WXZPhDdqzUx0CDh${?f;wSyL`^)WMwKs!EjK{6)&S1Uz;yz zeCqT$Jj2oeqvY!0gi|FEWGxTQ5ViK*@^dg;f_NyI<0JzJEKjXR74t3U-e0V4C>cB? z5;Xc-w{i!ruqr)a!hVOZV{p4!l`?{&JZl|+pL2#)`dK#$q8=dz0;aaCYN}eO@3#{) zAxH(&RKCk_wH)2^jKo2nZ#prz6h2m`qC^!$$H?!l1$m=`!kFSm&|uC}KZxuXu687y zln*8j<+#t}`@b0zIizweLkIG5@U7F~fv)5#Z^yOpd|KcMnSg<3MOeFtNCW#vzqLo; zsF5I<7I(`Z44z)wW-JB$NG=O=h>!-PY{$cWb3m`TYrs$Pi_MZW;cby$Wy92X@(xq@P*00d6e9M&+PfC-D5^95&CEU~VG}1B zU=srjA>fJ;Vm3&SP_8Q{2{x7$O#o3?FvMU3O%W9=!rkzOMuRkDgNT!=HKB)|)KVdl;SenH63k*%g3r*_7e(mr&ax~2L*|~dv-dsU{e9oP_q)&0`N18jD0|!AR@6eq zkP_iKVgyNQeG_QKE124mc@o}Aa9PBlw4`5!0}O0=UPwO%=(#asA#pKt&B3#I`xvfd z&2jI853=qgK+Tj6CH znTwmHv2!G1Eks_`GtQ(^l*TQH?Llt`^ZC7ZN@g5c=almy_~p;(5wB|7b-@Abn@YtN zC-t>OGKZ%yI3N*KgOCP6JX-r4ERTaBU^6~xu()bICG^Dv*Ji=5@LXB?9C-X!1F=I z>l|A3-Y7{lY{?JA%E<4^KnG#@_qxXdCtIVW&PlJ@%1q2)F*qn zkA{{+w{k4nDRo6w5e>AMkt`60DNo#vqI$;6MIxvJq;V!J(kfXRATEW9Bdd%Z5`w?~ zXXn%?rs*Hc2}vY1PO5DeHK(wIAxs!$oDxMM|F8|~z|bP4*e8)_x}s}DD5*i(aB0mz zBO$ZRox)qmuYqXmDc4jZGx83FAdz>#w~U;c2)=AI+7nU@!VFJ0bLslHzcwVNV}#eo z91I03GE<}UII&3)U8M1RZQ|)#KcnJ)jxDL5aRYM`xBhTH&xUu*FjOp$M+)oseCM_L zB9L-+qQoKY-$g^EsGGCSaR7F?o&C=ygpl5G2fVP8W2gz22OqFO-71}Y5;?&DGC$6n zf&*?gl|wl@{b>k=8gvA0E~9l7WvIx?qstI8PONj@Lb!B)QCPx%GfxL(lz(Cxkd?29pmIYbyzb^Uua0s2U*4#N%lt}f7rs=?En+otP1oHVolx<9Jmtn+m6a&W|L%c< zd|f+8!Or9(#|Lgn5Q|M|2+}(aG@QU(qLJsqbl-UMfEPt5os8W;F{52_Ev4D=kd~!W zTbSzE-&)0qjd|snOeVrzwV0oMvQw%{w6pM(IWEX`)k_RFM%ES!sh~`09d1P)da2lI zK;WU%4JQ7a7vJKb%>T0|LLm10+oxJUD}i?zwSIegKpD5hfFUNOhfr*v23=EHyKy`N z&#xYITm+Q&k+IJT7B8ppe{)IJ)BgBDyFo13s0(o16?i3;(7K)6; z52=K~_5{yBa22j}#KL{)eTTs1;Vmnpu_zEE@7O4)+&1Iy5v&YvTlzejW99lu=RV^c z$v)aBOKrvbfLgqQZ60_SxuVqAVuVg%xrtZ#3k)v&s9&M=V#_WQBl*;08XT#owm+~6 z1$?+2+N$>4_XRm2St@%QA@K^P{Fvv4^LqA)kn3%C;SpjTUE#sPzaqA8%)=IYx(A?2O4Q?C)>F1FEx6#Beod2RIV5n9O2>fe0k;a>t=pcZOi| zjckyZ?wZ0N9z3n%ILe|uJkt!c$kO{4wB3neO{!!dHuat0d>WQbJ^iXtZ(C;tqgY`q z|MP7eVKBPyRsDf|$hH64HCc?$*(}sv>5KE>s7dZ0L$fuse!12 zFEQix+gi)QWJhCDh0wZ2o@z&i?$_rP2f@X=4?Y3EU;L&<2Z#eZHJ)e`1a zF+|YtRS%>Jw0=lj!;T}Do55F@;Y~lj2_*X0cMDfZ#Sx6Kq+}_g;Y#Q(*;PW)hNICG zw1%RB!5r93)!1{@7?nh`(qpw%eFHcl4PqOBn=pv&$v<4^*5pAKP)|voJHNOUvlBB|h8bw2Qj8O8YtV-L}g zC1w^w=Uh<`qP)_D(6gD=pzLu``W?|!IM@HXpoWKT&;6XVH10dKD9ZZL z+LKXxO6chdHu5N%5N zwjFH(y^~LmKyAp1Qg?#bq?Wc4!an`7qm~xG8ib+gN-mU3v1U{iqM*nI^1E@F$-wfH zo#I}hIme2zCs^wH^JzwqYVIN#pTgU4#H5K#9KhviqPEYbXC=i-Yd>rRYy@lsYy@ls zYy@lsYy^4{0(Hb~O|Td7+b*h&fQ^8SfQ^8SfQ^8Sz)uLIN!G03BzsoyCroUcjew0n z??b>E727Rg?_<1OVjBS)fh!P5lkK(QE8wuLHUc&RHUc&RHUc&RHUhm00eh{uSFzhJ ztc`$;fQ^8SfQ^8SfQ`Tv2&5_YTJaTd*j5_>8-ZSmfW21SOBrt$+eW}f;0gq?kCsU; F`ag)|dKLfx literal 0 HcmV?d00001 diff --git a/software/chipwhisperer/hardware/firmware/open_fw.py b/software/chipwhisperer/hardware/firmware/open_fw.py index 8908ae5f5..56beacd84 100644 --- a/software/chipwhisperer/hardware/firmware/open_fw.py +++ b/software/chipwhisperer/hardware/firmware/open_fw.py @@ -43,6 +43,15 @@ def registers(dev_name, filelike=True): return data pass +def getsome_generator(dev_name): + def getsome(item, filelike=True): + with open(res_file_path(dev_name, item), "rb") as f: + data = f.read() + if filelike: + data = io.BytesIO(data) + return data + return getsome + def _extract_file(getsome, item): data = getsome(item).read() with open(item, "wb") as f: diff --git a/software/chipwhisperer/hardware/naeusb/programmer_neorv32.py b/software/chipwhisperer/hardware/naeusb/programmer_neorv32.py index 4610ab4bd..f88b1ab2f 100644 --- a/software/chipwhisperer/hardware/naeusb/programmer_neorv32.py +++ b/software/chipwhisperer/hardware/naeusb/programmer_neorv32.py @@ -119,11 +119,13 @@ def load_ice40(self, bsfile=None, force_ice40type=None): devtype = devtype[0].lower() if devtype == "ice40up5k": - from chipwhisperer.hardware.firmware.cwtargetice40 import getsome + # from chipwhisperer.hardware.firmware.cwtargetice40 import getsome + from ..firmware.open_fw import res_file_path else: raise ValueError("Device type: %s. I don't have a pre-built FPGA bitstream for you (or connection bad)."%devtype) - bsdata = getsome("neorv32_iCE40CW312_MinimalBoot_directclk_7370KHz.bit").read() + # bsdata = getsome("neorv32_iCE40CW312_MinimalBoot_directclk_7370KHz.bit").read() + bsdata = open(res_file_path("neorv32_iCE40CW312_MinimalBoot_directclk_7370KHz.bit"), "rb").read() else: target_logger.info("ice40: Loading bitstream from %s"%bsfile) f = open(bsfile, "rb")