From efd659642185904054e133c0d4bded978cec0edb Mon Sep 17 00:00:00 2001 From: sheychen Date: Thu, 9 Feb 2017 15:52:48 +0100 Subject: [PATCH] Initial version --- Exemple/Content/Content.mgcb | 17 +- Exemple/Content/Fonts/Normal.spritefont | 60 +++ Exemple/Content/Fonts/Title.spritefont | 60 +++ Exemple/Content/Textures/Background.jpg | Bin 88624 -> 0 bytes Exemple/Content/Textures/Background.png | Bin 0 -> 13701 bytes .../Content/Textures/Boxes/0/bottomCenter.png | Bin 167 -> 0 bytes .../Content/Textures/Boxes/0/bottomLeft.png | Bin 306 -> 0 bytes .../Content/Textures/Boxes/0/bottomRight.png | Bin 297 -> 0 bytes .../Content/Textures/Boxes/0/centerCenter.png | Bin 167 -> 0 bytes .../Content/Textures/Boxes/0/centerLeft.png | Bin 168 -> 0 bytes .../Content/Textures/Boxes/0/centerRight.png | Bin 173 -> 0 bytes .../Content/Textures/Boxes/0/topCenter.png | Bin 166 -> 0 bytes Exemple/Content/Textures/Boxes/0/topLeft.png | Bin 305 -> 0 bytes Exemple/Content/Textures/Boxes/0/topRight.png | Bin 300 -> 0 bytes Exemple/Exemple.csproj | 42 +- Exemple/MainGame.cs | 120 ++--- Exemple/Program.cs | 4 +- License.md | 15 + MyMonoGameAddin.sln | 6 + MyMonoGameAddin/BoxTexture.cs | 120 ++++- MyMonoGameAddin/Colors.cs | 44 +- MyMonoGameAddin/GUIManager.cs | 10 - MyMonoGameAddin/InputsManager.cs | 179 +++++++- MyMonoGameAddin/KeyChar.cs | 212 +++++++++ MyMonoGameAddin/MyMonoGameAddin.csproj | 13 +- MyMonoGameAddin/ResourcesManager.cs | 163 ++++++- MyMonoGameAddin/Skin.cs | 22 + MyMonoGameAddin/UIManager.cs | 414 ++++++++++++++++++ MyMonoGameAddin/Vector.cs | 8 +- README.md | 1 - Readme.md | 36 ++ 31 files changed, 1468 insertions(+), 78 deletions(-) create mode 100644 Exemple/Content/Fonts/Normal.spritefont create mode 100644 Exemple/Content/Fonts/Title.spritefont delete mode 100755 Exemple/Content/Textures/Background.jpg create mode 100755 Exemple/Content/Textures/Background.png delete mode 100755 Exemple/Content/Textures/Boxes/0/bottomCenter.png delete mode 100755 Exemple/Content/Textures/Boxes/0/bottomLeft.png delete mode 100755 Exemple/Content/Textures/Boxes/0/bottomRight.png delete mode 100755 Exemple/Content/Textures/Boxes/0/centerCenter.png delete mode 100755 Exemple/Content/Textures/Boxes/0/centerLeft.png delete mode 100755 Exemple/Content/Textures/Boxes/0/centerRight.png delete mode 100755 Exemple/Content/Textures/Boxes/0/topCenter.png delete mode 100755 Exemple/Content/Textures/Boxes/0/topLeft.png delete mode 100755 Exemple/Content/Textures/Boxes/0/topRight.png create mode 100644 License.md delete mode 100644 MyMonoGameAddin/GUIManager.cs create mode 100644 MyMonoGameAddin/KeyChar.cs create mode 100644 MyMonoGameAddin/Skin.cs create mode 100644 MyMonoGameAddin/UIManager.cs delete mode 100644 README.md create mode 100755 Readme.md diff --git a/Exemple/Content/Content.mgcb b/Exemple/Content/Content.mgcb index a14ef62..de2134b 100644 --- a/Exemple/Content/Content.mgcb +++ b/Exemple/Content/Content.mgcb @@ -1,7 +1,9 @@ -#----------------------------- Global Properties ----------------------------# + +#----------------------------- Global Properties ----------------------------# /outputDir:bin/$(Platform) /intermediateDir:obj/$(Platform) +/platform:Windows /config: /profile:Reach /compress:False @@ -10,3 +12,16 @@ #---------------------------------- Content ---------------------------------# + +#begin Fonts/Title.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:TextureFormat=Compressed +/build:Fonts/Title.spritefont + +#begin Fonts/Normal.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:TextureFormat=Compressed +/build:Fonts/Normal.spritefont + diff --git a/Exemple/Content/Fonts/Normal.spritefont b/Exemple/Content/Fonts/Normal.spritefont new file mode 100644 index 0000000..684206d --- /dev/null +++ b/Exemple/Content/Fonts/Normal.spritefont @@ -0,0 +1,60 @@ + + + + + + + Cantarell + + + 12 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Exemple/Content/Fonts/Title.spritefont b/Exemple/Content/Fonts/Title.spritefont new file mode 100644 index 0000000..9495683 --- /dev/null +++ b/Exemple/Content/Fonts/Title.spritefont @@ -0,0 +1,60 @@ + + + + + + + Cantarell + + + 32 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Exemple/Content/Textures/Background.jpg b/Exemple/Content/Textures/Background.jpg deleted file mode 100755 index ddfdb74cfcac57ad6bc17508c2e80bb9e6195f76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88624 zcmd422UJtb*Ef8qp$HMAC@m^TFQOC`Bq&!9xpe7D6s1N$1f+!oK|nx2Q9wZ{BGQSJ z5PCoaR78631VMU24W#fM@4r0vDQkW2_pSB4>pd{xB;?G@p4s!;zrFX&!SKN}aQK?O zp+3OG#01;|e}ID-!0k$)y9)pq8w2tH0B``TOd+k*B?p}V%Ue12U)s#;wtDXT{8UyqIW+tZJzyG{g*jRpF z?5wOTY!G$`^7HJnW=_eo79>HZ2R&RuQff1&$iGGVOS1nx!NUJPN%n8S z{zI-&;1CNFIC(65036sO*dN1tkO?s&Ava9MZEBZl?E;POXGoHw$E3Vd!n9q+TE1_V z1TTE*dj9h+B3a$9cA;OTq)S)^~`p{ zH+bsXcQvNsBTw)?y0CLJlU}eEy~0AFI_aaWj)G5HjyLPrig<0^uqRPjis){)HLjHp_KLx)|28} zqF9lqz6ps|p8RyHhFWh^N>d90sCFeLxs!Y!5V1{=h~qd8hlWD?(rJdnKa($ zU*64L%)&x0dbTZS#ok95$PbPMV02far9uC76-EWQAZJOIxz#ofXH&%YFbiV5yX01P z{cPxdnsPsrQ><(j^M~lHd=Ix^E}-&)x$fc>z?G8JKjEGvyM=v*abIUQQncX}*u_>z zGi5tpYz;!RL8Fma_X<>cIS+uoL9e99v^_AE`F5@Z)>-Z6#2U?A@v&9GEzhkw4F;Gu(C81E9YoWwyt|ub=j;ezGQ+!?gqB zpcL|4BJK_GLV{_c^tTu<=wV07yp}>#HMhitZ1Lr7_|6?li)O5%;;4b=cj5C{&>Y4o zntXI?Rk;p&V`1H9K9wdAuw&OAy)F8rS<5PMa(`$^y%f7M0rT4a@qHVc2=`8Z($_Sa z_qvi6Ps?Z79Aj{XxQs$S8+^RIYs+|r9a|62+>jYP0IC(p(K~DvR+LV)j)`H6JUxRV zcL1CW#Ztq=v|gLvb>`_4*!ttK5ABz&PR|)^nY#6IN9Bt{%X{5ybD7_?B5f0`m0Dd} z@<*Q#29+_BMHuN^NHPQWvm(33#TU3><#9Ry(Yw|F>S(Vf|k>4?QI9Zh=F6@s`>jg2Tne# z;1^Ydlo`CU zr?FKh+E5&3hF3QR*YC8TLznl&=tXd6Ps9#0WtpdeULVh!?pN^#xj<63MQmuR=m21~ zqGN}4;^}df;+GAX$K7|zT2+0X@*nMnECkTRpOX^0T5?)~Kdqlt`vaP;{klP6I&(ym z!Bs~DMZ{bqMMlQCgLk9qHBq|VQ79p7&lE-L+Rsv&%5;$AbLps^vEY|lQRtpW2o`iJ zfuxU-K=(0t@nl6LbjNc=+K=t3)GaF246@!%S*>ifI2g+^`;&4JyuJ%Ag%g&{BjL32dT<+lz-;BdNva7Am&vRLq+iIKR zd(WBuf!Hg?UAhu?h#07b-ACkiZPO39`laD@gnr`|R(*ffv0%lCVi%H^otmg%Iqb#$B?7J{7 zu>7}&{$9cVPxmZ)MTGA0Jk#C^(dP0S5)m6%=Nghco^(A01J%Q@0YU7Eq?!1pJ%gW) zku#ahdxxXxjtxeJlU^fuzhkVdU1&nYqNfsF?Jare=P0?Cxs zn>H<-x|a%0u2I_utGkYl?*&JQ?G|OQ_rJ!y3R>5N-J;3YY^EHgmV`3RFva=X?+s1o z2s=CoE&4^^JOGO9feHT+Y5C6=ujs+|m(nEOg^Bef?G*^D=1GM_YJJV(JSpKZUo6vM zK3dveAj>otRFal))WoA!r_cICN|>~yfSH580C2r~OOVGHdP!F($9VSb98QU_Rp7?_ zcJ5x5l|lzw-J|5_$r7!~sjBP^HqA+(^PShUv)rCFZ$E@%+ijspT9Y$BiX=H>o>IkVngVQK*SYV@R zNnr^&^=R~7bilK^+Mx`ZA?2aktGmd+omEFwT>%^-@mZjUQsVs@?r=?;ZwP#Jd)-C7 z8T#_xGPPB5J;dfEV|Yr~9~)iU*&_KB@8igZMl%KoRn`TCZdhljURpauI!veg00{TG zSz1J_sQiNxCM;F6){*)X5XT=XgpN@fj^fZ`Tp zZe{V#F4$0YY*CTdH;@a2QN5j#Ui6VMW1mpWAt#-zF9JhFG&Az!VCfhiNfzAo1RRYH zLW(~I*+GShjl0#NHrnn!JPMf%gPUmc8~|)aq{Nu*_c7{Mb#^8i1HWQF>OfJ*zIwad z=8FyAeHEMdaLuh42?DSGy7=%C-%<+ygqQWirx$eOb_9b{6RbdTU2~cPE#zFOulL7@P@1M#CL~A`wdWD#>K?8T6NrKOU1G;Sx?1=-j4}A^Xw7;=92Bo zO!M!CwO^oncmT}nTA?0&4j;MkKLak zF$13qs|koRV;zrau^&ISBkbvseoW;p@)u$^r$!^Dx8R}-R!VdW*&)*Nvdk#Q^2TXK zB@?X;J$V3-ELZh*#wdm}JR<##UYO- zM;4egFWZ<&Fg(Te#+TL!gbt897@QTZv)D0T14>z5JKOt*N++siex4C(I@;b_1E7j8bc9fFdVqW_t^}?T3U1w@xsXr|Y;Pwmz zX1Z{6t$}KQX}(f#p7W{KR7{gu%MZYlx*_Wj+L0Fwu96wd*ja-lEu-u^YPZm9OXfA@ zA-oDJaRHN_-)J58?-yUN*@z}lKfwhF({F1BV`hH}e_XWasCBlrLz}N>1~Z<(r_-nK zlhITgno9S#3H{OVHo@fgZ1`I&tw5-`D|ONC!o#om!=Cr7Zc5B7)Cd01ofs_n*a9m7 zPF=0=v`>fyUUcmg2&@S@en?#70{jKcb=iKGTa*`nAln0u&f^QUUTF{Kv!s*SqIZyQ z@Fo6Kwxq_LNNc4$EJYWv&}Nn}Ca$?S!nFqpBBgs$U9m-+8RY zG^Zm)sxYau^msm*)w{K*)@J3KnH#YGA>uXXm~GmJ=RY-8`~;Y?vrL~1rTwa;=Eh&W z*m?h~WRXuy~Be=tttZ)w0Y~ZJ46@6#?My#WI_^HR=aP zhe`j-0Oc9%wraeEO$jim|5Gylzd!JQ=$?sEJIVT$ip$GIUHk%5S#*qJkKpv)_AhYF zZWW=Gb%PG^qh!?$MzV(rR}iLU-zNJ?j(*FURmiGB2el{`*gzazTo(JYF?j|q?3epm zGt}IJk-@9Lpg;U}mY&ew3 zs4*=_sFA~j>wG7xbcB!{0i`Y5SXD~0)+PD!?K@oyH-(#u`gAJTi6F@7>TnQVi`Phm zH^!4P_i@-)jqEqemCD!l?kg-Na@>fDf`gvdivysvAbUwJ-P&Nn`gV-3u8 zH_-Jf`)ocwyEYSX<{&_(gt;mNy z4#k8(S8@5OY`1ut8q?kY)rrv_(e690`p6-vZ%F|T%e26r{bloHl`7Eb^N3JTZL!z*C>ZsY~&<7&a|<* zdc%AtQWEgXf(~^(&5)00!=I5juZ4nXB~mLP+q?%v3W>bR7L-3g_Xr ztXhFjn~QXeXh6r&Lg+$l|iU;HNYA<1D)3z`4Aj664sJyXG6)M71PB ziW{@-dnI|gM}N;C3P?HBP&kvE-T>(N2wkVkYmIoT<&`HL{!vUg%`#c6*=c#j_k`8W zDfy>Ni@LD$j48rLNF@AT7b`*|`@^T9NuxsT2&wa|5q(2~G$LaRK{B2?hHirM!*OcE zE>~x&d6gxfL;|O=%gWF@lc zR-XpYmFe{dz^y56bPv1&H7fr0DO*nEch_SJZaT@71yB!5$*E5WcQYxnYw4uXpj;#U zehrSM(bGn-MMNX4A|O!_t%N$%>%Xewww7IsyZI&hyq2!|o+$MSq=h$Fz zcGBSF(uT$+GYS6ib2nraCG!1@dw%!x1vUA0$eU;KD|ahBOfAl1zfVzQ@if7mt{we> z;;oy?$CT9-0wvGZp8*`?wzmb>rbwm)idswxgrFs7by zJvSdF&b>1K1`*V$>3r_czkHwh*>v4=YD^M2Zp=0+SiNS6fkF5>yGVt<=b7{7jgI|H zKZD28&&OGL!awt<5$AvTIG|N}Haa(kl)UqB^?BS0ZY;eh&CvPFxPEt@8WC`yKb`$j zoc(IZlXd>+kUO=XspN`P<*ToQB_e?AyV!phxo-Nt=LHx+_sG8tm1PcfHvP9V2BiHC z?0|*y?+^T+x~C1`D@B)02D?2AHD>UBC0e(dgU#5|jnt)6mao|eo=UjBX>)YV9+=t2 z@CMCL){tGOo1_C^m3K;J(Q$hJ;Q=sH{MMlb;YKZ+57P-b03ri$gn`|yBGo{fl{;&U zg01{*@8lX{ZUF3%HiuJf zWQs&aKht_98iJKUZNJRF=_8Z6c8w>o!K zzAo763mAiYIZ@)ah-wheu5qbFlbGRh1R8K~bm;oWL z1l-R&b2~}@Oz_Y|1aqSz`%Oyd2gc~d1^(|3uU+SrDVVXy(T!<$w$m9!*;EME51dJc7&`&wUBk#eIWEjVwP~blCG>^ zWC=|vtZqZjWsWWEpb^J@rB;aE>h*Mb=%kaplMy|gOc|g`ho(4he%|@atRKQfiw2SOIePFT z?E(FRU)@a!%1wP`pBm9z^bd4X#n%w3%CLbV+GWfq2^}5=XJ%*yraRKZKs>5ZR`imI z9iI?Z#eO^L9FKm2ZbFc5j@@)&v=|OzQ}|Z|_L2^OZFA(8lb^k&J1rzmka=M7q7i;3<<j#@@#A(VlX7#sj+CgzHJqX9?DSdtB+{VpQq5*z1lF>=s40?$+&9O18E?y`l2lJ z#M6+I=eG)E>*(L>3`*sW?f7T0<+bb<#0G2?oIL6QlyTo<-S;)`U>@(>iF~Qw`BmW8 zFc7-LQHiMRIC1t>>c=cj6$u9l?QQEz-!#e{26qGX_yN#j#Q6GR(yp0c+hg|SX;G@! z!oJN!N|~sF@8&VlljSt`8C%rN+$mefKd{cIbPn&j-Z1!K!gMr@WW(9WGyat{)^4e$ zkk>IMGkUj;efEOuD8YmVS~RXMVn7=Y?DOHJ;CrLE57LRpl)m|lO%hJQrzJeq90K@Z0uF;65U=q2?q*CJ%_)4|=;sL88yK4F4ax3YMt z3@)CTIBWu(WEQV?+3xk=BJmOX*+-kiJ(~~`a%MN4Fr9`Gsl0iwJp^=bo!mv4ERQN; zUSYwN5dQQE7NttB8u~1B=7z(>p2qIsLegEQVoXWsa}s_huLt9a8FAWdnLLTdSCL&Z z?{%;~&{(`d%g@8!2Se_k(47duVze4fvd@26Gd`y}5;c)`PU{lx_77hu%!4kQ?)iVj54mKs4s|n`M6dVWQ~Q+))#dN`r!)6|i-{vv{fToQ zlj*QhBJM4ljKWjGgrpY8Mds4(Wmh`wW0hr@oh!zL-uR8jmfag+u2gzwEx;5f9Z?hP zU)UFT<3(@nFX9cSJR>!qT{o8R+i;F(XzP6m6%s716Lj>}c5CHQTtAUB6y6S@WSzS@ zKuqkYUHFu=yU{pRKeFhM!A61)-@Q?)Foc7#db{kwuSIn~!<_R-%zOmiu z#}KBx4a%LAwhNC~)`fjI0C;rH{}eEkxvbh5lJ|(AY!G}$;ubs}ji7K7i;gGyRci-e zvlxeI0h=<9kJTk?G41Qks0fw(tfdW%y89~i2Vqkfd^A%=U)9ZW*AGG1?0QHsy}T!A zRae})^QDDiqq7oV)5s9HcT;X?s>L`i7eIWZf*9&hm;%F)iv0c^El{3Vu3MY0nTm7d z$CI6($9Yu!JXwph)#=md+s>;>dtv-F3;M;BA{R|Nvf(W>K8bMe`6~YD=kuN*!956h z)0mP>s@>T%iX~c5weMmlo7#UO1{PYUBB~nIDw8yHCvUa+AS7sh;3~CqlaSy1kkTV! zm=N^D46@lp6+(Aq9H(TH35Ioz4lz=j8v(v)j1+=17BC`hPG1-5Q_vS0caH4C_b#s3W;}05IurPF*{8lB!fA@fHBx%FM9!^vO2&JIpUtFjU|R?j#XgOAs&nAAMICET6V>O8Wt$b76{SM;g=RSP zOJ@qw4a~pP%CbzHiuh6MvgMKRQ^(^YG-YaCL$*3`K8wTi1-GSTR^pu6C?MaoXtmU| zsLOOtV8mZ4qxJgj*qyx7S06(V6-2U$Qx^@K>$RGV`uQI5QeH12jhr}Yv~zw?=jhE53UP*(dc=J<<$kBk zGmXNZEPQ)7bTb$LHiX~Rf{(&?ZVxHBB%-t34<&ldJZMgUz#`F?(d|?CK#Eeq6iS^E zFLuUY=d0(5ker%i*2l^hFkId2c-mo^*@2x%s>QPPenWqpdY`A?!!>7h>WurDE>BVH z#O>#ZgsG4C<|(ekvE#^5o^QC47OCR=FxieHbmR`ql&eaWjasJVSbSYWV{6n$W(XvMq)eDbt=I6VX!ZaN{gfr8T?-8&j2`>Ncopea|-*Sk0K~ zkZ|fb^7@F+y5*lfkr$WFr1Spg{LsImYlXX2je(uEd2)M4%^)%*_5w1o%}IK!xG|3u zxSLGu!nP;J2VPmGG?$!i7yQ=P(})`$=W&^Wb?>LV?19BBRDb8#;&rt}?eEr)<0_Q^ zjo&WKTjJ}{2=?||K3;Ycv`Bv<*1LCNC$m!(Sjr~mWY2l_u%pg*XX277R6JuF|{ zAI!y{43mzG@#qd$>bSlN8VQR*m839^TcgO!6FXd3fg1z)?`Fef;^t`{D-fLJ(^~`8 zzY~VG1F37VQAA^-%!b$uc(q(VQ>4#K{-pj^SFV1eU_3}?>}yZ(&KS*^u{%dah{@;q zl!PGf7gc3*;|L-+sJSjD{tj`nxTW6;jKkPb2A=#kPbB6QJ~c6Qux3j5$6!i);u^wZQO@IG@Z}g~`Tl%FVMFSA#V+lnqsBI3>)dyCf7x8XWSgW z`F!UwE=xBiyz-5b!%w@vR`++e>K+-@X|dev{Ie=9E&Zzi@cfHi;Wdx;%D(*H`Aw#t zB+&%a;_r*z*>V zN_50AYz%z5m;fnlJWdlBRPuDGw$2cOomfQpK4DUCr`b|Gkwhi+l2S<b>E&PS$)Q zOUF0nh-}fpjMwn#wBX#*BC6J}7Y^UbgYIXY(}|U3SuBu>`@t=FrX1h#Xt4Nd#_e}< zp58g4)z9^VE%TWOOYgjM4LIy>PrO*S6yiEF0kNM(YcqN-s5B7{Y2@aA`#834HLgok zV;Z~p{LqPKYhLdyvl}B<9!Dmu|7jymvLsGLVcg({MyK3{$ba@4REM?DkQH)bkPhch z`?Fy}3QyLuzI)a*$nks(tipG$xu2*qIu;$8hy_tHW?--kw%^=IomM zTZCz~&Pyiybt8uf5hFQ5kXTsM#1G_#D1!?OTe4;$OD>xV20HdMjx^-bM?Du|&<7SX)1dX5HR20QUFY)x7cra=d=kVG><7}B{M9^X@ zMpwjLI2d(Ch5IBsOK-gkeAxHXzH5SK{UvXtm?qyx)O%e&?7fOdo}PE&(JLNc)_l%d zGY)mrd*&t>14!j-mw14D*oXi*K{{o0vkB~*N?PY@m*>3WVh`1rTxYx5J!NJg;n)*> z-mIzS;mi?Jf(x)R$mg5-o9#B%ny~_-U(9GDD+-$nJ3f?D;zj=XW$S+J`Epm8`G>ck zhAJ#$DKdo5k>t$Q_-p>e)gvij6MklpMYRAY#ubK`RRpi`^OsA6EBaVIGyLSM z7UcEqLz$><7PtS(|H1c{!*+`4_itNWPPpRM?>icri+;(}vXtg^YNAuiKry|7rcNky zkBhL&bfKR200m>J~U528cRmC@4R7hh3F+ zs`@^B7UaHDZZGH-^r>rPYz%=7wH;cud;p-jA8(zDBdVk^<%df7HsP=CWdH&dnMu}FuN#Y_xj>gk#-{Q2| zb`@KsefVl$4(P-nG*wSsiA^^#P0c{#TyJf`k^zf&O_2%#f9Y;5t{YBa(p8sgKWy{| z2$}}znZEjbd%SDEn{_RVmq(LzP?GYF`+RJ1tZi^wjXP20oF_t&!5pSC`*b!Z!t53P z)wepI;p-2s^)&$YiK&7fTqWKThpk@8GLN$yzusuE->(|_%^$dyU+7W%@vYS>%){I) zo(5Uw__pVs1*1lXx^t?|eT#53B3JCVmyw|n*i|AvF?8HH(0sC?ydPSrGFbT4Nt&Rw zX9@Z$-@*M?PzGnjEbK8xz`Nc&ceJxg?$F-lP{Y-2Y%i2@9M=BU1q@^UER8M5+KwS z$$EM5TFPEdr+x8+j$H3{?DPj!`|H3hO~<#(;M7r+y+1YRwZqEL71B|CB?AT45)Oi1 zED{4dQLCAnx%V*={z^h%AJ%g3%&I7cr$1)3!iMKwe9F9pcryhOihGGqGD#+g*p#~W{gQ6E%vYWH&)hl; z{T7%7U9P%{nozrtK@^l1%ip(YA&`u^D2mWXf|m-{$gqd7yC+s2_|kOwJ+XVXajq)< z)}@ngJBCW#m^fO0gL$&uT4VoNJP=~_k{Yq7%N2axz2HM8ELF4rmdpE#@^uE)8#Vi} zK*b5W)jwbFg~~mrH=9ip#T(@B&aeR&8bPBM{_>YX5$g2Q3v1T5GY1<}v2yfM6sP7> z^syTn1GfQ1IN-*z0EM$GTVj>0R|kV%JK*U~l!!zxYj)9?h5)`CMt-VeSp zZH+1{W{!xqrtC+zEO+wigBu%uj)tbx4>gZIaGR=}%!1cVtxV1w?<}Z2m?jLEp5-Lj7LEVaLcN8*8zCZaOT$ZJO z)9mYRr%lZuKaZ;KZoKgwp9Q-DklDTvnA?j4^sd;p>Zw3=dEUh)F+Fo*z98Qw+X~pc zD|UKn#ul75wx+Hna7TbCy+GQxebE;0^J17`HINMXNGtqM;30J>5?qEpE3J2n1}&$r zUx+M=HF-G}^uUcJ_>*y4Wl8+45yRffl2h|xY87envW|IolC#+V6^{9xdHBC2Bs0;C zJKmdsEX37Ji3iz4X`70ba!lM@i!M@HnsH;v$F17m_Y;hBMiuLpq}xos3scIQEHa}n z6=nt(e+tUt>|3|WM{ir1HdtqaDHkOHrWY1Ub?ShQ+BaS~6u~1+YD6T$q!rMRWthBN zR~gNHjCx5kV{tlq&HucU;<=o!9)R1jwd9igsmKazr^j<9fcKuOd)&uxoOLq>S#an3f;hvO2Q>$)P=QzSbuz@QKE zNc;gnNS2}LBsL+o4ufwRmt*QEWRSZ=f2>R4^kVQ!eXNNeTDg$OD#o`f52v`9Qlw;P z44Tvd(8ObK06fX!U1q=xrd9Si91egfKTOLn8pu&Eabu`!)rkN8^&E!C5e6sc0RSg( z!bvRV2f(Z>OLaPf+jv@*=uLU$uyp`rB)12GpLkAxHsH?JOThfh)y24}P^3it>nUK9 zVIqkK0H0Y0xTlAMsySIrxjeNqlYan^1(+6s+i61UpUOPq@n+E(@IjkP)9Vzag~&sN z2(t(VwIq)MrsY|EpX1M>U^0w)brr_R_t8Wd8sFs9ni1&{Iz=QEtXfyR@e!COXdo$l z=N21{tQvP+AFM=>?7gG&KIC{G02qZIFNj?OTets(%1P4+KIO;Ti|P?nbFQSPc}IFvL@@jWMWLF#aF)7<}q7rfdC^DGlhyP-3^R zhrl?)#RK4W7ey{_Wp$R7!tFgh7Lo_$X{^gC?zv%S^7c&mW@Q!AUeK{tzzrmv&2BW7 zyJMKj62f{d_5gsElOS|f@Xb$4(mIX5Xy+2x1OnYYcp-Wf+$Y7+*l?=yn4o^l%#I^y6S9)=bXtKDVH%eKWcVXi z6}(>&>CQnmG&M~czc2&S$d8$3|2-NuK~&9QuwyD1BrMjtk%tm+hm`l(QMN8-A-qji zLo)Op%W1iQiK@S%zWazFX?St|b>27A%nt&7nBLxR zvT%5@*Dj_w#sQ4?_fan(17DSi`q=GO$uHMxv#;B?o4K-JR1@nj7C~Br%YW5g8TfWr zKKo>t_5naNSk-%v;_8|7ytX!ZI7h|@o4yUFC?Q&?+#`|~lJVbsc9(yyKbeG(Av6In zl^_ah-kc56KA$x@W>n}=@rUWCRAo%h%@fm)PHeJsAM!z5Vf4c|z$KbK^)UsXL-C%S zPbH1DjBc;KN;yS{T|&m?{waBtVKQB8DkbKseaMV$22?>j1!YQmTyg-c*Y0I9xIpD( zyH8sGygo8z)<@GU(8qT~>50A}*Y(z6DQ*~wlnM>xey9GmH1pTcI+*6;-Y4ahhCay& z)<%8&tzQ6b1XKr4Omm2OV%V-ZC8UiF$D^Tdi|8~x%b^dQ>?*)k!95VeAu|}70Cwia z6u*vyQQn6SJ;#h|-m)-1Kupfr0A*wRv zhK&J-^)=>WJ)Gpw6}ySDC$GRmt&ee(c-ySaOeXtL)Y$uqE68+vM?@N zPwj5hBN!qw3{IXz3WH+wFElcsshQIFMHv_dKiC=G-%G#@QVC|nNIDV+K=<#(p2L8J zkaij2)`VR!_K0cu101{)2fzYI@KhMU5}bAgM(RP3u448;X87-lbtU@11>HaabLf{8 z5LAjRh$moQ{;?Ey9YFx$5&VtT2SDZl@R&eh`U?pEr`mxKQyQFQX8kW@sO==H(1h?! zIw!l8i>E9qM-=bnEbL&x+M~eH4A(mVzyyzCk!PzH}u6!KBqUPsSucix~U5vI#@j*zard8lds_{0fOeaFUnax{%^eMg4E zH!~%SG9d>%LWv4TxKzdNrBQ0idT+-{RyX7D;>3B$d8q_8)Ur3Zj={0(F_x1#!v#bB z!>BT5a@P8N} z!5)-6nLy)@Cc-`|!9Hai1>G~F{N>T@ZzIF@amZiwdk$-*3tUB+*2m2tLxc(fO+euj zTzurt$9|=Wv8NF1JGHUTjg@wip5MlY=AblzqMhSq;GntEY)C_`iIMy7FBm+cSrzK# zcFla2aelKB`Ml)I(T&(P!|~54UgxmAiNl+-Vv`psS3XSMP<2fabn?}eXfW&CU7T`1 z_RF2?waFDg{|DcLK*2czsFp|q4~?U5F4dwTT&ez9XY4xTlt+@A4z!^f(I9puT78cv z2PHTJpDvmrnTg+N!cR(j3V(9sj`a8Rkdj#y?mmVp6EI-Y6IOUT?%9PhgA52yksPqm zgLoy_PBQkJ52O4YsI4>q&{iy+R_eO*j+96{qP25|5)F&gk#)y#)6UKs;2mDL`>>7o zu1Mv(Y~XH#{OLu|DkxhPzoB>GPTcX53-GK!z3G;kZ+TO+~6IY@wFkp zrvj+$O#)5LhQ<&3=UV)SIVz@{WpHj&g+Uzx8HCG(*8#8-lKAPNCc8BrM;4C$TsCey z-WtW#q4NE3Qg*_R>u*3xHlE3iR(8h-_+7;+Doeh;dxKVzwv5~W1ALNX-&Pne`V1v! z#`}rCEe^TP=HcruENte*XF^uJ{7v)?zt$$AXs|q}>KDjUr3!V94|!H{b4pkHUon64 z!emJOi<&5>va*!z0F%@UL^_6a9Y&G+jE3M|v^0u>N6q5esMAq$ZUZ6 z2YA?rc7&8_l`^<&R%ItJ9luR10yQ$1bm)vG?a$vf;-@d+BN*T^&>O60!H|(VnYgk6 z_FR^m?Kw+NuQX;du|<51csq7gTk}q<)6$d}VfuNnMuCs3zdtESEB(CvG0PSEN5e~3 zZ$Eo=?l|b|T*ZOIKN83WpFj1R^vG|)NDhSPCCuDkZxy~ouYxRrH4?T#C%rfT0CgDS zWGX`h+%3rk|4IFgX&xY^0U>G#(hX=dk>T_kJo8K`$}%nM|C~Ou%Ku=sK!ymyD=+-# ze*hy85>10c|AH>e`cD{%29G9e@q^tXB!gD+e?UzTj{mC)m_e#BEhNTYXgtJVSQ2J- zL0|<}*9j0-*XnKl{EPL*52|x`dSZ3>zxv#tkwlbvu=q+uoKkfhnT1j`hju(ECFHtK zaK0_ii)se|=iJ1zeL@I6OYazGo5 zbPe+e#_ylV5mI0~4@SMPZm)|BEg#zc(hQ>rM1anxh7(|6qdlU_JF}`BC)}`!y zQ0CnMr|aW)-a4FN!rA73diL2h7N8#`1w37$x#t@AyPh!=i#T3T5=;99R&yNPpO)G- z_4py&D|ya2CP-%3=2!K30l*p)qiyIp6Mw-d{k70JB5RVd+mTpGB7>Wos*gYkP!upe z&XNW)FI$ciaeyB}1T+@Kj%*a;5<^%2g3%bsdwh-6FbW#p()CXj*@O>kF*rf;Xi87@ z(oskE*j#|cL*mpv55;-h>$sggB5+oDs&>-rlio&Cvgnlu2vQFQw4wVPf6*XuaIrth zf(C&wM5KYNE-M*?p)5?ZPou<ecnKeZefABS}XQbyM!zqa2p2GCKc ztKfvRQ6NpV{Z$W^tm|@|pj|hnXmHrf0%+^O1@oX0)cSB&bO+da-pW^448h%*)QAg} z9>MXr-q;lV`tZ=Cy<(sfL~<>&&hhsDG#$AKLM$wxQ1E#Tjr z=>KUxL1L9i+Wd=HZPbf0L{u1@P>?M_K{mva|JyCZv|RZI*ZOsW1X5_gA4ICKiwl2y zEb;Hck-RBx;9(dzomJ=GWDe~9e^-+KGAR8dFuj}!0@9Ohx78OGxCu!B9)vjmKegWA zFq67sKm}E=`3i#z*-7G`YA&1n@XKj%>r|RTI_D58s(cfFj&=1s>ui|L6vdnRha2p0 z{Y7y)Zi`1$c_pe;g@{-kmy$L5NY7`;*azx0pQb=9$!r^1&0b|) zqB=b{Q_KJl6PPylp@>i3%@|ThkYDcO?=Pjo`SBFo~VyC%uxR_ zv8oF*Fuz(X{@{W|H(RKwWt?H9`v>PM=1In=R;n(h*_b9wGO$P*-L=5k9i9%SE8Jml zsgq-uXJnd{EcORp-%SuYo|uh|hEJ!!NG2-W=n;t{1j;tKaHG97jrZfO^{7ka!=Lwx zi3!#ThF+ZQ>nzgOi*B)>pAWkT9#s1cIUs@jZEW@o{`NneI3P! z=jYQdZ*7cIzv$g3t+sdNAgp}PTdn`6r2&L={jH*4o2E>Pe83}y>N4NRsE2ilA;E+b9F&c^j@yVg6n2;PZ)VY^= zF1{}Iue&_L`)VAuQX6K(#`WGm3p&7a!~s84ELn|ze%Ig_tJSwXaHS#0lbb}DW^s+B z4gDlNuDKTo`+w}J{@2OU|Bb&8V%KB!so*Uv2XgAnrXy@d^h0N`X~bIk{VeFs-gSI+ zX^~MX3h5Y>J;}d(^GBrgFY7S%Bt%-t6&1m>a@w}XF#=yfPZ5 ze5rfjOP$rZ3nDeb;DPQbbh=6UdY>Cpx%B1@m3D7fGikkPH}%C;$qk~66xAlUs9J<# z32wqC2QPyV(A;pzbIw_bPYiZP7pBhm3gcD*5%L3g%&z17`pG0>vkvQkkE-IHcvvk;jS2t369Z4p>;dz+37K#o)oedVlZ>#)rzyWv_xRqkDgdhT0%W9Z>b93A$7qZ!}pD@ zpzfA|8&`~Gc3WY?o2F#^XV~Gu7slj=WunI3d3Jw3DO0vpCVdGGgF+fm4MaFaW<3(6 zL_~I;o9TCm;)ZhK*+^2M*~| zB8YqHq9H*VQ$EsYlJW*#@RS@D$jgj~>BuscCtgXDWMEAN#gXEH}}X zmk>`MHrE^H-{jW7SH;IJ+-7UU&0ct)M2WD%Culg;k+Q%5-Zs`(rBgNVRhvo9H3h`Q z3k=szA7StuFzWowrSrzrqVn2bJ}Kb5o2YQ+wzMnF*GTFms!OI_?3qh2?T8q{g;an; zBHYL~9H@7-zLpG)O`%?YdiC~^c4~1%^WMdLT<_f;#Q=@0dDGKJ$HmmLZV~BIcMyNj zlm~2xli98xTD-ca9I&Y`snI|NviZl^;!kOoc{lTmCa|VwM>+zbCyPuo`63>Js5O`u z0Xk~UhZskfbp%qDIzCItYWBQ&k{0;ob{jmr{-HNTa@;2nS8@&6aa+7SdEr>jUcbau zVlTl2rF;)9ps?+6A<}Y~1pc{TNxq;Qn zikDg;H}cWDHTe>jdYW`Vj?308{kkWX zgwMv8AFr018!OwkaRRnI=$4NiF9ZtONQ}L#YAl@)-3-a>%sAezl#^xzNwK(2G&OJy z>A+6lCsAPF2h#NIE2({2Bvsznbe;d{_N) zFQ!u1%tXiW4VVL@!5{~K)X+4P{&?G)F6fP5r74o{>L^n}XCB@WuXR||NOARsoz~4_ zNZ0zV7ze99&ad;vbnnzFek-p>OE+l$;4+lOVQzYEjL$K6G0kc^Vw9Y=oxux(*|R~O zUT>WcWt}3`F6X+wS2q=RsEni=(i1?C!@)W0g=fY(FB6UNWRpj}VyPDFul6cFf9B8P z+7H?as;!_VmXnPlAG~2V7IQ>gK8;#ZDhW0`034%NOle{Y?W@nJ=MR9P z#@quS$8&kzbR?Q#=#_o|+&Hpl)0|1VkELa3u7D_eLtTX~>Wv6ue1~rs`AzLlXMQ96 z0naeK*7nQ31{-6JX%z*Xh8tZQrD>|KmLap(ZAqRBbYJ+lFt{>d`ZWsE?2B8c3iw0m z;@*g449OA0X-hLW03yN|C*15?Tff^oW)}^Q{UB?0iHM%_#h+){zz!fN(t+(XVYnj* zsRp1@^$c$BJpvK`L-!mQZ4&b*D(ReZNm@tr5zQJ5HSTYfqVCqXnb_c73{^$vCG|w! z_!KE0OMW?>w)Q3oIe%a07^s(bD3H&V4vXX^$CHfS#`Jsti?TNlhcaychqXwXBq8f4 zq7p*LI&DZoC_7V0Lbhz9#!OLmCWMeC*|SXc-PqRpHJ<`JA8gyiSN?JCF4kmMP zQ(@(5*=ENnYK87w*|i7JT}l>8&3-ZulApyEkMNk09Q%U`Il=?PqfbE zx@o^yJPLe|0=m{&+{*IF9aw z#|<7%<$Lz?WX$db2@3u@oYWOZ1QR3)HBI;+O+0WkOla+I2JoXupAAuW!SHF!evDAH z-s7r!6if&`f_>(mb2Uw&if^BKb(wnTV#W&o}hT)+kYY|#0aV%%UjQ^k8?B>!$COp zHWAT)7+Jqs7PAu1IT98IP45PDxTQr6_0>9s$vZsyfvfcXoT#%sgjk2`P#WJY%$wsB zFWN*X_)4$*N!_DkBRvg=~}sx@|b8U9V@2 zu4Q@Tg^jtZy-Z5@3^qQ4^>tYjE3>UE(IIb?*zMf=Enn73Cg|!C_9U_h^SSr&OFQP8 z4J&d}{_?}8ORu$}4c2}!oK#4tc$pmi_bNv{V)XV@|FR%N<0&wJ+SQ}aQ+aR>3Om7K z{_C!i-J#Fx5H?5WL$|S~G4(te9Dfow9DYIAW>c=4Y@ZsC+cVVGb_-$l0a%^Q`F`o2 zlb&&3i%V&>#!=yAIi|fJpi&dpPz_7A>FFxE^Cr$X{L%*Q<4~tP-`ry@$8Y!x4aA5| zjU?7O<%8L@d-|t1neoXz@pM11fU*?!pm&3`8-vxlzV5R;vTD7QI(wL#>1Py(DE-wP zR0v^tLrtC2y6O@FvnP8_eu}I+b+`*13lnlc^HNHhQ@Q0WQtq$&%{{roF>eDJ2HdiI z&g{*a)Kyd5kyJ)v*UmQ{n4QnK)=IW{#v57`boaiO!15$;-a8vnp&11Yt@>fQOo0>uP?Y?Tf(Vz*lh?J#dga zf&%gjft98Woe|!uYkZ6XoskzVXD{b;pP_&GJXD7$#y8X)o014m>GM=B;aiPQxSh}U zky<8jeU4xQcfgH>=`nD0PCxd6gv3Q%`OB7pr=u$#YE*Rn1Mv^uVFZ^LK$l?j(-|!^ zlagrHV}Ew?@*E50R)ZYxh*^3t*H;fLAky6QMXxq(47RkF`z6(YJuAAtcG}JNgn3XT z$G)4gc@o}(RDkfpH{kcdn^l0&4z^T)9aHG?7f&N0?Z&qOc4h(25*GAWMkLU=wJ=5s znjOM4C6;XC?Zk^WP`xU_+pTABYIo?N=YW$j!GFFi5JL*TGD6C0G;d@ZiMr%o(Ao&R5 z0J9Hvw74e#eWkFZcU9)84(I3UZl(PK2M+E-gkg1RFqZLnkZdA+~WO1pj?!D z_chJkJP#j=(ina$7FWnSF}{YE36MW-b8fx)p~pauMx6E#64#jEeSr16f1_4Xm|nZ< zv%a!P%pDlTItWf#!N2MHf+^j!#nIee?SUp2T`Gh+Js|@+Ee{2-6xPLZnhc#wiKM&d zWTC|Tpza4!83%`{+M^n*f5!i^baHd=aYFmH%Ax^Xjo@9RRX_`$%Uv*qJC;qXYO;91 z1PL>r7ZF?aIUBmn!(TnXH$H>_F#Dt$v1bvxX9-g9I^Dq5TJaOEVo0GdkW7w5Y)dx( zWl7Jz4hz9i%nXj)qVh72B~v@KtE0)wJ2rAvH*H-Lu3ty?^i`~#VAg-(7--n71Vv(k z82)tw*D4#3e_|Dln}k8vbjhODmm}Ed;$>t0g0hSrSe|#B#ryP<#9hUOxwZz8dbDBW z4PoZi`tF=!$)(WKNfuHy<}~~Fbk%tBkG{OfbiQ=On$CsdL@P_3 zX^H4jzVkQxS{{~WtM8|o5^eA=e4`f)E0*$- z82igoD9zd~5$ka*+;a;LWHtcymt|&3Lme|*1?FJk-hi4+WYZH{<0am{K|&8b5_3jQ zut+K|(A-&p^}NQ@s!RdIn#MjNJqLOIvRsW;75d7e-j)R?B_JsG+UQ3P z(9zKD`GUdf3_?L+t!QW8w|aL`d#J$w$}9X`a2JMhubj?x90#k_Xm=d#i5}YKG5vYa z;+~~$hyc7foHO8qX*wF@QtIn~Z^ctWdjz%6NQC;Z&Nh?)U@<%;RF_Dg^F*A}dC%<1 z9iDk9kjI{u-+HEWxr_t4#>PDMmn9E9Tq{=%Nl|PT*I|bmm5XbuifsudAB5iX!sA#q>4p2)h0iqHb;f z4Kl~+t1{EHwJ&`Vt$X{udT7HUlvkm98w~^jDK*yb=8I)iJ-@5>iw(yb8`|_`MeVc6 zphn5EiEeFU+Blo66g^SW>+6gAML#yBW*4}(?QW3JIh9!w?=wI9YuAYcqG6u~rXtlZ z_Z1NIkgxp$j8~eM9ppA=WUZ?`ED0xp4ub9X%yxC&R5zYx-D<90I_O*VCifj^lU5{j zxY;iS-rNbmw^tfzRW8+v(YLWKgT%|xQ@(8YL)Eyc%usPkQ=fwm&rZMo&~eSC0wvZ@ zQQfL@wc>)>$%9!-`qinOu3qY@r9_)n;$ymEo2`;c`SZ=b6(%8S-F1Zv2)Y~OL%}x0 zl~tlsrpGEIu6OsSX`X{mz$FkAJZAwAEEHrh$H%wDZX-wVSrqpAXiA?8Z1tmlX(?0H+ukfH3?W z#+JwmVN5CAdEaf?v#k${hpuZrsg`XUO{IM!WPkuvEl=j3QdgCim!-UK(NTskNlWgM z!DCL2Q31;ppJ#=?`TF5=h~=^>+YyC2n7^!u;tBW!S%?a_7wc$gy!T z@)_8}{j3$WgI=8QHD-U8k#aEgY3UdyfnLUJ#TDX$K+@G99LKdn*Zn@ZK!wnw&RR## zx+jRy?qk_Myu8vj zn#L8~Zse<@nZf%AH;Qp@c7#v<-qdq^POj|7!(SCtPQ?ed+}Oc?oPM#v^{%!1qhonS z{H6X~uL7FV`|7h%wn+4u>Q)ZEZlh?uwbbEVrEOq<{S8qP5Etz%6xNcckwTWBiev2s zdz*dSk6Fe$80ufY?jESVH?%NM=l7G>101K}@V796T1h-S+A%O}!wne3{6Sw2e90WR=k691PajdQ4|Zn#=sl+DO2G4kd7 z#FE|9Wi(>CMf+{X#$C@VCk?~=ou%o0j8jSk(pdjr7M^cI%nIy`o?X2X9O8PtgZfCGLzUMCaYDXrPlfgGxFy!{s1F` zd0>IS`hu?RmDb}c_NuU>IU`EP8A#2v z7^zEEFiF^Ai!m(OZT8yd+lws^9hH7=`{glT;mlhPu%1f9h#O1 z1Rmcz97VHjGnqBD-z&#i>MBFy+OTBu-Dz?AkNdh0reMi~wLj=r=paB2NFk8EDiKP{ zRyyq|tqn@iHjq!f?J{Sp%WmY}!nSPNme%o-`ALvJ@>hZ^jUma5@kPDq7HR}pEIO~c z_n6r?k+_c7iE>m8!>Q$8>_}jj(U52Ustjt1aF4?jAZnKQd^hrEJVZ3esySP?rg~QR zY$;Ko#@$FC|y)yzC#uxPc$FAR+kacoCO=)zrXs72mT|FhD zb2j1GX}@nt#oR03Cg{W&R3im=O)v`aL4S#qc1z+=n3U(3+0U@^=}m^akG$9`PGF9v zx`TaW0?Fq&jXLK?WkDP5l@i@?PFaWF9TE}dDzB$IE#bo|nb}mCse64T1I#4%4atS= zR?c#m7F+1;w^#ZiC3p?^}q3&Y$(?zHr_kl&dNLL?{61LX0q>8v!KZ| z5YNQd@9}P%Mdg7M)358-m(Fc5OKkj}w2;k{SP5YJ?*#h|O`rvTxF`-LZPN}W~_^PrEL zcE8JubBRk2rLslhhL3RVwD*W&Z3k=LFw#8xhyq^EC!IQz+}-r;;8%nbn$3P)P3j3A z?Z(Ya_8fop^b&U(2HN3MlPFWzL8AJ34UXx1T`KePCT0Y+=mxwT*OGQi5AeU+F1`J# zhK81ip<96wJE9aJbDC0FgiMJmr^8OKYLl~zL`3!A(JQ8oo9$}|GfaK_ub;$HnWlEp zNb<7n?UH|BWmio0LL$`9JnBcgr9;-8V4I2z?X$+%SBA`VKdp?dy&kdlLDh6q0OYDc z5~2Ru6eE!ESO{i1kjq1C`Jxu$C8e1xdzG^?+f0BlcpSsOXT!HQ{-bt`S4l#A)FAB@ z42z6lBx%d-1zO&{@*p;C$XtDhQB{`L9kaav9y*=*6QpWuY@1G5-$*NKVt=Led(AUh z3ezt$_aXYJkI2_2H`>I6C8-kIfO!${jj4eiiI2D7XvCDD)F~64XUNuSQCW8*T1Kp7 zZyqMUQAwmC#x|zn=~n?}rbOm_zvXxL4k@XH|Fdk{8dgfw-tPMA6T}EVb_$+(q&I`E zQd(B_qd>8+I7zHxEJ0k*e(r!UAz6(aa%BWnlZ*(-p@)$OC#b#*rI7I77d1x+C7v;b z2=y_wfNkK%`=6)ZVU($9bA;B4IGVn4iSU!b`CKk^sZ2JTN4i|^vC-57>g^7=@yQ~B zqPrF{38NAl7`8^$6b2|xo1M7q+6-$?gT`NrnrdR`np7ux<@Y?>r3bispbWkN5y}HUMVE1Y?Qr#FZkE8T z@}i`1_-+{U7!QUlq=4BY0p1usuJ&X{FQz_+$i-(K8{a5=P9(q|-Y1UF#*hl^;YArh zmso)<2k4xK{L<$$jCOS%% zL@{*h#s#9LAq;y+(_^wqpkW^iSPulFMH0%L3g zYg4k9L{kCo&NqGxBiIMF=N?VCJ!R#Eva#kL#)Ym?;QUm1iAKAM@gKux7h2<_JMBDQ zg8=E*{I*X&W+`-tH~=`iCwrKBL_N?PP!fSL?StXo|36(Q|3ALMLYSxP@HZ$Q$DVT6 zK_R^99q5QlAGM4&-*L2$`#uF^xC@qGPO(9q?LSS&pLUTER_z5TA~!UL<-y?>bqb6fy_P!r~zPeV6PRGfSr-}3VVVgK%3 z^x=1<3sg;Ei@L-#JQHslIbWO17`+#;?6gi`9v-9mG~$ld3Od0@c6i85#$}_fgZg6Y zF`|xNu8HJd??RK%t#B^%F`(Wp36DcGjzB$nman^b`qWi+?$pF;^dFCEvDFRMv2tm- zbLqsyu-ecRoX#D@JX}xJWgg+CKErT67vC_U2>lKpv?%!|yDlnmPWg>kxb4Bu9C6jC zjf>`yr_9V%ZHPhIGkyka?yPF@@_{OO3WkyyUl!CyH#7pF_f!kwv`I+Tz222_`|~~< zG2N2wm!;@Sr0^s@eNfys3oi;4PpIrVyR z)H&BD%A#8|(M^kVM;}c%J5969F+%T0M(^wg!L|G}n5wL5Tjj0F9)Cv0z zQz+5mP|ZuzM4hGtg;gtKJkKT49`y0(GQ{-{P5(Ud9HM>odND^xg9qR!_lU!p*ZI|CFOr*{zvt3IuY?-)=3z$afPhTn#y)^KU zTsRYnlZ15whpb-nYEn*fH0H!&WW^t8V|YgmW*ZG8bL0<>#Z&L50BrxF(Ilcm%FQKp zoEICPS%Pjv_rbUUEd~H&h^D1AHi$Om>VH+p!{9^fWh3YmDV1|VP_v}9GFtLuAE+yY zL1K}GNqN<*q$6x)Z|y;?h1VC!_v_1ga61cLtWzyc4i{>5d(+E!iK0!%b|3&`S?}se z6iC@ngXOez3HND^V_sJ**t`aq9;|q<9i15H(5J=bp`%!;Kiq1>zCuJ^gOS?PdYn!S~G=xE%Ty zQ<_nLA!ST*Lhs3v@5={E@B$7mJ4B5N8Z!12IlqccX_4Q4k^Ga&eL7VrYPZIsC|k)W zwaR5>=LO>x@Vr1cHos`u>5>ToC8+C>*%+e+8bbIy#tg~Epx z*#0Yt{28_nb#An$!B6mrZAe$~z0&I~D$nI^fGqlpte% z?hr@9nu!!FGSIbXT2JW#%DMqY zr+8>t>b9r+h-r7m3QXeJH;!|lOy4bzB7p#rN->8Y^B!7=Y5F3_eirUq{ig^a(O3|) z{WFty8#Y&h8R!{6nWd|sWc2hE(S1s#V+K_CGdQRqwNMw>E@vcX#QJ|5Tf7~OS;(vL zE1_{AxBHt3hhB`TX3cnpU#MRQKT011^HiRTdPLx=J+vr%nnDaNnJ+3BIGC5=&~NQ4 z)_zFI*U@{Pjc*g5On3|+S<~hi_o$y%G%8&z9C-+S%dpx0tUAV(S-^N1~bLJ3;;pHrCz`KNJFc3LY&+30Tomokte!(mQ6R51lR{XFgzQj4M4osw?ge8l7O8SB-rPf64-15{Hw_eXh5 zeb=PO(eEojA4(^^w|#^8HMM4?oLrj;V4F^v_AjNk^6di+nCM%7S?+2NzG7QhnA%{U z7_ZNBi4#2%z9oHvWue7Av6C2-|&MIGeK`irBZyO6;AU0>i=QH2gxpwbeVgQm1U~CL)2!hua%x1(% zH7}PqZ}hn#QB1*Y4b$JQd=D`^ocKbP2lHslob(|U z_pB5-Q%tp@$uxH>w&vx%aG8oC6 z%CDkn)6E8|owIj`y0{yy4b*U|dXj>V_9%_(_&)q_;pAGwm($dUyolTnPW|TWecke> z!)o*g1X1H$gVp41E=G(i6NWU<>Cdx!zV_^~)MAdadAB-TrlWQSvZKgp5AyiN9Ya2N za+7P{*s$rem0eTul5%gQdmmB4uX3_=i+IQ_LNHz`b7k{;-^Uu8(p@Qy4H7oeM!Ysj zv$k@e)Z#{Fb46qRB#w-@1PT)G>%nfCa6%ZP=zF-&Rw4)eWDyTB^%ynhuXMT6Uv#do zKMS1_i=U87;G_xQ$GSHBfj<_d>XKa>yVzRzgF;iBwYr5Y^?9`h zo6fbR+lrKK1f3E5a!7I+d5cX~Ag-0uL`ut2s@MWChkiY+6g=?fS#RdYyWO0{NjkKy z$&Q6lViH_n1w;DAe<5~~-1sUjyfLEe4m|z!&>I4&<`trm5ICqI*iUE6YIJ>(+T~Rl z&X*MaC7FuI8=6!Fi|w$m^YVs7-33(JryOTUFZ)W*Z_D2ZN+IZj0^huz3K;de*?(Eq z)n6mKxjJQaw5p|JDhJkfa7O@PSvR=2#%zJnhKYh2sW9d--Za#8o!Dy8+?(PtKD<$z z-Pae)|CRLk7yMDV%sDoW)HN?J(YpM=M(a$>S}3Cc6#IZ3co2x>H&z&v-`e0WOVpqL z^&J#h10KAf>JQi-zr$ZU>Dbq zdaN)&tV^=AwDgqIy-GZ)a60n*f%6FwwJZlJ@-Mmx>&b+ID4;H#`Ro)G5pur94v;x+ z(Xn+sV;+zY=%MytT?fb4DR@MN=mGrXFPi}1A0OKVA-Va4L z!gLxI`8cw*iN7Qa8Dt(s75MZ}*i3Z(LxWNahw_TeYf9(#9+*DEKN>PW2C8MIWDX85 zSy(N&J9s&f!rmoLJ`l;dxDGwKu8apyM4HAyQu(PgYY4{V#x|T;oq}A?rR`&zY93ww^K zAD)ygg+jmrY4p)=*y9S8YQ=te9hM*JOuYCM(fj^CX)H+vT?2MzGaB}V%-QO$-ulVU zT|Sfsj-k;skYTbnLyno>JEvs-vPA140NPkDp>_x@!|eRR{%h*#!}l_F@yKq=9#waU z3jv!x5Zd`|ZbjG*Q-RAsUcA<-mNj2i2wVut1=w}R{xQ^T3S%{izoAslQaR!?ssi5* z2)Tzoc)A9U3St_!ef@Fw#hTHxsGE#LuxJhz==i5C>J+cBG7mv}jZ|@h7=~1dI3Wr- zP(A8O-CMGr_RV{XLfFrepxmm<;bCh_viOSFC?Wb4E(e)o$$|OeyFacTQ>I(aqs%p!aqzy5DOVuyi{96l?NT%{MY9)AiOy5wJ}(-d#E$69M2PL zt9)I*|5-2Q_xc=fbmt4T7E_}+!YssW2+WAfs<(@!ervg|FV2w1>_w8 z{5WBJ};nOHzmEJcwzDV3fQ&@G+0>w2s8d5!Uxr{qr}$PB}D&OltlD2ZIZsKO3sP zF@-txTyf|N_q$ut=^0&)(Pd*NSB%fS(O0hf%F%&`E*3e1`FM+#ce7+lI(4%#Jn%-8 zTAb5*m;0ILqCKk&YJEP(Hp5?)09|XH{%Q2RQiq(>Jle_H;|3sMWZcDUMPYh`%`? z!;Sj0DkY8_Iixiajya+3wCD-}F=XmUQ6G?f{WZ}cp2kf>GR z9eJz5usXB7*%L;w1K6r)!{dT$uJ*4> z6j#>rBpCJ#R{>JcqoW?^}q$j}CJXAO3NY$`=D z8EBvl^2TUs$&3K)n85aab#amOCTx```h?bD5&YeL25|I9!L=M95_6UbM-*e5D~iXK zx-6S21M#W1UYaiNc@^F1E>c{MXf`+_;{T1HfFY6KAW3Y=_)+cTLop@g%`OXb29lTK zcS_T%yKMBv?p{2jDyQmy*rjA!DlNaKNt94Jo+Vv2S3 z+>l{y=}VZ2+rN+P%5mJk!9G|G_!5~wApkJ+{p+bLy6^Pi<@^$-Fpu+}UuJBTcFe$b zDunhzDVP!CZRMn?*5J!)YI+%0E7JD%pJ&ns_chhm;43h2C^9+)J60e@!V3w zOz$N4=B9bvqfLo%+bFMD@*k?ogfI;u`AhMfVNTD?dUYRV*~s~o<3*u(>d|#Xh!2-z zpCZonI6(uwTK5XqP;1J_hdVm0h1Fg{upxzYmvU5tPRd#4$XmA|N53EPRTkPv+;CH7 zePLRZT39k>d47~>zbL5FI^u2kHrvLDsNbQa)4t~ty-0&uqKv@Ok|B7VhN!c=4rMY0 z?}t6IJ)C)me2sZBSHATg%~S(uGB=G_%oL%(2FYs{ZTF!(%Jm7~3`tn^S?wJ7I4_Wl zG7yM5QJU!HjC4^!>rp6`||r zkAAg1BZ9j-{LfmJqfhl;9bU1V+AgOwT}fT(ed))vU;ricehNq<9=>r8#R+z^P%F^Z z>EP+s*8yoo}A@3JnxOTLmW}G0C;{WXjhXDpOr3-?bCHGHql-Oy7^$O|Kj|1Hg$cp*pNB*WbGW!Vb)(FOeDS^F)BGN zG>dD%9-izvCuF2*u$j$$w`G3r569FbL6t!I5MPOorRk!qYJQ7F*cSDRM;TUjphr^= z5EE%0%{W0%0u0IRNvpY-aS|(iI_993U->4!t-K>9=X3VU32lI0T*Ljg;rQhxca$sC zxy5*MpolCp>eDiskxt>579+UCbpB4gv&!YudF51#Htat962lUh1pU7(v&S&pgk_~1 zzyUhwwHrgTL!Ear7^!OI-Sd=fw9OoCSzmoz9w2uDeoAt4jLEJZsRI}y2=2HGljfEd zgZs}(&v|Sgrm(CUq@zO`wj3Tbc0V8_0rcMzhlT3>v)^}R-^>|kSe<+sRRQc4Nk5yC zG32q2RzMs!UFw_AGG#nrdeM7;pvqyK5h1Wb%)7IN@l!+C_$P1wvWOfbxbE2_p5Z}b zldys zCOnWJ1LXb7-fGP^X5-#1%a%fib;tO{cW2L^DGcmU*aMHkT3T9J2!7j)F3P@A(wsc= z3iICNxkPxYn6y~Xr4F|nYz6puIO!eY&{bjxI2XcN&5>PrM8QwTJL*@^nJ$z}u-PI~ ztx#bxCtYFp4#Tp3{K1vojcj9Adzo&D9@EKVeh9>djC9Jo+9PLXbLJ4x#b-$xAkk_u z`M^#y(nDDL{#_3Qz876@BUAysSrHctWSg9%>0cL~9N3))ri6tqfe1v4L#W;rS(|3x z*_A)s_a1T7@$Y`&omRP4-5qgQy??KaOkgxfrQ zM?iMcTBBh^IBT&JQ4A}MUnzt?LO^Hj15sWAI>PBn{#Ttv??uUf%AfE5aGQ9&a|O|b zTRuX`G=+MpmQ9$`3c8q;1Ger`WM0^k>v>xdcbpdc?$Dxdq~f)EYB`-5lQq1P7&*$S zuBpP$i;o=qGV#$9glLU-j4$X@jTF^-m4~raN~5-#pfa+}5t1uc`*&owCLvnW!Q8*;#u!2EsD?VEWC;0wwL%72RLNwH zYT2!KVsdQCxpx)i*|x%O28zGxq!MmpoF7w%QHl@GJi0h~dPpiiHrkRPrJyP^3UIMw zU+IUar!CM4-)tP?O*wfS9w!)gsCl*F6(AtltgF2!_tag9x>v;>S2YZ!d^vAHPpV^> zM^tHiL`=OghLmO@9OUOXB+MVWjBv7dZMz&5Yi9rT$(dIS$vtjHCfp7`th6oc%%Mx| zsY9@Lx@TFi`Rggw`S6#0%3kO3E(>WW5QQrqSwcL1M^gKKG9X*8Lb?nyhmn0YDP?ce zqHlIFtG{a2s=#H;WngQZ`N9)6meWXa8Zxzr4=j<)vNsuy8vpk3kvsig#^nO=ka7`|u#9Q4n)c3J z!qfM|X3%2v7vM{Bkgn6UDeS*Bjt^X371hh{^5WazPt_s&2;O{KF=eYOTMdCtQ%*FA787JP`^1{ z>kCwxxrQo|y!{0{MFgnL(16~`bxq5h{9_{DU62xa#>4mG2!FJ9mKf>jbWK*X=F8Tn zXpB+XqTcVM|6sNBP6mEi;GZY9jk0+!##un^&bY-DesbAqZGvsPxPT&H4tbdKmH&9~ z$qHK~qJDjkwF}V6HIa%Nt$>ZG)WWXOqL4UMZI^qOGxET}$tLv8nvLyb%7*y@^GvlR zE7mAl^mKvff!VKy;cxr1@jszXj$7QHj2catCiMOxL_Myz_LQ+(+xMZMrtjX)qrEGO ze)~LVKvWvc^Y2w&{uFYnt&j_=aPrjfCV8;hzLmhYQY+Dztt0mO=@akxc^@m&K#8!i z`b6(^H?_9G!6VNurTKpEtW}6rr*n{;a>(W##G41}4OE+O=T`7P`mY5|eekDoOm}VQ_pE zBbe@P1Hg-ee_0si8X}l_0m2JQKZ_2hz}{yGPX=;dqLQ_Kf97d%uRg1)(|u$CVTn`% zdAJ0+>Tj8=OUSh(123-j4}5Y4wmr5sel#6s%Q4z@q>Do2HPT>8*~AN^;L4Q8TC<R9%lj}^=xk`8x4NKFZb3?#pveq-guDS-p zIM#B~nXF$9J71t|yqHnz3hDf1xs-inZfaaC)fTNe+)K=Ug)SBkP zd)5AB`;;r^NzBT$<2R0u9!SI>f-uEJ>4_9AqForw$ETPb52@(zwLfbxBxpK95V9YX zTK@KBZ<^;>MA%0o#Zu(j0^%U1o_qfvCNC9TB6t>GJO=4izY8d-F1$WAM8)S59Eiax zLv)d7y_p35Kj8bV&jO`59OV9&C6iB*va!85IAjDJc~)elbAD*M@`?%D z>aHts2~m#upZ9LL2xVS)w0pj{h~mmy;7L`xzGP&gf0B*`P_aMXUzYZ&1;SRd)7m1$ z#yo8QmqmOn1Jtf@;|V#FaG8H+@c#e#g9}v4r(Z?*x?2+irA&CN8@b~%9f&pgsrUMS z_`gv}=2ve<<`eEVXj^p$oKR$P4_Ii@3a<0JrCiH#OX<>d-QoRD-84&ZT8YJbeTR_$ zTQ~jw&i=gHV-~64@JKIk?x1T+X6Qq?suoTy&Hbwp_#L-1cO4Io;P; zMw%ZU`AcrRW*%h&+ND0)?-uh^&!Or){hCYy&KZ!utbUcx$Q6IQQVpb6sL&(li)_$#alNgEo=!3lTb~=@ z^po{_Pu0F>6$#vqsYM|K;W15pJN2FGW%Rk2T!;8$WiH025-zvE0jUQaw4|U$54!wOm zaJ4gQHSgZ*-_0T)u4ue7-5BDtyY^WK*`FhzomL4q(3szfGi^B|eXg;kmP;EJDg%O! z&YtXb44oU`**hf6s8U0`&Ds9Z&KuO&(mT}xCaV2^$PryVMz4?l>plQX2x|zG4c5gI z8Uv3s`D4hU?9J$m=J)4?6?PBE^KU~gQRYezL*7;kj!d zUV92krrd;$?n?{#=AfWp-TU*<(;mW0$xV#|t)?mdrRPw;w@P-fJ!SFZXxnLC)+zUg ze)&gU4o&1oZ!OcA8+!*KaP)>e8U#-ich}`u*J5s|suT#;xWJ2A!ub2Un1E!K}5rgHm@w;N)6tuBt4IY^EuptZSS&UZX?Qo zqU^VU9wS2!9D0lWuZ%R=N z5_~A-jmjvIsp*dE7GnNN<(A$$M-Pd-(I0;rDY+se=vXQ9 z7UQ8%HYSGMe{bspu4c4c2v+yyIQ1_}j?;3Oq5%|B#!1*|%#;pLT70Sh^8y|u zB3$5a5bSiWskK9k7OrnLCC$bIE0C9?L@Vp9Hf`ukuZ{H92Ey_DlL^}X*!Mvm^Ob1kA1KxaQU^icp=9hk<_ zFNy%j{VL{vUQyT`bEb^dd+Quun-UU2wI!{M_g8%+` zh20yVgXjpLKGtgj9!><+R=an#S^^fXkfS3~SYBzKR($cO=Fia6g3CQO25bLNG8^&! zlDT7f^Ka>r=PPT+;;g0RXPIZ_YOga&nbM#>gHcWwNT;h(^06rnld!6AtCEQCw}<2e zPrm%>t+DlmH}uP6BjjCAv6>MLdnYNlp>4H%-UpMEh?Xa!ohu@-F#{V?HQdB+8sU`r zw=N2BHYjw+GLEM@Mla4uL5p3qLy+Z~SWGz8DvZuMpa5ef-YqS=qW$=JU)u_wHF<0! zS4wo+Z~0X}!UZ`>PI3S)+5N_FW?*dxq)83C1(ncbiB|W{MeYqs6#tHDV;ysF?ogL4 z8%l(h8%kyNaT{tawA)MwkD-M#SAQ1_U%tnPoxOOq&$Wy$G?YDqqu8x4gRK`#H$kjI z8aMv3#QYfQhEpC`{_D?E--0{+ZQaC=DKDbcS+2Bq&KsW&C;ePWWgfjn^>Lj5(51eW zpT-0?(sgCzxDSlt(TYut^3j^S_DBn}(C)PLxdm0uU$k-rUXN=-!R?YC=jYet!Z(Zk z9@10<{?Hwc-4ly^Zgt7|j1`Ucr1mRRL**YL5gS*GZ3d+CR#rBXw8~=x*i$O^LD6hv zEA4<{cBKXtv3{wd_Nx&UPbEHFBd5F2@ArDb`RVZTvVqG}1DiEB_IEnV9T9aqeC^Ro zmA8Y0c6+A_<4$Vg$c=rks;3=dr>GY`S*0bQW*%~(S>YRGwAvL&aJ5o*QTf39X zNYs~J^9Qe~Eq=72O=(NqV`lo1z6|o|=(|h3qPy`zQ(xqeBU%~aa!Jl*_EiIGi~n@m z|J+;u%Wk7ygm|YojwdUbxE}Z;mAM#NbUWHyG|0G}g)AhwAOzcf0U1-B>UfkUg&+)R zAex1BhCM@b9@H51u;B6~yIS051yzhJtA`zx=nt zIYBjDmLbvdwD_dxuqjJ3RGp1{dTVqAcSJtA(dKkOv*Hen5&|J;GCzeM>#4}TXUkCc zTNItOeNq!07k# zd0B_Oh>pdRj)PMI-6oR!-`|v;R#+|$0 z(n#^%C2;lWRrW78E_p7QgwLy1iLFL2GF}PK(zG!3%C$V`ZUhAwos&rU##gTwn1bbz zV}_OvGp8=gjpIKpe!9mol<%c{$s1(g zD_Pq;Pdt|V`E-G@=AG6If+Tzcu1`slOMTZpp)&f~?C!CF;vu3Fs%NxkG>nW7T#@$t zvnAPiOgZ=4@o5QblACYqIRX#xlWG7z*^>~05m4iFPy0ESd=q*SAdA za|=m28&$pW&z@gR%-z~^Z*K=)7&x|XhMHW_{NlgmaTm0%>^X$wXwVRebi%Se_u*`m ztFr8R8d2lkHe)(4sR-#(T$>0SSAi%zpWH`LvrviE`Q&gvHy9ENBx{uHn5`;A^4~W~ z5l|do4^N{u{qLiMg?tt7*KU^M7mnozU_ zv_3BmHZ{nG*6iBZuDC*x9QBCJ>nKBznG%E1pJD&!1%fgPHick=Uan8-_8dl{y^B8T zp6h%PUZnjiUv}s-lY2We7;Z1~c2bEV9FnzAdxR2^myc&jl!`OFoaMV~Mph=*xF%3P zUNOR|^C?J4Co)Ubs(IfHP#>zts@-#)=Yu6+PGKDW5S+2lrJdkfNry_!?f~9Mx~4{+ zYi8$_L`%ItZtv^%1&e0wuiY-E5`xukI5;`Hc9qyJDO@Q}_(fk-_uEKZsD&}xi6_*A zrn9!PJlXe;fde$!X39!6KPc%R=3BE#uyf6T`VA}p4{Prk)zsRyi(*AZKtZGv6%>^w zAiYE^AR?gBYeb|A5fBIx5(O#Jq9~xCAR?ktBE2Vc1Vp4pdPwLHNGKtYvi7syeSVy8 zt#6#~>@oHa9hxySGv|EfbJy#>t``p5KFaNHG+lePNjUykM0%2bf%oN%GV9f9W@SvB ztiE{DuPCo?Nq1&zOiw>bDPPL&VabMlW*C#m$t9*Ao&5xm#grpjt8G4Mpe6{qi2r3| zyb~A~TeMdObU2dk8q>TZ9-h%6C9}WR$zk?tgJKKc!>*SwLvYL+Xz?#Rb#khwMJYin zqD%~ybSlQMB#PiuIs8dQbpPY80tphXaXVN(>ZV@egZn8txAW1Xm8Kl%QwBEiZJ~s< z*NrH>h1SWg^dVRP{wEc}&;t9tkc3TyiXaV`dPuco=C$7}oiE0@OKHl*#^pTE!ZAmr z_nvTDeQ^a0<}=QKA;mmn(7ldD`jdJ}9TCab>f|G-sfy@yh`7r1-- ztVB6^pHtX`&EQ?pmrfa-;0SGSH)n}4B26nwP4c_i`&TPQTB7e{Zy`UNTWB-9_Sn%y z-t-2Fa0uB`OSrOV9+$NjJ>}tZVezYeDKsJ-kmDs>mW4`s5(1psA*^wxwt`LMphGb?}I8%tv*q52c?`SbqJN+`ukw(T!2Dac+1 z-!GGbonu+t?@$($k(RPF=i)QD#Y5ZWow&X_-g za?jM3Q1_L6CfE#+tPKa=n)QoGDT{13E{fbG6mz=J)T^u9^ZNVBI0OAI$x{Qu@{uy+ z1?OtuEkJ`XBFGb8N{DgfV<&CF@1K1E)$237p)15WRKOaC#@{YNmg2eV(7+L(S(Lw4ib(N!%0@ znv`g|TbP5L8=%`8oAlYkJ-Q!%30zYIZ!S!K$t%Z;&x*h6yA9BPzP_4p9KwzEg$p}* zzbv(d9W0!Es5*lwo0bT_gzYy^M2lR*#!`ZKFRx85izS>gu}ScFe4m_6$F?v=KA+d> zk+G>E70!MB3K^QlpdUB|*hc4>AV)b5u11Hv?H-K`%YSUj_d*;(wHEuD_9z9CF zk`n0tzM72j-q3_-W=aV?9Q3LftH$;XnNW*o5ic7w-%WyMn|5bh}}7%52CB4WPXmS(LXU#Ca+pPfm$A?^=5!|Iv0lbna<)xRguV1~nz+e3{#~nhykX-})>mo~pR zuvByb1u`#K2t5RlV?{Ihe6kK~Og`J0d$zLad%0~hNW9Qp?hE<&x_s^pd2h32S1nS# zAm@Mr*|Y8>c!hWRKfQbrH54RZnHhcrySBS9X4ysPeV+x@ebD;TQ1>WO3w`pwg z`$nr1zCDL6)7RmQ(;=}#OwK`exb|p)sv~T%)c1++)sA0-w|@s?1)rC`nX6VCls)k6 zrH!vo&d7KYj(9RMob{4E;{4>(1i9 zmYg2k%-BXs^A-DF?7MPoIbQknfbx~hFsZ@3!_D&Ey6)1# z9=F$gyCGlTeK=wX!=rH29;PyRg`F*ZPxQE6m2-eLTTZqCzgzdH&(}r!_7 z$f&lCZi7cc`H{x15+l&3EJ3)R>>+zz#nUqD^V-&*Q<#TXdW=`ZuCOSod!ok~WC<`7 z+cBAj`@*+&*f9ym7W=$8K3Ax7L^C}LI!1`U#t8SX-}rCB(lt0sNBC-=n$OqS-y5kB z1AbST=U>cyFBlJ_-=jjFT-Y2;pp@f@6#U#!Ogm{S=))w#g;qz*m%FJ$TXZwpzB$%O zeNp^CAtj_e2%gtgVz7R;QBzi*vx&ed=fzCVXTqUTnxtpEEe=k2+RS0g@ z8EyHtC3yVAo~M~4d=Bg=QjVYxs2EGN`J-7^-05O%8B>Y+av8zQ-U~IDNSNK_oUi-T z3sB~7?vkU5<_*1r7c21a)b>#SPS89h~gv%p*)NCGauJpb@=%&~l0lWAS(p zK?@H<+2!FO)-K?A`~(+tVa1-V#5gnkAglQ9kM^CTfR+1ND1mjPmUG93c^UoZP&*g^ znJG*XT=Qv_k}aj8SrU;n*INTJN9~(Q;~{}ZGryh?TFN|8jw7HHO~2|5sCa6m9o4?r zx4TOM6S3c1gqw=ZgnG$=t`reJDSF)H4ak}<3>okFqZb4?sh`W&^bAwTFB}%u+{kc} z#ouUI&3Nwf)oFTq+X5l;Mf7#(r#jg}BmNgR>W!-^tv;o$jwfS6AsJ{y4WipyI))z{Cplln;U%%GCct@W%7u{XXQ2Fw_5J3shHd<@QrkPNM4AY<2VXdH z1+O}RcgIVNdmZQh=J|jyqQE*&aM?fO+nj*8{mMCGDxP9wNgyU)zn?VWb@0-$Xr3%8 zHWqq!btL}|ko`O7oyA)hp4Sa`^$(@%#1ExT)7!dho*Zj_T|r z<6I9*&!>htS+r9OICAPZLgBkl~Phaoc7NA4@fyxp=z6UryC7IhkL7YxBt0Z~5l^HAAxta%=IN zLp0_Q2T$$X_7>nEM(dM08U}nx65G$FZ+vitUpD`$MwkMfMKeLp&(?aS6@3Cz|2?Kt z_a@QC&RnyheZu~i+&7NfY|YjfTNu2^7&P&v4V7WNP9`*F1gT^AM|2HxhZSe4@6_V@ zk2q^u$vioDZ@W8avbcPVfTw!eB+0zDa|Z=WlNN*K!xx~Q87BxJuG&uk>boF0AF*hl zp?c6F@RK#Py%)s8Pmx%&3OD{BKMN}~x>O%Kr*%T&5Ho{wNQ0?^fYI$h;3va+Ohrd7 zcPB-`r}XZvoDK0iu%4Ded!jiux2F&94$Z>Mfhpb?BE`s>nisETVzplQVABDSchjTb z{v0GKJeORr0GiHzMM^pAAAa>8A0LL?*hX`BIW*t;%BD#$9H61xT;Oe=SeM#$V*CDX zfdf57*RjRAFyi}wEmNQHE}w^QPrubr4BVW>?;|B#u^ad7F;Rn?D3~v=9+sPorWU_1 zGhdl~35K$Tu3YcE&wjU2OVKb_S2Ze>5kO{Kao5mK*7#yZSC=ssG~1xKUP``kMC ze{8`SC$m@?xC}60Z;j(%pP-4+=rz9`INRTzxq~ZU6`cKVRBHdfK4ZP>$EI}`W!=QV zLC4QLTU2?isJ|QjCFmLlf(xCLsMkmL%> zb&6TFw$6HFd!D?KVEs|OH=XOf{-%A*s@2{%EBUv623`_7%5F6KMs-w0mdmV*eA%6p ztJpo*xwz99g;A>}$@QEP81L~WvaWocva7kZPY>OaFQ|IFpiqgl+sJ>bea^8bVKa5~ z4zcIP*DpEeBR`a-G4DJ_O&Bk>J?0h{_rDfYonyvCAq;*=6Z?$k>1 z6a9#aA?uq$y4KxMYc+%yj6l+%+5(uIQep68c>HT$X5DY@fRfO6gKuiB`O=EQv$@TD z{Q6+ZftQ4d^WHbGhkx#~HBWzX2=vaQ2(FgB!5?^z-M+>pWNz21u-T;^?KwCY&3DcD z>V%hM4rcXw{^rG9KuPBq&~AzU#JbhG7u|T|E`hZ<>o)y|$G!fj>pOKZ^riF9HN`jpy}wz~6yj{Ip6p zl&CYV*wg0zr^79OcrUNaJ678HPi{5r^>@1*wW6J3+HWI}H$%a6Nj_G!uQL#7?eIKF zj$6@Asd`&&5R!_9;JvZ@NNrnr4` z^(+J}+IB2RHZu|^i_$WPtF6G%Lfaiy_cNA^>PplDQ_h_#uBbC$J**bD4J&$l)VZ2k zOV6UR$8Js9|3nTkX|HF@&f@jq9^kR>C?(dZh4WHq=GwPT?wLu+I&T*GOBr?zp-Q)) zV%uvI^)`9X6l}Clh@*@+s*GX@#M+cw}u_jwQC;1KGZfC~X{NqTTPjiW_4xgmA zGYx38&3af%VqjRV!t)oqJD(k?UTq+&0o_Am98IyuKclDeAH{@90oU`Fj9dbMCL=Oqpw|+@fYS-jo_l1T%R-Hp-c}( zylDwTc?xXFjOYU9YaiD4Fm*7$z^u`Xi9+uclJJ7EI%YFG1{ z0(HSZpWhWtupMd_inmSSM+0ONQ%@briLap9fH}3=<*=<-*1oW*j0_RD-6z}M`eSZ} z%M$3#{2^fVgb{%a>e?$=q?>;rf|rM=-iPoP4;db4cZ4|7u`f2wk8*}bx^u1sQZa2M zauU-FG4ewevZi66PJ`*}-HHTpP1X_dE)h_vKj1bbyuhp>W1FhRtRSwjUb2HwoqVsc zt$ajbvwqLkt*_m=SfLsAs`LUHqpwJvY{Ew1PSDgdzWDhFd%76u*pseQec@XFrA?SK zYItuCKhEjbm#nP`PIlDsvejw-~p{f3D3m8683MIu6_C zZ}3VV8~N}!J+FY%UQ@XYEbczNUX&0c;`;R9MJKZkzZ>e8%f8E0^;ED>LMt=dCSBB^ z+}jhT8mJBhOa#eH6L~H3u2(<4I8Re1y?ivewglec7nYkA{doX;Sf1l(qLdo>y+@0_ zLkK4;i8fL{yZ3J7!j`KGG4EB>?E{m{jAj^j5X?*Q&0Ce~GeZ}KcfBU7%{ZTT~|jY(%n zR{HixdP5T@Yd5Tz7ErMKfHx z0qICjTq^!3%i>-|@f&jSGeZMMzZ02g`x(}rPtM*r;i?Nii$}*zW<+-V#pRSBU>nR8 zaB%S&GK0EB+G^(?k#nkxY~)A|uwdb?BB`?q(pSPdP9(hB?=P18AyXxcknJTU#l}9; zF+N$zFd|Re?LP?KQI(|=VGu<;Jh!=g!Nv7*O4$ksHz5&&G&$M)#FWtWFO{sX_%@?I zV(7RuBUR`SnIZq7!&k zD2eiSh&vg{2bUzAyxu+mYN5aCJnm4Bza>HrE^eh)d?`Hk!+x)9N}DkmdV@7N1br~c zIJ>|0To^Xm`NB&K`?>~%buEx1&;9`Q!;1Y~aYD+`UVr~S`jn{i^eKf|v+Y>fw7e2^ zwlCjW!7JQ}x~xa4&hYy2&vEsp*V6; zn9cMY>j)?z=h4goZ$`BO(u?NMShE!kfb=HigIEXK;^fv9zdhS8KKcLnP$PWvhzgh5 zjteNhad8G>S~-eT%EBqaYxN z_P04=^(#>O%}$oruwt)+()v17N&hsMPKW#NByu%s+j7 zayXM;1S#)eOYaJDePpdyV!Zb49iL_qdCvSRl=uWvRtL`k^9P}{*YW-#AG_suEHz+S zwPnG#1$`U){NG@N=kjFc*WlRZcfz2}9_6|85sFq8oL}(8375 zk^Wn>qBNi5dAT!YkZU9i$X2o2U)^+!dgi5F+yzm;H86 zQ&y=4#fTcmlL#>fkf9^3zN&`C)WU(T6dB3FnYFxuprZc9IeH6Kt?ut((Nh_2)XYNpbhE-d=%~c06{bH|lK&*{@3~y0O~E3% z!mQ>80dk1uhHsVXS)tFr1G<3XCZ&`8-1CJta zZC`rU!%Fo6+~Wo_lfy56Q0$-;oL4!cBSx+d1ex|naWg{tmh_$(2RzlR-f+_Tx1Sn( z676L_n%KF0zDVT5RZZJ^2dFu!YA)zIu3_QC{5^ZZf^~pzM?ksZ9JPD-oAW{ zCa3c0Ra))Y(Tb%?z|!1|-g|`v6&yzUIEJcI($f5iihTRS1C!*!ZZYuwZXrRR+Ql74 zM)XIolb|6qNklg?j|L;hv<%}tDdr6*fs$92_0g9=vfqAqFz1cBv1r?YRi~IHa}o8F{n@HcYOMwP za)Z%nU58Yz_w?cTsS~-(`wVN+j)VC#lsfMh#bFJG)Ko;m+zflNi*dVXF{{EIKNa5% zI*1(Ih`#L`H+)$_fybUn;V)p+rbq}`;X47hXKn{CZmjli>U~40Pj~U2)*J|2K(rAS zu*z>~+OQ*FpbNN#PxjDA7Ie;AJwz52x^=n#(URt1rQz1O zpn&9`dD(|+wWQwrY!pZdWFCL^a04fjFTEYF(mvQm`gU(gr_;A`9hwOn)iw|YqRV7s zxmu2#f-43#p%*q8Q>Pk)&hwJtNA*MvM9L(q2A8xkf;jbti|z<3Y;` zF(4~|8UJY`?A_nGuKv2}ss2&7B^n}(Is*(#NF28k5~EyFF$taeS)F`ocojwyKikX`~_l_{^4vFFcp*{+Pfzwg;ehNmvGG z{I%Dc5c8T1aeYX^DfVSk9s8PFzq`>F?}$t%JUVrulel@9H@pxy_YJUM2+yoiLd5cL z0a@7LSn7Eo+t7rk8u#%38RLvWkLRXqc7aBsPyX5^poBe~Psf;KPE53^86{etC5ka4 zsdu^yOYAQfw`E%yatWQjM*oAJ`-plJUIE#j&w9^ga_xWq1d&Cd06irofZrp<}eUlzhnv_LP^Xfvhho49AJ!-IGPeo?$0=?lt;)QZ*NetJ?noA*D5aB;$*_ng!= zp(EyP2l8jnmlZ4}eQ*RMTdk{73~o|LOr0Xt$=D+>ukGU2cgxdvr4_2A-tUkA6#~Gb z31Xu-`V5lc%N(!NM|bp4y)dH%kXS3|y)lBk>#i`8jTY_U9>VL89E(ZHo%y~26pwMc zG0q!m&xP#hjXLTp^h-JO3Nf7M0 z!J<=vkk5z%9n<@1NLP;N5ni#YB6(YsUE-G?g7oSpUIqh4Ef^j?T z!Z5dPFX(fz3orWg`|~$JVx?T}eA0;YdmAdUFhdwNiC!A;3o4ZD@A|=b>?}89Ykci) z$~8$iq8+BUwVf4;K(`bla;Bi8D@8KJxbl}DM?QT=-t~~IA$&pZ9a6-W)m~f|yLxTx zjO^h{zzD2k3<>B5-Tcj7xmQ49R_G)C78*+Qi4K+(?FtRmlY?Jl)H5F<9v_r0Wmu4H zt*@s;(i$ou=U*7KuP}5sv2WWRDr$dn6GPTi3}MY1cGSr3SE;O5iAGA)_VrozVK9Vf zPVvSIbCjBiNV#8DQ#N@}fpPO(1ehQH)wjqCZ&nCWbwVv#+KuM>{yD@J z{-AdN>#5zE7_~B!e#9d0rpR%kHbGON8s}_XQg&kv5+iCHOD5 zt!h;HI_|>l6vy=UnkFes+oiRa+pAG!9yS^&nmYPMSa!YOBC# zwXtE(`YaC3u3mklAU4!)URuw*HrXjD{DL8(1-0MIz#dyv2)T%Ikbk38#i!1P@55_A ziA6x4Csv=Ib&I-*kMX-WQ#s&!I`bZVNfmB$ON%lSl29hPSc_!*tqg%-^kLsUW_qqKz%}@qS)5Tez*PQ_FdIbvNMee+9Sa2Ofkq+ z1JXCI7mKv(+ezy_j${2Wm8Mq^Hh#>;Ou;Z`%4@DAYq?OvJM4}|8|;-m5y9tmlIlV6 z->bvjWF9N8`mQq4?>U&D2--1|eR`gdm?u*XKt5ayq(|bg(ABT~d3VOQtvT=7m%8aC zHLn9g1La@-d=hPua)O+VeS`MSX9rq`7Frl#mV*NxL{D8GKid|rI>xbD=Z@wmqQ>-v zeoOcJqK-3&K&9iYE`PuZ_h-`EZ<(hUQA}UN$74yWQ?MjESFK%0{s27Ftd3RtH1Mzj z+H1vFp=fflxJyYyMYQ?VR`L36%#t*=H*vgRb#1D+)%0~l(?V1?ZE*W&0V&j zoa&Wz1nENaK8~ZEUUz;LnDRuz#YT_&JGS256AkS&tu0-J4>uD_k!RS+`dz1d-AYbG zK!<@u3o&X82-HJ8&6&Gw0S|^_`Hm7T_!q%|p%xAoKUEO?lMC4LIj|FtR{^3c80CQF zG}`4qN0teot|2Y7K`ImZ9Hk^_$Ep>g`BgcRtL&6_hVojv)pb@O6YB5R?8cSdPWW!` zzfRtSuoxGE!{y{RVtX6@xyEa?@(obI)xsKdi& zHXqtQ8qeyV;G2PrNa)>3p?HI^V!9YVfzhJ{zxSdt>0yKAa@I*?Yg~DC)RyaotFF>{ zU-uFSfH-MYUyi{B3WMo3oEU%D9@ahDY=+B}srMx1Sx2Cc;*rWbmV`-g+#D+r4Z$z< z8-qsqirhTHPigp~Mxrsz?bk#)9DaeFX~E(122bOd5iPH|a#B+N z*uw30lCO&Dnc6&u6SuAi2`|o{w z_3Pn2q!&oiWx;9ru~4^3h$)RcB^lK~&CGtN7-Zsb$!?=7`tF2x)SSz`?uK2Lik4Sp zbKbhRMHjAxX9ccLh?3;ZOcRro_%=pNKBZay#bwl+CaphSIA=Xy|g`Hyol?()-NVN607N+a?PLyP3(z&XmkyhFG- zR5)GslI$M;tMZljN2HV`@vs!199_3k#R^uE$=2E=^u4{RVsO|=aqoM4{hPGt?nLC3)TQk2|bZ{vwhJYkL-Ln^7=$Gz* zW?Yw!aoJq^q}4tJ`w0E#)bl!&!xK)fuCrn)%u}~Dl#RG!rPp$nQA1~y3oD>z3oMqrN8yOUvTGwyzdd2)h z(fZ|-XP2Mo=$)M&YNsl=g2f3!MO3J+DR7-ZfO0IY;uW!fC$37g{hn zzIGi>J1nw^-B&|nRXomc!`O4}yfUC=ZW;=p%EuY-wv{-19ouJGZx3nx>X+L5-a1*D z!!Ii~ku|?(5pcG$4BXy^7*7t>^ITy(aeHa>7U0!@aBE!8smeD{?G1owV}GiKWo>@o z$Fd;gBSZ6|wL63y1lrCa)@F7IrpS__` z%vq0z;>)?T|D%$fov}LbznjZ79|qv5P2Dr@yDZ(GXyN0~LIwIFjK`$46;HBlnwBf< zJ+Ml|0*(v~ih)0Z#o#0eNT(o=SMu7XuhaaVgq+-^w94&uwmxJZt41WlHGL{bn01X^fDH;nsafawAF@Sa^2azVJ=H?^9^uISUoE6IHr-C2A$JJCuY#wYFC^O#R zX^Xzj=)fqy6o067I}=yFil<2kKZnjgna^U}2Dxk-aEP(QI&cqHxvzonN?>_qM1@H}Tq*^VPB8+Qm%LACiXl}@rnzf`kD{~4`q+Y2^wgc%vWK-fllo4 z@FhUG9@L|CnrgIIt2%nBnxRY85WmaI7XzQPufz~p)v^FJ2?HFcjfhvASia|=6Cr_T zxz{z*%Ya+{zJVUKncAO6#7m)mazqEq>J6nuLI{(;DqMTXXz2irniu{rCq6$+Adyc$ z>ZblluXNcGxyN$WCogPx%(>G6RaPf)r#~g!Fvht`NHC=@erA2#oQULSJY$ zM;6!V#qZ$cY&%y39E_DZit@9IfrA6PqC<_b=Pxc7J%_)zt~n5*P`@58L-;^qiav;q zk#Cxq@H$fdbLH)e)aL=*qAUK+OaI-senP2cJx9&SO8XIh?bdE()cVx7qNzLN>1KJ? zX~)fJ*Fq#D-g5P6&K=m{`=d@9Eac0b%3iv%?U zmlJWIp%Sb6n1L$Ks0-A_<2&F!pY|VwN`T1}3uww25 z1E!Wj1|veUq_l{Q=SqrrkL#&t3I4LqFVGY*=0pz>9pTr{F`z>)x^nCk5LgO@D%>=L z-d7%7(NEc2(A8$0w0;mDIc6dy9fBkmLkPeCsR6JJ>htpxW*OcSF`cG|t8aP$z zT2FdW%#|>=r&4Y6b2e?X`7bU3ilVMGDLyE}d`QA*-%sh42%YZ>+XN@!WgZXGWX$Y( zLx}%qVao&e#4M?YTw6WmXzjbD_~jq#_cG$)<};O>f$T%wU)u%wJ>q99M;Pg~rkkdo zHK6v;n0g-Ygz?ZWN#!&q@N@PzJDV`?m4RLkw+VtkIn>S1k~Od5!_!D|fAGYg@z!87 zMI<8aqi`GgM^pF*V3*}u@P2yMyn-A)6m4d_Yj0&Gty!m7lZ!_PI}g~H*u6+vfEl5J@O8JM(Bg0Z0vP4~aXJ@)!vOHvC$S?4)DQG8$02e+Nm20gLB@l!wR9vBYmTS=n8{08>?@H8L z_0f{4`sYFnJ7A`PFN*%)Oe;ya_5C&so3&cT92&b2z7Nu|K2dTR5lC)1cTPZSw@6-koLs zW;*zYo-$JU-((B_HBi{C2bg;Q@x9yNN6(`Ap&R$mN1iY8uM@;f zf7m-nDJqJ2+n&=mlGcKeM4n+37y0b8b~%nYIw4Rrdg{GVn*hl#)eW~BBo6J6{~6#w z{uz+$fsx@94;qui{UoQ)m7zqt&{mKKXGvE&x^jjGq5D~3j9yn_29Fkpn|0l;Fk%Kj zC0_l@pog{oE$biW^08@zP{Rsma{LyR)D%S)^Pvn z%XA>e!(`fyfi&(Dho6=fv#G?l^r8X!yWGUO;=N@;WO0LT1V7mntoH-3eJu6mQH^x_ zn3xBT_Ji`KPnwE@*Oo@1;0RRa!HfJCc;#(FZu1*JijpUVh>t;+DJ`Fzf@9L1lW9Kv z=J!%H{xEg1@PMe!&Yabk<(J0a?RpA3i|WAbD($zpG3b`0l~eoYx~6`_6aBXk>O*|% z=g6Os(syCnbIf3Kj;fU~hfkI9Y1s7(pr z`UUM<_xZOzDm?mRt;oVl7;u%16#QB!WFLCj96*u!=CFPP7oF5cIfpix`lcSfhoLkZ zhw#=tr8cpDADXom3dWuOpF=-s`u#&Um*t%ZCDQChDP%3-^829gsI1lLIbsW9$QH@)F;WD1@f}3hdQEkQow5__)4D?Dr?ZSvRs+ z?zlLHKU0(84n1I3>NQlYjM;XFHdRtkdl2qg;8DAe{KYky%@LZH+C?>@ya%~TC19G2Byldh)Tl0ha-(S({k$jK$1XGgjmTSZl^bizzpd60DA_(w|fgd`kD} zxF~tCOQyhX9M`XJESrof-?5-c6We1R;bXL)y;z`sYubMzwmld55|~D=(xfiVAxY*H z8Sig7*ZRM60baAO^LuD%^kjx3N*P@IBb16Kk36+}GC}RL&9fH``PYqZ(4C~|$7-lo zON;7@7LU^?@H1-eIvJ2N4j~ex>U>Qh70L!5Tx;&QFrsr~Ba_h69Obm0_G$RhiMOoj^E0UGi1E$cnqWN7uc+nR6I`+%P?u$rUf?FH$*9 zquu2b=NC?uXI-1|ct-|iK=;^<*8ocs2Z(9Mff(nU21eYR%8LQX#FXaoY)xsOz$3Aba1(*UDhK01#D zVZ01-2_>AsT2R7UBCo-Y7So}%RY*Kj%S!Vp=mYHe||s(6ahRf zSsRxgnX}Gq^+5YBWz&Q&)HuP$quo;n?9lnr&FM%Wbufqy$K2KxEsJz61VET=d3D| z)`|Kr;ofWeQm@hu7yYRJA!QD|!LDM+F)uUF^b+<9dDLlyv(B?#UDxdHaQIyFbXQ_h zOaN2m<;LzO(C6c)7JXoGIGGC_GB^G5_T~u5gtpbcYQ~-P>ERh3DgR0P(LWb<17(qv zH&Pd4@HCf^L29$&o$1j5p%uZ^89$|TVB31cY9QH2=5Y=sLjA#h;wCE*X>@epMo~TV z2PcJ^8OQk*|2{co3rw}(^)BkaV!XvV`@pEC=CN`?k4LgAE1nB@Vpd2}k6?=2qJRLL z4cbzXmsz(az>NeXb&ytj6eJURiWjVnCU?3`{e9 zsB=P?AapnL(e_7qN!ZMTyIHSomO&8xSOeX794E)`h=6CW(`jqJQ{5{9zF`tM}%y2 zivd~~KR@OQ%*HaXd3CiM-dTofHlubbs30xXdR@ISxi=E*ljMTQY% z?GSJRcoUA$Hi*Lakr?715HMomaz*NK>h~+1ZQQwB5UPJ#n-|nGi=m+nl`_sNN|BA9 zrp^`&-7~*n|2FSA-LGLhfvgF_MCK93<)s$b!R&ST{TQ=Q#os69_zXd^i9XNH1Z*W*zk*qa(ubIFToUWLHgD1_?{tOR#OJZ9>4|4O}VX*1eyRfe+eU-w}SosJF3CLLj@{ zsPF3sm(y&7Z}-&OJ(M1?$nMeeq01885(kH>)m~p{mwaC!dV-aU05fnvU&4$Bp=(5) z>qr!;%O9VyyFmDiMYj89x9~7< zSY-l$8oI!@w;}8^MkEw>+cxVjuB8F|#uvyfgf?l`XS)C%mw)-$LECUD02Bfls-DZ3 z%Z$;fmS>e|r{6d4lhr{Z%6BNBKGssPzNn$%WH4te@WOB+b937QtTB~Zj*mg9Bh-CD z&!8(82m&Q|DryrUv<;6czh9Mn+YuKoL&w{S3cA5gSv10rWx zEW!RMY=Z7SD%O@!U*I_GWgj*_0?(McCO90e3Q>@ly79ChqG8Xd{AZAE140~N`-uQ( zjo35AiTZ$TNIX9C$W(u#;U@Ch`L|bZ7lal6%>mP14`R=M<^kBnNX7uz=8Wf8=x_hx z$`SlqeC8FNm1y*@v;qr!@IPyP|MCf3|2NOIZq7KDMOk3pLpPeLjq{sk(9w(>B6N?} zgVPy?WqnF#m=DGx`hJ|cvk;+gxOex5O{@d^1=I_k1S`#opgdy2BG3Xkp1;qvN3R%h z`U}8a{?8`gl@SHj^CUZ4_cnmLLm3t@K{PT7J?#WiJaSMUy0KzHi18X<0dMC&idbsE z$x{=H3bXA_7mVQ2)Y2U_t6!vCIhEJ~hHJO~m8+nhg1re87V$MoETQIGwEa&*r$lwd z$-MinbqzPFIyvaoN`B$^oM*K}cajtM?YUSQj4z#8RDWn|VKbCw>jUe&K?j%!oxyU7 zGu;h*PEttcAf~y~A^k7YR92N2sHrv9AvAV-~b2)!1 zKrO3e;8VGALD5IKQ17m{C-2oIxau+V2N{^yKaMu^PjbD9gj2AK(>lzW z^H`HeoYmKBc>h*?-@$%;@r8XM2~9UX-taY}TjPq$Sv_e;JEqto4B#VuAqkJ^@uypH zU-KBFR@If60{@G$HxGyU{oBT;Bo&%U$daiDB_w-fDn$sTP_`+OEqnGcQ-tgx6d~EN zPO^-BvM0%IEHN|o-Hc@nv-G?AeDCLep8Nhj$MJjaKO7yVG4p<3@9TQK&ewLHCb!aD z&)PoHJ{81{YC|`kN4s88qYlz;<|7Z#x?G)vT;V zFAp6ZUd%gjihL6lg;vi1TvnE@G=RoIAVW+%M zr~nSQ4j)8B&$bkXCVm6!A6T)Pra(`;|En)^kMA5L-4R$@ns`zy#bo@sT(N?uw#&N3 zuO7w^Vsxgd#;c7L#A8$oOsE{B_iTu!46!7SvARP>=SW=2Ei_dVtKY#`Zy5e$HDoc4M&;Hc@=8@36=x^DvR(~j2l@B!RKSMkZp7cb^%T@;;!n*(*k6YlIBf<~ zy+Ak54G_)IkF3Hsr_TOU40o^43)G}a^_Z#Pd?(I^zyIC__mt(`mHY3d#cZSm$gCXd zn*c6J0e!)@>ks6tq9KssyE69Q2$#Y1`+u2D?d$##6e0O>@BiQj+BAOoSlQu<3118B z+lmYa(*9%6q?)zEzP53uGanDvHhKSn)LHBv+Kd*w@&(g5)>lQ~T9`1;BUw(Q9{z6f z;Z`(Q z;X+=e7=Bt=j^Y5+s(13{7`q=Xs(8rPTwxC-wjF**XWGCU-^n`P^8^db=N0|H1q!-3 z?)O;NI=(Aik>)(tdHViG=sv`y17XtUD1M66!`rpl&jOvY1~r7fziiN*U1Pu$6UezQ z)arpcj(!vN-S93RgOsL4p6r@-nzc*WdDiIeIEHeO!qW5#f158-R-Z0PvTgE^(u=UA zH-3ySO|V4x>|*y#MeG<7#lPbD?zp&4VhUOOn0KWaIgkK&n3e*?jN)CCw$HlN$xLQo z&!ZB1w!ga2ejF=-lz8Z?KM<}8&JM8$qbl#BGHk3G{7oC-WHZE33kL+dB2-2TF@Cg> zs<3AoP1eGV3~f-ynAj~$RKuz0TypozIeUf8x5zR}Ij(q2NwW~Ntw9UG=`tKK+lbYJ zC=bmb-)q9Qxk72`Y@f5CHEOkGq1WY@JwK~3{kZ)MWFMNC0@(6&7(S#GwT^+){dq|} z=hrSxbkq-~#j5$ZOwS1{AbzzVgaGbUD>emy;h|NA!@} z!EYRPdR=VFH^Zg*A$zR9z_o&P3-rld(hzATUA*rW_lhUVNJnfu*@Rw3%ouGaDz-Oa z!m;9uKYpp1w_O_DaVyA2d=#lJLWDMOVkz<3BzmBdKnW%TY3@9jmXT-igzM05=TvOd z0kngCIcLTSpGkCG{`6I$>9aBJ{i>}G``~s!(7-LIZ^6rzmTvXfLjPFd_4M%W&m8Jr znDV^VbB{8$oavTD3FFTQv%ZMMXC`*%0#vGWwk)?R8m7JA2T|vJy^w6#zA~<18vLQ# zw}O}3D4X-P@rLi>f9gI-4@lY7BiS{|vW@#{F5>{nq?N;qanZ_THrv?DF{{&nRBa_D zZu0Gr>?(W`A-GerH@Xj>Wsk0ahuI9S^13)bA3xTrzEC2fUvfg&2A1s4=$5A@3hm}8 zZF@T}5_UED45}rCZaXw~2*O{`V)&P;#g*i50B&&^CwDQSXMdINMY~^EM9|*S3pptruD` zQ5Gnh=3`?w7ifefTKgv4uj(t8_Bi2!oH~L&hpUd+iXB+H7w>eRYG>Y*r}1zzKz>7% zbx6Ks=^zDWG$dPstlrX={8E(tN@( zk4H5jefZe9HN+eAkFw8 zn5_0~00uha82rjgzJnQmeD;1^O;tLlUk+QfP_rNlM?xO|GU6<0fd4v%y}1o*6*+Hr zU;gl^;w?kcJ!GMIF1`hyfPM+k)c>uTIGgcGLwboHh!{!o>e+_p$K{2b0rus)Er*FN|0_YKI>O1s&5)!5;JJ2^7uBe~P}U?3@FO^bIg)>&4V=8BI?bQd$-(eUCtFrfWEp(Q zq_nMAhVQuVhHm_CyVW+=BcB=jRWKYua`)0@hYP%;9<9i*sO=-Z^q}YqmB#r$7L6Z` zF7MdRjoqV0vJS`fph;pN4M{%MEmXH8eb*h}9_b|_>=mp+BcINLG?D9?ZGTEP92fHv z$LRn(Hg!dfZU_=9>DH{R%53<$bUk4G1>w%V{@6)ubEG+4$cEY>J@~cG6FZ8#50BG- z0RE`%vQi@H^|aH>hB1ebc1}Pxys|iK#hk7-fzVV*_*p6Sk`Td=pmlZl068`WD0ckq@8y6XwQ-f^elpTt0Rl(uAZ@qG!q%P~jcsZmfry{e_evc<0Qs|& zz*?E{3Fv?!ODm{>3w&@`p1CVcroC0?Bv(XDV%&KsVpGK_LxA@@Pvm08wEx2kZ#@qk z3zUE{&z%4wI(5cM?*k4kU`_bt^t}aV&nb1BdKaYq_JCN48W$Jn6)e*RaVc~Z$vYrA zsHhjH=q&1cOjFWO+&ZVS^n2U2E~F;8un{Fh)1=^=Yd*v)<&(xbhabOBm`&D?%j*99 zOQ7ZhV3#RC^@DNw*yFwy{Cdzc2Ep z;nO@j0mWKF8(UC4H@CdOoDcLaEJlZKI(y*@c@x&#_0Jc9OAeS~@p zzPX#hN{an}Iz^K=BFjd*KJU6WQx|IV72?Z~>et|M*iOGN^qjur^spq0+mByv+EU;h=Ilh;Q1}DiY`C zj7*X&yzteByPNH0D@rzM(oxZ^H}9mQx#h{E6qXQdYy`n+kglX#?y8TiA9HZ(|G9Y* zItd3B+WzEq6;rTPUTu2$>_^M$1#<`!PX_a@ePMO84pI;yr?KT^bf{a$OcwWf$h1H6 zH$EIG-micNPVz}f$DZ<9;L^>S*;X9&^`Z8V39rgW6r+vSCw>i0X!1rKRdJBfhBdbX zsh6qzNuil<=gia`#|g6m@0PO;9vI`)IxjbN6F2L97uBB5*Yo^XI8yJ>ufE z_6Dg`3T|a7cN}@m`MjPfwoL1cUz%HELz-O5bTerqTz3!?XcZrTejmaWQ>YCmeVZX85k+SAWB8JE@qAUl@)R zTPyW`e>F$KPI6cWx$N`X{B~_;Be*h{FjsZr@r|HPcI$=u+Pwd8Ad^cz-fjQoLxbfs z=>moXMJD636YE$_%!wY$?--l6UXKKzq9@MOmo=9awOL@_gu5kuH4xWBYJdbYO+22!st{JYtJK!U*UR} zKSBNW74LF8xEWKv`L~vkN^|q&k7JQ0rmhBmAU=yI*-6l2*}MDU5>gORSDrm!gskUF zn_#8A-?asY+>WdP>XfVlJVd6DaX3)#=>OEN;OJQzQnpv)V+4(js!Yo)9`%)Jer}}0 zb{z7RCt}x?b$Aamrvf^fN`2qM;-Hy$CpWWB9P}wZ0PRqiv$>(dnz!3$dY7(%1Slg2 zwRd#P>Vo^k)yTAA4t4w@$3`3#zntceyh&G+YB1A!Z3mBbvy!G63%5CC3SNlP`F=ui z9`|LXh#zq%FI4H?vCm`OL)EzO-HrL(*1^w+IH>R)j=7e~VjFPve$0$1RW&5SnZVqo zxYDlFvJ7EF3^RNiwrjDqdig`T4}*7`$o2;k&`KrH6@9}PB0oW~0i^DNbp2rm44^EI zD^Tk!is&qSgw>@GJHpn^bB&o3SYYX3b-!q=?z7ErzzE0wmE-XM9+Y+uB0U4M&7I8T z72_9nGrL+6Aea+Vt4f!kY?-{<*f3Hl+2@;%0{zOBr!mf|HZl9GEZ#uHJOc2oe85FK zr_06&qGI#QG;NCbEiS=Sf&AUg}UO>fRPL)V12C6Yu!Vf@^p zoHq+sN3mVc)iP*j)W(4KWnZUV8uHLPn@_osZmzTaE-(UBL1zcAzX=dbRLxI zLV?~d?i8FDzI$9l0KCjV3Vo@pi@k%bpxpnQe8A&tY-#s*%y0%x>b{jLgU^OE{|Az9 z@XueleJdw#j*caww8>OYsaama_6*3b%C7)V`al771mxmNtc#1D2;=nuFyY>5I8f${ zTmNYs5PhUo=C|qH*$?nG&TdgsLuL|u5wT<1mO;LHux^beiC*C%Z0+mEZ5H^`m8VwU z^)M6%F2ZLb(dTIx7B_i{b%>X)2^2bbz^?5B#mV)omAfP0XtaV_p;%lRFY>wNf^Pf<=U3FrF^M6xjuQ98?6H2rxjWe~ zU(T!rvJGRmLol+U8Ri37<5bB5an@6!>eF@_X@xtu*54xHxt<2Og38HdK&aCQUaSty zGA1(?jm+o|&jNMyZ(Gs`(p&NgV*GGLT`%BT_PG!qB^*3(bf_v#k2n{EgkwgV;lb+4 z7koI_lXYIa>}RI5_u*XhV)>ln5fe>IcDDB3&Bt6sXH>gqEPOzK>s+in36GpEOOdk{ zymm5oZO7g-#*UBM55jYvvwG zvnwh2SVVEWdm}UW!}_7EMvaQi55|)LKP(lab7u^45+_HUED_FXF35DRgqio;W*!lB zPc~}|@b%mMlxmtCxyc#cRD&O0VZieyEEWr=o5iROr=nxoAVE@wS_!(?>V}k!=26R* z-cYT`<=3^{UpVm#Rv5Yusw4drGZuAG;`N0z3{si*r$^K6$H>aN+Yb&0V^D)l$g>Uo z4D%xWBKeZ})UKr8kXu(gV@8W|Xy;u)l*wSS8N6i!iU`_Gg+SX1``b!EtY4~o z*`nSE-1$Lp$fMIBA_BLQtYPgO2kvlbM>o0BkITR}ZCg== zO)7ppor#xIfzSdYWJ+3Be$qdoxjjkd;@66X?l{IfhHUR6yoLmAQk9Q1b5HI184Cu% zer+WR|1ifP+0>gapBfgU=W~Mn^#R;6eZ%T+m{CEtK&dlxG$bFC%XNv4=+7kI@rG5z zXp>TQ&8?Vm>TnX~h;~C)xm)pb8ECfouj{W-J5q8olU_S&lAv(EQ}=dS!K-spDA5jKGPhQQQpxpZjq;*9onz zbneAJklkx11FVGbULGSI7_4mDPX?jA?tEtY-Mb@whM)y5g~`1}Q`%mQ zf=&{Q&hb}ULrW9!7Dv`6fQhmsR9DTj&P#0_1r{zB_6#dW&|t@GwEW;_y?m?Nx13xR zPSf<%UN2TNr4_!hg9T8PNBO=(Muhp?0 z_`@A;@i&}_-7&$Czyg!QSaA`wPS%0OVsq^B4^Z4r19?aV$Ug=(nr`DR0>wmUT*Ad zb6LJB~sfC(fm{fy31& z^-)4ior|=Yh>()RezZH&OIxDZChNRPqHl-O?;VL|Fz~n?o)_3Xy_Ewkdc zF+U_dZNJk!gTA72!~xl`3K+Dw^5X_GGdrcrI4CNLEoz&0TYH(k(5#UnLvPkN-4J<; zZucYMH>C5DFfz-h#5024O#KL!BarqNUk0DC-}HUX)SZA(7LQ!L)EQGn^lbHKT${|k zwCtrW@|eS6B>!f4a_So9WI{tgW8LOC0W zwI)XwsE3k&#O-;n-n?-HJ|dbjg?8{6XgH44jCP)N{rdX_`DZ8Vi$5y#Q-#B<`ddet zhiaXP*erAO`{tLO9={I@jZK}(O&XP9B6fDtwpTP|Ly<6Yfj~~Lg5+Gy)%@uPEy}pk zLn^Jvge(U$RK?T@W9OA5ftM5NIa3(jU1;-!NP7BPf2+Oz zdG^qN=z+dSeJQa`|N0ut(!FU!REkI>3C>pW;~I?mGA+yKw9tWXppcqRAlr6-%iz(Y zluc^4>@OW5g)7WIJGSzbPp41oLS);)Jp)^7h-6&3R)TD6#wg5y=1KAt&k-Aqzd9?~ zz9y6H9Mc&~V&mwKNn|>MLvt4W*c>q5a@Z=@p;Hn=5@fk!2m}(p!)=VLfGUolPWu7;&8~ZmQM`TW9m0i2BR4teRao$8;mVi&L{QL>ylCWo-iZE5!$;mG~3A~wUEk~ z)jyDC{>&qgPdE9#!jey36$YgJ9RF7D^`NEFMVskYQ5|oP1~hchZ!?*E93#Ad83GC=5w(FgT1%_@vUv+Coyt(v!p`Yv9{3Ol~)#D+kD z*qGsA>rxfnH)b9kUJaB9Dw+&+1Bd=Dx?_id0EnR57=ZO^r>(+CpQcV&csf_okJaOG zwvi{K(g$~>fVcSs`X4rE^?x8X>4hMS@W3y3B{TfmS@W2I*l*n}hNC#5Pc)900xuuL zw#J4zTyA%gab12J$GyBSXuk7%2jqo&T)Na!_b8mG+yweyz)aKnldnqolaedjX1^2f zdS(*}-q_fDc(t)-(XCPIW}qcqpVcjhXd~>KcxY*^Eu|;G_V-$NKKbUgApklVB~^5) zl$10GJDCc374C`u{3@1kinX3^^D=5K;VLWv&5iV;@Pn>F`Xk4Q{glMwm6BBMk+8dE zZ!SK}?C!X{S5@t>7QB84XVL(jAA<2AFQ!ZNtP0&N8_MLl(W^9bHzr_acimm#B&tThs2(q2qJP#zs*Th%CxLZj#I}@h6vlqq;3|d*vIcjvwi-Nn_P&AR ztago)6=5Cg$t`kU#-iJ|jqvmB%S(WQ;kCmb2=(-D^g^31V0sLD0k_A{qzKWIeMm(T z(-hG^Rn6gC$4$MWlD@iF_edn$2Qwcq<+HpBe?*`uYtTuD>kG{~iX1d}0%gR#54o(0 z%>7#L@i`?o#Y|zP5s^WahKcPQuN{7@8jLxjPtbx}9#|}?rmO8w3D%LCAFmnvxd{I+ zjKqH**O~c^1$5a^N|{y%J#h))Z;FQ<`=895{(UdX_8oZQCg~xLM6S z$KHJYv9>Pcd!K?b7M<$+ywZEly4N*#Su~;-TRB?3$MN@L)4!6ugGQ&LjH^&vklPvl z#h~z8@Xz4sM@~5z)z7QaDYlcj|7i1iG>BI^JbnW6^9Le-HKVuU-r_Ni-WmaLn12<5 zkB0nVKJyWpjyi3wP<*OgcfHHpFviqY(sL8@sSZI5t#Z(?Y8afmjA^!`Yo1JFO0u;n z$^z}&2D9mkHMa1Fl?C{Ur3vn&iLGRZZ`2~NGThGaOFbMfmaO*0OI7Y@$(b^a5_g=p zc#)5u*4r47-+FFT0u^=AZl_1>JzNgNUt*b_cT4)QOCtsG2zkyj?mDyrIY$m?iq6e; zUtwLq_rti0xTIjDt0L8(O2*{O;=GGiE;yH)^@3s32cIG&_cUFZpBUWP0eh&dG#(u^ z8agOVFYBLoTHBFWA9F1R^gMBN4NXcnX=WxWyskrlZCzmx2`z*JAqzih7?d=wM!K@m z&QEaSj#xbOBaeM=MXr3FawHymkaU8VRz~Ka0y7@;8uh*Aa3)Cc?)}@}o4bIOPx>Gc znq-@neCpy;qg&Hc!(g|5!;OkkUx0U;I;OORlj;xQ+pYNP60?I12VKs_sA+af{^0ac zx8wb737k|5yxcMsN!Y{S0nkVd#}coijG%-B^oFe$+OpMj#LL(1wD<)O+;E4m)Tr9r zetPdtst-Atb;vRRBa;h;O;Hk@g9~S9W{NBwEA-UbFpSEerRFQnR*-EbD+bmEabI*% zFHDz=z<0G}l*=o@NjH3f9pCSRX6Qe_f-ijy64$8->x=_rLlzhCAGDOItmbM<{w_W4 z1NG%mrt<+`rY`Kl4l5NbFm#-^GXS=Pf_5hGMoC!nNt=~XcwtNbE4s+i zWDQrOFYciB&@TLe{MOz00|_r=HFc&LIxU~>A|xW#O7Bitor|nzIq^WK4+RINDxoOroCpd`# zFUK>F$nHlIfBgND92nUOItq3{7aQ4?#f5>>QfmB^_NLZJHo_$_>%vuIuf;yt#uW5} zK6r5F@|1u^1la&Kh9gn4v1W)yScKcpH062mn?P&m!BNvXz;MALSji1(jDJS*(sHh} zV;G|Js|-l%UpkTIZMZ|m?kOv7@GuhR0Be&r1Mc~^{qGYy5sWrjp(zS_65oEH`tIAH z7zLm?MWL$y^*J`&8gr~oEe%#&nWNyd-ou?`RDetSg`7UhM4yL zue+Z^DkrMe#Bv+H-c_HZ+M=7O`y1ZYr6!i8_-F@)5ByFN!tBxg{AYG}O_ zY?J8(Z-N$de{`-Rx!mXLZOseubFRzi?=&oJA~n*>V2!PH!4P6N!*3i^fS^pSSh*@3;*aX0Yy zhQ&1@H?8_2}0EjP1#*di|;@C-}|qQf2@Qme-p~ z_RfmVW~;s>H>)7pN7wOON1$~c?dmCuu?+ru)D+mp)jA zZKx^Iv9vq?d;1xIA(KW=oI_#wpy4<8{?9g1AZ`S^P%%;Xut-#O{FsTKz zi+cP5z_)JPNB~urmPUVw>Q_eaHb`4pA{_CaE?BTH1{TP{^eUS>kUjU$&j~nx{E))5 zBpZhDG)=&;Wd?j=oI8gW)jb=Lcj*Tf%vQ79-4%-qMGtEjcRe#h{ThOEHNY%2U0si@ zMorm^B(8!(n*VIqSoYZbQh|erDfvq)1f_{?lu{Sowh29o(8iA41;iXGt<-2QUh7e)|N@LbXoUx)@cVw?P6P`;A|6^wsrGhB1V(bUoxD zY)t!IVD83s^(2$dxe)HunpD|B_)lx?v6g??u8?zl@crF{NTZl&STai;TnZXBK{%#Z zIiLs>VtA|;a$>9>lZhcdpZ49WIDYu}9;>Vzngr{RR~F6cq#!f|$CGS`jqQjLCl@(a z_)VRapJ;fO%7QA;`knl!ej0mdC!hSf=%w}xml$BzEK5_hp+?c(6Pt_7K*oi09f^~V z*4;SK2p^|nU`K)B_if|-(i0!k(IzvItc?*l(`8*Od>d>!RrLEVuwC*p$a;SuG4QXr zm7^5VNxN3~en+bVUj`KtK504>HVxtN^5wk-wzs}FMna-T=*=fENx<0D06{O#A$O{yAh}dX*a*`)HS+t`FW0 zyIZ?oGm1~t6;-kHca3vL-tSr0K5X=KcUNxo9CT*PZ!q4!M(e%GwGgRFoH(~{~thkDf=Ex*&A zW~{u1&i zEqlYjWBK`B4=^Z^G6?@G(pv5v`6yW#v6lgL<%$q^xTROI&x^HUmoJ(|W(7NhAQpLnGHcz6d%@ zpQcaIkcPVuq!}0EA3b0Ep>Mm0`$_<;7G`~`7gjZnFpQi6;wo>72;Gfa_NE{(a54io z>h>8<{)iOnX5RSg?m;3kXbO;Z0MXL_Wu2?Dn*DSWQkw784mR9c+dfj&siEIt<2b%X z2dhD=1zMMMDlN4+GDjKg28502hEgn)(K4rAc?m5@g@)7^GI)82?V+IFO=yONr#J^m zUK8}yJ$6gjL-z?waTnM3>8wa-fOvQ2SyR#TAXNv>6CG zXECAha(iu|WP+Q>cwwt4i!+*Tzyk;^Ily?&rMf?mNvCdxF%c1+K{m$4ni*76gbYN4 z$P@9$&FuM%YDby~GIM8NTzF7|dNw7&J3q7I&Cho2vD^JAgAd+OMiHj?8%42#75<5~ z-6jTxwLa&-qd$j!60J9-fhqB&w_fbf$e%Q?c6~Ur6R{KXlV9S?FODxIWz=qF8UsPz zr7k=VGp>la_H7@fJrmPM7%8KA_OrNr_x2lNLqylJ?zqYIm~^)gUJAlnq>tH`oHBXe zE;d=q6&ndQd>X)6E(*9%m`(iz_UPxs4{WYD^{EFqxK0i~t-~7Wd3|2RJ?&r#=k%1u zc1CS}D=}|I!9mLA`r>5sopE}}W$PCjrv^!2n-IUi%669@@wZY(06S@+9_#QB*gKDq z4$M*w35F~!m<;$eenMce07xvDiDZc(wHb_=6Bu*D+Mj zq0zjs+^UK}X=v&`>iY2{34ulvt83f5`2gH=-lH2Kp){u~nyC@Zl0*=mu>Zn*zg4?b zO{!{uq!ld)uI!WHkE!(>dI7)Sg0==+;Wq~(#*`boBhqz0MoE&X7qeb66vK%)nuO^J zi3k&EoCMSnt}Q_G^4X3@H>vS*R1oyXqG|OC;!80o*K)A>j&@Wu>;>eJ%vXO8MGtW3 zK{QsMPvKi&v%oLze`Axn;U~if#Iv-{U4hk9Z1wDNY4h26k(LXs7j>_En8uHL5;JJ0 zp^T%=)DOTF6AK!Eq!@*b)K*Olw?CI5kCc7w+vVXoeTEKWJ{R-&FH`Gde8$hY?etyl)%8ubHyD!`t_PSfZuIr8aeO30YPji~*Ql1rC2 z?xGv7;2uMTkymM5ffTh#@63Q=-@J!abmOkpZfp0ZlD!3V$-VUlT5n3WKk=3SkSB3Y z4O?ip5Zhb~?goT#gMwpB%Fg3Jc4itBdaj((S*KqBa&%6{ZQ>woZB@Mqh_%ucB1=Vz~OLW5%7_) z(ZZ`><&zl(6uTf6KP|6y6cJI8n&x9Ts1AR!owUULGv>y#VTf+lnykwA*}B71tb+); zo2A80A8-OCeJ@|M-$X_*^TE(e5EIqsW?61Sln54bXlMNMSj#{Tg?)yZE7RUdhW_Wt zPS53w*6|z&a;?3!^~H~B`zmMoVpVt(e|?sCB7H;+aWkJr&qK9jkniYAHFae*lItL;&YTXJzNp%*%LE~oC4AIAcIOld zIG}$8KG)HW&(RK*e;_Fw{}K5pwtcmzw;DKI!dk?WuUtmDx7;xaz5EriwT_-e8BHM1 zfICWZ6oG~5rINH;=E`0`B9PJ|q*!X@(`v*C*56pLTf`x5WHEySb>7gG$JJOwWTbmQ z8r1@&$(XLFpl4tHpVl^G)D7MBpFvMsGWU$a_yQ@vq~KeiU(RE|C8!_%BjPk0! zcT`&Fr?jW*{&O3zvKdnbu;CV-cz#%kaT$w&`^k_4(>{hPiBkg4HtF3U&2p>{s=)47 zZg(SgJm#_|V$g@dlL}fuVauTEx^IMrCO5Za*dUJ0Yn+U4n!k41-o(`50i=bkjSM~M zi8um+atgp81fVthpPSRlcnU{54_kRZ89OS`Y^BhTl+B&j5bnJP!k%od^^qmf3ur&7 zymx8ZzeQIg*76K4T6{6l4hwHJ0a@xv@fn$w%FQto)YBybkWm;5pei$S85W?!DX(ob zv4#I@lVUW_ZKo~`mXhm51%u8|D{YlUZo~lkDVioZR6x(8X;W@?sKP1wvcPj8F#iS( zdjB0hxLJEV+kYmn5~Fn~+2=T6qIZGlo2=B>ci-(@%G=4xyC355fjn@2jZ@(KY5ak> z#zts}RP}9Pf^fVt%Pyg3Bk7ROF4vZ?6mF}rz%npHHBO_NfG)A@348Q01>Eu#pOz^j zyiLEwm+I08y^BGrJukoBxijO}E{q4R{J(=4cX&B;#euF5zDx&s(v~RIePEcO*yB>7 z>4?d)=n_l$pnjA`zT~bZ#3P%hhhq7_;v|=X-$n9W^AWLRqQ_I!O67~63#JNwWXFH? zNJ!8Nu*Bw!fC<2=8e}Ez;0kBHMcZX2JF50@;yRwelT1|#rrOc$Z0%-tJj5Oyjq>K* zl724YE0VYa5GFgbG--)=liKohM<|bk$Vnu^v3AS#94ox!AKQlUaJlU07bmD6p>aSX z12bIKhQr1(gz`zUVGVnN`j%R{NL`%wLnkJ$XV~i*>!d4u6Z_uiRv7aDbcP=P+vpJF z&6+^(Q}FI*D3c8*b3(F8Jz>;6Z=P(?zu}kczQLn1%F&EtwRF!Wln8kR*CKo1w}EYc zkzzo&jpez>W3$RvAA|~N^|{sh?yX&;pr*41Ane| zZm2)qkEv`lPE<9+N4k5jcsVO*Ph!Gx#B>-I6IsDm+W<_InO^7#nVO@9(^4F|;1b1H zBd`+;_iP9M^@mom}!f`Do<*RJ?U)>IXnLD@&5gRg=8rb5N}JRl4-)!Vp2vB{CN4)(}$nh zULXWi;l9EfONdet0L+6rP(vy37Q>^9+vtM~WzgW?G{(t&MlZkbq;Olv6Sb4m-J=%p# z2tYn`7IoQIf_fQzNeJ=^rJEs^f@sVL?_C_vNodwPACt!WHfADmd4smbI@IWSB$@?d z+<9_;n1gZV;*?0n;?iaU3l>HPO>w>d>Db^T8oGS#|IGN6Sh((=R_Qo5Nq%0SvOHt( zH_Dfhdc9$B<8A4Qlz6A7a}uug8BrN0(2wC`VD$D^Ju_!AHs~)6hg4&4cUYwj`40PI z2ORk}VJu6xzeM^pO^Bl7yqf&1G!63g%T%ezAl?1{WgYSiCB8MKXe)+%8?C0n}M2ZPAr~m&O*+E<4TU%a5^ob3h8B_W)&*bvD8`ZPT*kN-n z5hqW9{mls2qJEEBre1@7!$oik3CA&C7{U{sAD|j>Sn4~tCxAhpqDmWkyn;KJ&{`>- zjl0Pq*5t7-edXg%`C`^*i9yApZOuYT4Vq8Z^CFlY%ye+pJ}Tj0V9TQUHJ}T}G~II; z@?>UW>(2tzlZJrzpOWM^58%>}dSJ;871NDTJviu=;lTxvNoK%_0mV;c%c8BCR{ct( zjjNms&#ZJ<#P~mLu%MX(-`PzYqzfap`ZX@lq#g{CC?Vxdle4CA87qq@hR5o@i;o^W z3DWXV#b`Po-H6ezEt|v8F32*DdQ!82aH|7FyEUB~(6hvzn4h>fB%?USt=CL-^>O*~ zTWwO}8RRSk+4&0$(Vh;YvNP*fSRxKA{#YWq<@08sj7|>r2Kh%(MBiuApD%rmTz?tl ziy1X1(4+|~s!nd-K}Jil@`D{+YYillKI8r`J6wwsYMEzt$YeEvg;jGK$(4tS=E<%(3% zzd!ZrwMaDC2sc_tt)RJn_7!O-twxe(D!M8+mIQ5o_W#c2ZYlj7=N&z-yLv)Yb)Vn| z8AM34u4i+9l*Lwpj`-*(l`v}{f3eki)VCl$t#a0RtZxQNJ1di_fX2GEE(i#@GQ|B$ zpv?MC#8)K*WdTP2)Nlf9U}MxbZn}!EmQW$-Lh=UmlEc}v>00XXI@9rn_Yhv6majGh z^A5WQ%WO3+AXHG}=+a*a^y^5C25eHFs<{34dsvB_z|*(W*{j3j@E+J=2jy z8b^E!E04k*M!Ji2k+ChNH#EJ}j@8_5{gRiy&o1DYXB!8v9qTYa5fm`&qdwgm@Wq#z#z42 zGkJg10GQkEwj`?immmRG>6{o&FNwlRjd`GZYk(uB!GX5#E0(aCnQs>L#SjiFo4NPl zb3JW9!gCit`<53O^RC^~>MNXB{0CCu4qw+ps{Vnzy!W?IHHYKVUbzck1s|T@kRqPt zLxOYZH81$v@ET&?m%}lrt+dM*bBp!G>dG(6o%lfu&9QRPmy)VnPU^IJy&F8)4TN>6 z0E-8C`?|7@WW3tdN|=Nm8E$jV{Lmp_(9B5#uyJNeIQb0Fapkx;=6Jjq+ z_W-dP4QGV_hZEnj#DZF0JXrUiD-M*Ui-7U-I#u%cqlUp1)QIn}gV+atZ;k17r!`m@ zY@Y%=lzOz;#*Rzl!MD+O#fLpJn8~btql{x@_ViTO6R{mpvbtO6dA*|!NkTvw^?&li zMly=XeXE-?Gc66deE=eeD1VmQrYwBFcT8&Q_#SJXHx(|hdSg+cTZL}SMacVq z>F3_34?4o?ukuaNgVJ;k{3w1HG5(-u-5aU^6d#WK=ZZ&b8`F8+mSU^>CyT zXsR;2Un_n(vLI2aI~+4s-5POx<_8~crwfPP+t3Drv9vH!kj0PXBc2wruN!zOXGb$~ z0uesMTeDGLTN@WF+OXt5kPGgxg{v^J#SHH0vc$KT1#^*uCK{IHPWY6_x0u|m@XvYo7pAK*DR~a`sPOO>!)EP3q)|8NYa~pImXCR#OB(eg;Zmd z)!RKo54pd{_F-<07LI7X_FFOG=)B4&`5D=^m7g{HLh$j11xz=;Br$X__^_Pm>`(pm zA$WvK;&bW+zgCEEck7D0&YQKWija4~9cDWTlfQ5u=i}kKXKSXIaaQesmuT>LRiwOI z!SF0j1?`B5H8m{ia&?fG6?3y^8;NZhKeo7BzW5_^5)oT#Y_trMJ|G>Po!}~b^ePOAgje;r3Ku>c6X767P`kq#j*w?R z7uGZlfGY4K)4AASmWFbcolK9)tbi+mR(@R}2T4tb;X=n|h)MP-#mLV88N#;4PUTfrM2xfE&Kq%Pb#cLm_- zu?C0w5Px&V=D&W!U?P<)oE<_5#ZKY{$wy^6_M^)8bfKF<$a73KXY|@|7VEfd7<^vH z32+3pdYe$>!u*^EAFF@SczjjZDuZm;Oy%EuYm;vLcs{5`a+C8xF(WZVz2RM}Rr2bL zL#e3zo&7>c-X6t=w-X$wKf4Crex6}wFqCi`|N8nGCfwskHNCtI#_*ZqHj&tkR|=Xr~LwDwtPdiD8wtFSegi-gmLf7u%LG{FmsKXE|3d`uvdA zTj8`|hSbF4vrkT}I<6zbA|Q-P3WjmSuu(8JqHlvP&i*qKhsX(ZA}3Qh$YD*Oj`-D{ zTH~C0tJDwi97Yn|#rN@3q^Hq!JC&OS8>7v3HbPoB`8VbhFW@O4J9FM=dF?Z*8Buu! z7bAUvk;)laCb|d4e)~22jpD95otrh0aR8;rI8r{KNLU_rEhciA=C;^`L|Tp*Ai zAcn2GsZ}&Rak^r46&Cwc6RRS60dB@}WJ%IY+t6R_qPJwBa@ANY_HA31OAp76!k#Sx zgO81xK%QISr9YXkF$|f)(xr>nKdzI%MK3KNax*Hrn@%cqvJQ%V=Ifh^Sz12&m{BJ( zNOPdGBSi+__VCfMtG>&#@rD%_;ybWvU+x25R#q5}SfC-_j}io_zY+zZ;!^#y5t7j{ z2TvUy*h7XhgmCozG@hwq+-nTuW^U{AA!x?Cm`l_CrXX*}p396wD$@_M2GXGvj*#U^ zY|QHRtnu87_pFLdABN!8=L-BQq@S8rpVq^R!TmoKK|Ivh`!!qSJk95P(~mNQis-_L zk5Ewj3i{^YGs?frPQ)Fz=X7?u(iLBxeY2Yp(1w1GNrMwpaAe~vYTsB#YAY!-b;?pt z!`R=-YOys0m@W+FebbkqmVl3Nv-j7kcEpBCpHt64lYZWfotD~Zp(T)RVkvX4>y+(m zqz6hDm6cLOVc))feYtywV>6X5i1ek|(e3T=$Lvj%oWzcT3uJ2F-S(O&=F3 zU%l*D2fY1gvNn8Fss;8Hv2yp5J^%GNot~|SXJUMFc8r^k>7#F%Db*gvei|c;)s*ue zy$~5Z9M!`C5>tmbn$eqFAeD!+232AW5OaOB&12Ge@j}x_{Zgyi+;!MHE!xL9J>;(n zCo?4fR+D;^`oZ}a>Ol!FXz)K8s(jPBS{O0nCpe_8=HhA=FFSFg`Xf94`7B-&)5lVm z(oYO#oVH)*?|UI%QGA~Jo}vB7wWqx6xD`>ls*ac9%uIo`jw;a13sd8V3eo7SP)p%;TfdF!L zUWewzdX)kk1}t>`@le!B=T6V$l61rXt$`8R5)!djpBaI?5&t+u8ZeaSn8zP-PW+A?wm5#aR>1S`6?vA) zF0cKsd7n4(Z_tV`fGhwL|F8)c@M-?XxJq5YT)yW8pGgV|Qoe1TsV$Ob`}Vz(5}|t{ z=Ue{oCJ^J7tdgK7!yjgc-JbTES9pi%vLm+7+>79uAQk-UR{Ud};D218TqW=fqWM!NhUQ(*f+8eF6d#rONf2P=kxmNPl(6<<9XALs=54mKyjJ!qG<8)9B zm+tQ+Y9a5xzJR|z9X!Q$DP^pUQwi~Bhn1}%Bl#WsumNo^o~j(S(OB0Xh; zef@ZM1`ej+X7=idkB(S;&V0e5|3QekH0-j-kI%`|8TYLkpJTT+Izv1%PdOWriD6oH zd&4fZE@7vnqX(WBr?foF9KgX&o5&1EIbV=<>nMmGqk*f11VKJT@JgL2A~3gN7}BrUah*VSs3cUh=P% zqKoS89X}7Pq0BbjcdT%FGLm}U8xT8#1?siE=R%Ep%pIq^?W*X)48xFVH)*H$bJxyE z%>cdN(wJWshO2^JM9S*VSti3y)1C#)%?fdDTPyPt#FxUf^|V9+(`?2g-yLjs81z#V z+rS$%8{e^xhQPjXm@_jf&vWNS`?c%o5z`okOg}g4mG>a|u zS+@;{&{9SdQe(n^df1KwgeSC^8Csu_pQy3NYd1nRrZ%UV)J8bec-~(dW;;9pp7pl% zl6ysc?NfWDSwYCG4cbCIq4;3~>#%U7a>7dnLIKDe|Ga09? zd+I5Y@PL#-wl5=^$=g%lgsMSTsNv2_G5jKCj{2BwZVtf-mq`-lj# zUk+j)&HTdI7~$kNDV3FZ%un5-27B#?aH7zo+z?A(8mvSx_+kLP9$f-`n7mcZCxE3b;c3dF0TtQ=4qAO_TD&km|^@ z8(xwKDE8iUN7XaN8o*PK3LsR=q!34P4v|E7v#IdmE_&k;_g`m!ln${@MbVP-Xh|J_ zDWbdYWPzvn%t5YS?6QkXTOewq0?6&Z(o*TF@X1=`7T4Mj)(&TDpvbF7K{6e?7!(4a zilr#>`6Op$)Z0=|$s}V3s7oG8f!DY>OgqtrM+kI<-xB4YqJ|H zHUMA~)1J#~yjC_UzffI;w5<*;z139v!E$Ap!8c2tA#cSao{#-C>LpLIY#~?7U@?D# z#0OwS!VSgqfQD`q&$Go42~m7?L71Vfapwi)5=fa>6wC;w9pI63_i9_l7N5vcBYp8t-lz zlw}M;U;fEk$md&%YRB{SwE)Z&^|NFE%h1-9`$Q!o<_9DtOrwJc$O8w#r{MitIaU*W zSCUS$Y?9O5=gZb1d58)Gi8mKMfZ|nRS{kHl?&y@?kn@yj_lEog8f4MW1y(FjKNmw& zL^PKQC3-e5|H*ZJeG5sGK$3V%U~DvuR2bvwjw|8HU7m)9rlx1ju_r*x_%|_WY5Mz# zB|1JQMs(}L*e)iR=Guzr(mu4F0bliBcpiof%v&g&ego;pkZmts!F9lp!P91Kb zEi6LtXau`zo?p63rJ}@ion~=cso(Ld3duHdz5Xm-f`GhsAYEU>DNIww>C9!m}Q|r@itQx z0>BI-?ziyOk~&gniv&O0OVOel57o4hn4|ThDQRQ&C<9Q#!>Fwx_FqE_>egXbvNM*V z*&~%eYtq?aC;n}d{GY^J{%7!+|F2`&=f@hE)-hQ{Wub>Sp}RUf{}Cvk0Kbev|37i@ zzn2jlPuemsfbW_A%V=(x?Z*Gm)k>6sh_i|+D4Ok{jid!fgVOwpP4)!Le(!;I1zhv+ zYsTOD-t;$1nk&BgTVGxY&sej#y1KC-8Q!4+O*-g)3ImB8X9Cw!J%~Il>e|5XT{+*&N<2 zBe4A?oZO&cPEq$!*yx@L>E{w6Kc@bfWL{~NTjllHr;CsUVX$Y+Q-9>VOLgr#(nw)` z!8@%eCWyvYdXt(a61K@9X{Pgjx7FT#pY^Hy}i zH0|Yd6|z>HurwP}e^csJy+JYd>kqvhOitr**!{#U{m5yDALboE)3A_sl;E>+(bl4p z{Lw5jq63@gewE3KhK0}}jHiuc#qd(kEdOcIQ_LDnJp4SO=@Gt+VJZK4aj^K_*y0NN zKBNWDKaV$0_yze{%am$84f#6P4M_qd=>QcmVOQlP2Ju8*)uRw5AQgQiu>FFE%9*MY zlfVNOs-Yn90hTsBfmB{sZ6=gK#@{7Zv_V6&wYQ~@XkU-h0yo@!7<)}^fOjU7+k`n0 zdIMZ%{4c9TkYBODQ@`T>SYV1LTihR&5ChEY-ExNI8>c2G(7?e?0zSNTxPuK4+6 z)X{Vh3(f+FBXXj-r2G!(eF7kiuxOM8z=UCj7)7dO>)niits68ChZ}Iu3CyKuy?LTpygED9 zLR=(}gn$TKMTvZUX<8-1S^dw<jB4mpVm$MMWLMED!?RLdLeWD^4C~@lAOI9m=0xo*pl`6RhQ;&J zq8DHsz%^x!;&{XTS(nNT)4nE7l4MOa*|fe4v(e9z>xiW&ihA>CZTv@Xv6+{V9#Ny! zUa?^Q&3Z+Ov0>%aZn0NU5O2sCM3YqGjlifTtxLl&MRd0YYJ9^a2t9NhwQf5LAQPt6 zGpr#si%*018V$?8ASU?P_WL4n0<{&cb)6hg-3zbzYHJ{oUoMpqH00dLoh1e*iMV>J z!Z>x~Gp9bVeJhm|=4VeX4QLjZ5Gk@(9$F+#is@F2~JT>&bT0i?T9ToB1 zt-E@3>Ti$_xg=(IrakQDb9D!_oYgm6hVz@&hG&XtK&lL~ z$-le5id}&-K|o$;!uD_5(GS0q^Z&~mOkSYdbJg-0YO!STKv&b#KOmF4i*96m{`>j$ zGe(bH)=es_z5!gtN;bYHt$36m8VN;)+nNBjK+1)#rKMVXAm8JDJLY4TB`pNLW|xbM zm3_2zIWqVlz`Vdoy(o>o=LAq2XTnqdGZcchRG~mNDSS|bWK~d#PXoa*SUA25@ySgZ zzNi)^bldHVR(5eb?zvWW*j4klb>_ikLT;c$eHGk&l=5BG*}`m+j^Ksx#dQmzMFFw% zJo-8(b`rhK{l*xRS0JVqCl-t3_4eNr!!)E8z~K_LSf?rYU(jEuXqJFVMQ2ex`)K11 zr3z?fXmo^rZ-&3~`j!s(jxqg@7R`Q(PvW7_;7OvAb^I4=O?0(ob8usE z$=#CXGAs&#N^gv(N${|;^7NKHSEu?p@vSlW_=tn{jc6jApN815Q;D}Yzz2PST2b}pgr~+0Tkb6fYJACm~`mXj{Eg>tV+XAWni<;17 z@OTdKmkRY7oZ^E$0R;Lp42#Hhz1xm-?C*9dsq-9zUQQn^J;!|#%n*(l$f|;bw8g+l zn)&QxOoz#XD)5c%y&ia*(DEZMY5?z|&iQ>(DERNXG=6Yr-Nx=3t%5g#`njuXx)-)i7pJ9!+BccV zsh{suCjb)ECIFXqkvE*@e0904?%R`Bx2H)u;1CxuKXLSphiA7$*<3KeD+g*a-9~Tc zmdeDm7>`G>PSB4hqqh`47>mAVgCAh9a1KP1E*2qdbk0Lxqg|67vA4p$YcQ_bZd2tI z?0LB36@d~)GpzF32YO1+y@2+kOSOhL=X*i7H?3?U3KL=;dn7wpNZ||xr~26!qI}FF zt0uJel#iL-sh*w*lkk^&uoI`*zF6SG#_}$-e;(V*oHt+lzN*7_m;H|t)ug)J+~^?> zOiJ(4Y5gfTH|ZnlX|Vl>Dv#~>z%8J7ygX&U$10L?;d`H3^+Q?1m%_I)c|QR0Fb7P2 z$a{)45iI5n=^72-yKqOzJJOxwJBAmCjJAlT8_J5~kwfk2R|=}mx~gFxTemIqCcm%Z zL3%@Sj@c&y27m@Kp=|(SDlkjxFJ|L6w&uVawu&S=`vAzwG>U4nmPf{06VJ^<3zPfqq#rD^PH>Qa_O+>u zss!*UtfsMV10=bQxDjx6BC|qSQ5<5k8k`IDdJj6N=(n8KQW)keo9|>)(wiHNXvgWN zRl{KB`D+%%m)h5CUPbRA} zPN?k|V6wcD7c1lL6TSOJIIXH6lk>+FrwN2w!ef`cg3Sv%T8{ZP%g#z5%&Eh?P>1r$ zL9U0mEc4B?HjO_gq#k$`lqzeSrK&S0Lk=ySGym{#A9rDQTerEUx3BvMOVAo6ReMZ8 zwV%{pZ-)v_TGKV+`X1|uzsjGw`gx7Q-NadqzS;Vuqt|A_u3U;|$2XJ53jCrdz=Q-r z8=arP2OFYh*mTaNmU-M3Fe()`HW;t1oRPa}ioMQpYfFa%H@ene*02pxj(?Rj@%42m zrWfREVi)ukeV3s8&ef;ab)v5}Owlt(8Pc<#-+B-XO8GZ8^5g$2=;{CN|IqH)aXkJK zT2lz??Y2tKt=4oo!d*9N0+rn|bMR_79P)#r(W5m8emC)_V%JyKbwm@OziuDY9gZe{ zZM+XwUAI%!j)8qVwj+u`y9b7}-=XZFeuinb+#l(VIH(IInCGskfAF!>pPTmSdk>oq zUB~xtsdnO(K>>nW4Q3-_#>(&VYOdZ!ziK`K`j&qM{YQ|%r+glZXBzz+0E1vf8+jWX zU8Dx!!qK1_-l_b@&*&f4KwQ>kU{fF|0`@wBH!Ut{%Eopq7iMcp9~u7rm1MrwYFlvR z7Z7<(oBD@8fQoML=*n&p^WQk6BT^baux0q=l~73?21J`?FKr?Z$}(EGk4!Yd$1nbh6m8FNvEWJy=_d5ANYj)Afg!3Rbv}6|Ls%dnB{gR zZ@AtD{)}6r!~3K@uzZMA3vc-Q)ymFd!RxHvkYr3V>}i>c8B1U|Fl2svqMWs=2UNu? zmNFD#U2_jY@pTYISOEE^>qJav(Y+x^j-4FY?ME)h6N0wELB>K=^Ks>4UmarzI1sFg zyuRT3g=g48Fv$%gmcC2!qL%0m@*e)doZYf~#c-jShUOV6C0va*`|=UPMyaCqSS0;X zZtI+|pB|>>1!$QPv?NC+W^N}}>5tI~gTOT0X}!}tFm>&=M}9sI=#W}R4IXK{L>mNS zxg%}q08$wT{|xU&@gQ4($;hTzViL#Y1pqf%%4^YIxHE#zjRA@32RPfR|3rSfvy=Jl z)KV?LQ~@{JY5}DC5sK_8{di{Z0Rf23S-deY-$~nmt2vS;Tx*0k3^^~Z7G_uRK4=vJ z)L#cnstLv9d^W$MI2Hm_m$We5gyH9}EQ8k?LW}1hlLuL~!{e~#CwMV>Ki2?)Z2UvJ zvYwA~Xvc$CjiJeEHy>kIk@2Q8xz+D#+WZh?quy)a<5s2A<(URBmD2w#b^h}&NAn84 zbpVQAbS8R5!0yb0V=YzEpQeJazoacCYA}{G!%&Lcyx(FY+WYccrNv1EtRucLc@Np5 zJ+7kt7KN3hlSXwDf9;*ua>CRw9D&($vdTC-p|kQ@ViDp^@Ci^E@T*cL##2ke#oxc` zG3(%3uHf=F%rHJG05xHK;ki#6oSoHq+K8-9EoJ?1m5jW7#q5~qBE16#Utyf196?5X zd(b;_r*B^8e8w8s>0{~(NMZinf@1OW#{GnLKw8P**EVE+mhaa06Z1MY9e=wGh9N^) z+ymL`Gq>Vrh=-b~yszG?r-PWULjXVbqT%{^}OYcHxqVuzYZr7)#Tn-UwDA)n_kJ4^srMt&<#4KBR zBMvR!v4q#`#GY8F2YF1J^Kr6G=mF7KJJuQ*r~Q{#>|y?xpyQB39rLGcS=FmmNd1+| z+Re8yUl8uRV@LyLmTyqFb*od-=SiIlOc(Zf$e1(h1TPU2hsW~ZK1^C`sKD(>B#0Ay zBH+xLO!kBBN{_Cmr%*7<6jmpmY`E?frhOWZMWzYcTuAB5ZwLXCC|@hz&E5BsAFhcl zlsXSku6wiLs8ub#q3Mx_W3`0abOVMYlE@WdTglqK_D}~SM&qJ;xs0NCHK*dzhHf=e$?$dvuj)LVFUteHRX+aint2f zf(RSTml(9I;AD;QUg=qCKjrgSm5Ybff+K55514Y`WK683x!rl26(8Hn^^MOxF^LE# z?YF7Ho?o(8bDtYi5<>|6hl;HsLD}X3CLK7Czwap0yVrbZ&t+@jBsx7E+V<9jeV=#R z)s7?O$~ggjKaL=^kxt2Jur*N2sARr#oZF&VgGB=*CUsS70UWS$~WA+leer6le@kV!)}v;>Cp6fhGR)` z6xvVx^2y`MONi6T5xBT2r?A_a2*|dBeO-gmJVYQ8=E;QiYB&B|J`ngJ0@?~*V4DKhvLWc#c z(y_aSi3O!6$ z7&$o$|N7gw188A)12bqlpLYr|yt!clkkFq@p zz*NYKel&354!K8d5jCmWoc&M|J_YowK?$tFWtrtTMbf>4XLWz6CN%MGK}u#pzI{h% z-ShQ=NUA>DTREQ25EHIeFj=>cCaux{RQegvjN8r{fm3D-g0gDKTr-D+t^H=a;9Y<) z?06X~ImOng%s608qmK9j1IM3tXBf>hQ>g2{pkPIv2H_{~X;jc=VUEd~{Kx0*-g_pubEjmInr8!Wrdm50L1Emb{1DIoXr*?w8pwrZ>c74AAR9T|F-SI2+Y;GWWC#`v=-b%Kjai zaj7e{HgE8c{T{O;-<@|#8#~OSZ2L#o1gFJfYVPkU)7F7n;xi04f)*I&Kn7EdhFS#L z#vifseX<|Ko8TQn-5_TeNBcK_B{;a2T$JLHQWsKUTQ!+ke(+o^c6i`ZJKmr;mu*r1 zBue4-kJU%EZl+JHyRXKUb(~m?5j$zZ5iJL9Zd4m&I6@`ULl@BFs^O&sc>H^8wV)OcBE062B^DWY9F>Kfw@vh7}M zcfI>XZ3)}*(u)&r*SUji9$wQ^Vxx^vVyI6j0TC?KVnA}_V#A;IiOb#oQe({k>-IEE zkfzJim{k|t7M?71Kp34MG;1na)!x+i5Y;DK)(w;*y`w9u#xSHVH^e@JxVGQQJn1!7 zx8R3~_cJUGmyPTA>ODmWqFDZkqeNCVg*mzbo%K?qG<50O3>_Qwyrj;=2e2ZeP^5T) z!hGeYNZYmJ)4Q3RYg(M)O%peMoFFaWUZ~+)L+W_>irRZ5K$fL}6;>6s1{|c2fQzsu{L09)9rSE{lQ;afo3Z+(UquwdRwT?kH z`#I3+Pj^b;dwv!|>O{=#!9>H5±?{^=@T%UiG4MT1uUIw;)al;yU0FOipMe7(^c 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 diff --git a/Exemple/Content/Textures/Background.png b/Exemple/Content/Textures/Background.png new file mode 100755 index 0000000000000000000000000000000000000000..42ee4f94a908d3e77702cf87273e783053f6715b GIT binary patch literal 13701 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 E058}o3jhEB diff --git a/Exemple/Content/Textures/Boxes/0/bottomLeft.png b/Exemple/Content/Textures/Boxes/0/bottomLeft.png deleted file mode 100755 index 0565eb699b91780a8aaeb95d8af7983948eda6cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^{20#LT=By}Z;C1rt33 zJS^pBf-L-yLJP1y&Ris;^CjcE+_irU1zgP~nuONw{_Q`xz%b2d-QW#T(db8P!;$6MF9){5nC* vMmMSDD|`RGOb4!Q2c&j37kd1+`^7o&>WZU2S%Oo6&Smg)^>bP0l+XkKbdYA) diff --git a/Exemple/Content/Textures/Boxes/0/bottomRight.png b/Exemple/Content/Textures/Boxes/0/bottomRight.png deleted file mode 100755 index f4030d15d02d3a6013bb30c72bb1e2b297a20197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^{20#LT=By}Z;C1rt33 zJN(N6?KbLh*2~7YbR%^2W diff --git a/Exemple/Content/Textures/Boxes/0/centerCenter.png b/Exemple/Content/Textures/Boxes/0/centerCenter.png deleted file mode 100755 index cfff39006c08613b8800dd8a75e8de42f46edec0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^{2jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJcz5oCK diff --git a/Exemple/Content/Textures/Boxes/0/centerLeft.png b/Exemple/Content/Textures/Boxes/0/centerLeft.png deleted file mode 100755 index 09042466ae84a8694b9d679c5bcae0b0fbe07941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^{2jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJk33h!7RK(!v>gTe~ HDWM4f0MRfs diff --git a/Exemple/Content/Textures/Boxes/0/centerRight.png b/Exemple/Content/Textures/Boxes/0/centerRight.png deleted file mode 100755 index 9547c0ab5dbbf00f8ea41aad4f315eff8d4b616a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^{2jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJewsFK0c L)z4*}Q$iB}OlvHa diff --git a/Exemple/Content/Textures/Boxes/0/topCenter.png b/Exemple/Content/Textures/Boxes/0/topCenter.png deleted file mode 100755 index af78ce6e9887b62cf81e3dfd27c32fb0cdccd510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^{2jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ0#LT=By}Z;C1rt33 zJB>Ar}5eCmj@JQsi;54d8hiz#|*TlN!Ln-uKw2#x16lRsY}jXIp;G zcG$sC!O7{9#C3Vbxfh3v?{!RE8CNjPGidu6p5F&r1SSMIX|k?0{cN=&!?XMQEE7_wQ`Fca){<$AJQr=$7D-}Qa wjbTe)tjg`mt;b_y?CcsuWB#?)pFAMCz-Pr#-IsC4fv#onboFyt=akR{0O>Mwj{pDw diff --git a/Exemple/Content/Textures/Boxes/0/topRight.png b/Exemple/Content/Textures/Boxes/0/topRight.png deleted file mode 100755 index e581211d71b2d5635e816ba59d1b9b280be059d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^{20#LT=By}Z;C1rt33 zJR( z+02I=JbDF5OD6d!HEdY4=8 - + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + @@ -85,6 +115,16 @@ PreserveNewest + + + {FF4B3F52-D94E-4F54-A829-C1492B875267} + MyMonoGameAddin + + + + + + \ No newline at end of file diff --git a/Exemple/MainGame.cs b/Exemple/MainGame.cs index 6634476..ab7f1a4 100644 --- a/Exemple/MainGame.cs +++ b/Exemple/MainGame.cs @@ -1,107 +1,123 @@ using System; using MyMonoGameAddin; -using MyMonoGameAddin.UI; -using MyMonoGameAddin.Inputs; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Input; +using System.Diagnostics; namespace Exemple { - /// - /// This is the main type for your game. - /// - public class Game1 : Game + public class MainGame : Game { + enum GameState { Menu, Credit } + GraphicsDeviceManager graphics; SpriteBatch spriteBatch; ResourcesManager resources; - InputsManager inputs = new InputsManager(); + InputsManager inputs; + UIManager ui; - Layout canvas = new Layout(); - Image pointer; + GameState state = GameState.Menu; - const int ScreenWidth = 800; - const int ScreenHeight = 600; + string Github; - public Game1() + public MainGame() { graphics = new GraphicsDeviceManager(this); - graphics.PreferredBackBufferWidth = ScreenWidth; - graphics.PreferredBackBufferHeight = ScreenHeight; - graphics.ApplyChanges(); + + Window.AllowUserResizing = true; + Window.AllowUserResizing = true; + Window.ClientSizeChanged += delegate + { + graphics.PreferredBackBufferWidth = Window.ClientBounds.Width; + graphics.PreferredBackBufferHeight = Window.ClientBounds.Height; + graphics.ApplyChanges(); + }; + Content.RootDirectory = "Content"; + + inputs = new InputsManager(); resources = new ResourcesManager(Content, GraphicsDevice); } - /// - /// Allows the game to perform any initialization it needs to before starting to run. - /// This is where it can query for any required services and load any non-graphic - /// related content. Calling base.Initialize will enumerate through any components - /// and initialize them as well. - /// protected override void Initialize() { + graphics.PreferredBackBufferWidth = 800; + graphics.PreferredBackBufferHeight = 600; + graphics.IsFullScreen = false; + graphics.ApplyChanges(); + + IsMouseVisible = true; + base.Initialize(); } - /// - /// LoadContent will be called once per game and is the place to load - /// all of your content. - /// protected override void LoadContent() { - // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); - //resources.LoadFont("basic"); + resources.LoadFont("Normal"); + resources.LoadFont("Title"); //resources.LoadSound("bip"); resources.LoadTexture("Background"); resources.LoadBox("Button"); - - - BuildCanvas(); - //TODO: use this.Content to load your game content here + ui = new UIManager(spriteBatch, inputs, new Skin(resources.Boxes["Button"], resources.Fonts["Normal"], new Colors(Color.White, Color.LightGray, Color.DarkGray), new Colors(Color.Black, Color.Black, Color.White))); } - /// - /// Allows the game to run logic such as updating the world, - /// checking for collisions, gathering input, and playing audio. - /// - /// Provides a snapshot of timing values. protected override void Update(GameTime gameTime) { inputs.Update(); - // TODO: Add your update logic here + ui.Update(); base.Update(gameTime); } - /// - /// This is called when the game should draw itself. - /// - /// Provides a snapshot of timing values. protected override void Draw(GameTime gameTime) { - pointer.Transform.Position = inputs.Mouse.Position; + graphics.GraphicsDevice.Clear(Color.DarkGray); - graphics.GraphicsDevice.Clear(Color.Black); - - //TODO: Add your drawing code here spriteBatch.Begin(); + ui.Texture(new Rectangle(10, 10, 200, 150), resources.Textures["Background"]); + switch (state) + { + case GameState.Credit: + ui.Box(new Rectangle(200, 100, graphics.PreferredBackBufferWidth - 400, graphics.PreferredBackBufferWidth - 200), new Colors(Color.LightGray, Color.White)); + ui.Label(new Vector(graphics.PreferredBackBufferWidth / 2, graphics.PreferredBackBufferHeight / 4), "By Sheychen", new Colors(Color.Red, Color.OrangeRed), null, UIManager.textAlign.centerCenter); + if (ui.Button(new Rectangle(graphics.PreferredBackBufferWidth / 2 - 100, graphics.PreferredBackBufferHeight / 2 - 100, 200, 40), "My website")) + { + Process.Start("https://sheychen.shost.ca"); + } + if (ui.Button(new Rectangle(graphics.PreferredBackBufferWidth / 2 - 100, graphics.PreferredBackBufferHeight / 2 - 50, 200, 40), "Show on GitHub")) + { + Process.Start("https://github.com/sheychen290/MyMonoGame"); + } + if (ui.Button(new Rectangle(graphics.PreferredBackBufferWidth / 2 - 100, graphics.PreferredBackBufferHeight / 2, 200, 40), "Back")) + { + state = GameState.Menu; + } + break; - canvas.Draw(spriteBatch, new Transform()); - + case GameState.Menu: + ui.Label(new Vector(graphics.PreferredBackBufferWidth / 2, graphics.PreferredBackBufferHeight / 4), "MyMonoGameAddin", new Colors(Color.Black, Color.Green), resources.Fonts["Title"], UIManager.textAlign.centerCenter); + if (ui.TextField(new Vector(graphics.PreferredBackBufferWidth / 2, graphics.PreferredBackBufferHeight / 2), ref Github, new Colors(Color.White, Color.WhiteSmoke, Color.LightGray), null, UIManager.textAlign.centerCenter, "Search on Github")) + { + Process.Start("https://github.com/search?q=" + Github); + Github = null; + } + if (ui.Button(new Rectangle(graphics.PreferredBackBufferWidth / 2 - 100, graphics.PreferredBackBufferHeight * 3 / 4 + 50, 200, 40), "About", null, new Colors(Color.Black, Color.Green))) + { + state = GameState.Credit; + } + break; + } spriteBatch.End(); base.Draw(gameTime); } - private void BuildCanvas() + protected override void OnExiting(object sender, EventArgs args) { - canvas.Children.Add(new Box(resources.Boxes["Button"], new Vector(10, 10), new Vector(100, 20), Color.White)); - pointer = new Image(resources.Textures["Background"], new Vector(0, 0), new Vector(10, 10), Color.White); - canvas.Children.Add(pointer); + Process.GetCurrentProcess().Kill(); + base.OnExiting(sender, args); } } } diff --git a/Exemple/Program.cs b/Exemple/Program.cs index 1967bdc..95d878a 100644 --- a/Exemple/Program.cs +++ b/Exemple/Program.cs @@ -20,11 +20,11 @@ namespace Exemple static class Program #endif { - private static Game1 game; + private static MainGame game; internal static void RunGame() { - game = new Game1(); + game = new MainGame(); game.Run(); #if !__IOS__ && !__TVOS__ game.Dispose(); diff --git a/License.md b/License.md new file mode 100644 index 0000000..0c375bf --- /dev/null +++ b/License.md @@ -0,0 +1,15 @@ +Copyright (c) 2017, Clement Bois + +Copyright © 2017 Clement Bois +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see \ No newline at end of file diff --git a/MyMonoGameAddin.sln b/MyMonoGameAddin.sln index c992d50..97a804a 100644 --- a/MyMonoGameAddin.sln +++ b/MyMonoGameAddin.sln @@ -3,6 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Exemple", "Exemple\Exemple.csproj", "{9C18BB68-EFE3-4E53-8761-B780F2BA5C52}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyMonoGameAddin", "MyMonoGameAddin\MyMonoGameAddin.csproj", "{FF4B3F52-D94E-4F54-A829-C1492B875267}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 @@ -13,5 +15,9 @@ Global {9C18BB68-EFE3-4E53-8761-B780F2BA5C52}.Debug|x86.Build.0 = Debug|x86 {9C18BB68-EFE3-4E53-8761-B780F2BA5C52}.Release|x86.ActiveCfg = Release|x86 {9C18BB68-EFE3-4E53-8761-B780F2BA5C52}.Release|x86.Build.0 = Release|x86 + {FF4B3F52-D94E-4F54-A829-C1492B875267}.Debug|x86.ActiveCfg = Debug|Any CPU + {FF4B3F52-D94E-4F54-A829-C1492B875267}.Debug|x86.Build.0 = Debug|Any CPU + {FF4B3F52-D94E-4F54-A829-C1492B875267}.Release|x86.ActiveCfg = Release|Any CPU + {FF4B3F52-D94E-4F54-A829-C1492B875267}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/MyMonoGameAddin/BoxTexture.cs b/MyMonoGameAddin/BoxTexture.cs index e6a097a..34d303a 100644 --- a/MyMonoGameAddin/BoxTexture.cs +++ b/MyMonoGameAddin/BoxTexture.cs @@ -4,8 +4,124 @@ using Microsoft.Xna.Framework.Graphics; namespace MyMonoGameAddin { - public struct BoxSprite + public class BoxTexture { - public + public Texture2D[,] Textures = new Texture2D[3, 3]; + + public Texture2D top_left + { + get + { + return Textures[0, 0]; + } + set + { + Textures[0, 0] = value; + } + } + public Texture2D top_middle + { + get + { + return Textures[0, 1]; + } + set + { + Textures[0, 1] = value; + } + } + public Texture2D top_right + { + get + { + return Textures[0, 2]; + } + set + { + Textures[0, 2] = value; + } + } + public Texture2D middle_left + { + get + { + return Textures[1, 0]; + } + set + { + Textures[1, 0] = value; + } + } + public Texture2D middle_middle + { + get + { + return Textures[1, 1]; + } + set + { + Textures[1, 1] = value; + } + } + public Texture2D middle_right + { + get + { + return Textures[1, 2]; + } + set + { + Textures[1, 2] = value; + } + } + public Texture2D bottom_left + { + get + { + return Textures[2, 0]; + } + set + { + Textures[2, 0] = value; + } + } + public Texture2D bottom_middle + { + get + { + return Textures[2, 1]; + } + set + { + Textures[2, 1] = value; + } + } + public Texture2D bottom_right + { + get + { + return Textures[2, 2]; + } + set + { + Textures[2, 2] = value; + } + } + + public bool IsCorrect() + { + if (Textures.GetLength(0) != 3 || Textures.GetLength(1) != 3) + return false; + + for (int x = 0; x < 3; x++) + { + for (int y = 0; y < 3; y++) + { + if (Textures[x, y] == null) + return false; + } + } + return true; + } } } diff --git a/MyMonoGameAddin/Colors.cs b/MyMonoGameAddin/Colors.cs index bdb30fc..79e41d8 100644 --- a/MyMonoGameAddin/Colors.cs +++ b/MyMonoGameAddin/Colors.cs @@ -1,10 +1,48 @@ -using System; +using Microsoft.Xna.Framework; + namespace MyMonoGameAddin { public class Colors { - public Colors() + public Color Normal; + public Color Hover; + public Color Focus; + + public Colors(Color color) { + Normal = color; + Hover = color; + Focus = color; + } + + public Colors(Color normal, Color hover) + { + Normal = normal; + Hover = hover; + Focus = hover; + } + + public Colors(Color normal, Color hover, Color focus) + { + Normal = normal; + Hover = hover; + Focus = focus; + } + + internal Color Get(UIManager.State status) + { + switch (status) + { + case UIManager.State.Hover: + return Hover; + + case UIManager.State.Focus: + case UIManager.State.Active: + return Focus; + + default: + return Normal; + } } } -} +} \ No newline at end of file diff --git a/MyMonoGameAddin/GUIManager.cs b/MyMonoGameAddin/GUIManager.cs deleted file mode 100644 index 8d16158..0000000 --- a/MyMonoGameAddin/GUIManager.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -namespace MyMonoGameAddin -{ - public class GUIManager - { - public GUIManager() - { - } - } -} diff --git a/MyMonoGameAddin/InputsManager.cs b/MyMonoGameAddin/InputsManager.cs index 6382f51..313a2c4 100644 --- a/MyMonoGameAddin/InputsManager.cs +++ b/MyMonoGameAddin/InputsManager.cs @@ -1,10 +1,185 @@ -using System; +using System.Collections.Generic; +using Input = Microsoft.Xna.Framework.Input; + namespace MyMonoGameAddin { + public enum ButtonState { Released, Pressing, Pressed, Releasing } + public class InputsManager { - public InputsManager() + public MouseManager Mouse; + public KeyboardManager Keyboard; + + public InputsManager(bool mouse = true, bool keyboard = true) { + Mouse = new MouseManager(mouse); + Keyboard = new KeyboardManager(keyboard); + + } + + public void Update() + { + Mouse.Update(); + Keyboard.Update(); + } + } + + public class KeyboardManager + { + public enum SpecialKeys { Control, Alt, Shift, Windows } + + public bool Enable; + + public KeyboardManager(bool enable = true) { Enable = enable; } + + public Input.KeyboardState State { get { return nowKeyboardState; } } + Input.KeyboardState oldKeyboardState; + Input.KeyboardState nowKeyboardState; + + public Input.Keys FirstKey { get { return nowKeyboardState.GetPressedKeys().Length > 0 ? nowKeyboardState.GetPressedKeys()[0] : Input.Keys.None; } } + + public List Keys { get { return nowKeys; } } + List nowKeys = new List(); + List oldKeys = new List(); + + public List PressingKeys { get { return _PressingKeys; } } + List _PressingKeys = new List(); + + public List ReleassingKeys { get { return _ReleassingKeys; } } + List _ReleassingKeys = new List(); + + public void Update() + { + if (Enable) + { + oldKeyboardState = nowKeyboardState; + nowKeyboardState = Input.Keyboard.GetState(); + + oldKeys = nowKeys; + nowKeys = new List(nowKeyboardState.GetPressedKeys()); + + _PressingKeys.Clear(); + foreach (Input.Keys newKey in nowKeys) + { + if (!oldKeys.Contains(newKey)) + _PressingKeys.Add(newKey); + } + + _ReleassingKeys.Clear(); + foreach (Input.Keys oldKey in oldKeys) + { + if (!nowKeys.Contains(oldKey)) + _ReleassingKeys.Add(oldKey); + } + } + } + + public bool IsPressed(Input.Keys key) + { + return nowKeyboardState.IsKeyDown(key); + } + + public bool IsPressed(SpecialKeys key) + { + switch (key) + { + case SpecialKeys.Control: + return IsPressed(Input.Keys.LeftControl) || IsPressed(Input.Keys.RightControl); + + case SpecialKeys.Alt: + return IsPressed(Input.Keys.LeftAlt) || IsPressed(Input.Keys.RightAlt); + + case SpecialKeys.Shift: + return IsPressed(Input.Keys.LeftShift) || IsPressed(Input.Keys.RightShift); + + case SpecialKeys.Windows: + return IsPressed(Input.Keys.LeftWindows) || IsPressed(Input.Keys.RightWindows); + + default: + return false; + } + } + + public ButtonState GetKeyState(Input.Keys key) + { + if (nowKeyboardState.IsKeyDown(key)) + { + if (oldKeyboardState.IsKeyUp(key)) + return ButtonState.Pressing; + + return ButtonState.Pressed; + } + else + { + if (oldKeyboardState.IsKeyDown(key)) + return ButtonState.Releasing; + + return ButtonState.Released; + } + } + } + + public class MouseManager + { + public bool Enable; + + public MouseManager(bool enable = true) { Enable = enable; } + + public Input.MouseState State { get { return nowMouseState; } } + Input.MouseState oldMouseState; + Input.MouseState nowMouseState; + + public Vector Position { get { return new Vector(nowMouseState.X, nowMouseState.Y); } } + public int X { get { return nowMouseState.X; } } + public int Y { get { return nowMouseState.Y; } } + + public bool LeftPressed { get { return nowMouseState.LeftButton == Input.ButtonState.Pressed; } } + public ButtonState LeftState { get { return GetState(nowMouseState.LeftButton, oldMouseState.LeftButton); } } + + public bool RightPressed { get { return nowMouseState.RightButton == Input.ButtonState.Pressed; } } + public ButtonState RightState { get { return GetState(nowMouseState.RightButton, oldMouseState.RightButton); } } + + public bool MiddlePressed { get { return nowMouseState.MiddleButton == Input.ButtonState.Pressed; } } + public ButtonState MiddleState { get { return GetState(nowMouseState.MiddleButton, oldMouseState.MiddleButton); } } + + public int RelativeScroolWheel { get { return nowMouseState.ScrollWheelValue - oldMouseState.ScrollWheelValue; } } + public int AbsoluteScroolWheel { get { return nowMouseState.ScrollWheelValue; } } + + public void Update() + { + if (Enable) + { + oldMouseState = nowMouseState; + nowMouseState = Input.Mouse.GetState(); + } + } + + public void SetPosition(Vector v) + { + SetPositon(v.X, v.Y); + } + + public void SetPositon(int x, int y) + { + Input.Mouse.SetPosition(x, y); + } + + private ButtonState GetState(Input.ButtonState now, Input.ButtonState old) + { + if (now == Input.ButtonState.Pressed) + { + if (old == Input.ButtonState.Released) + return ButtonState.Pressing; + + return ButtonState.Pressed; + } + else + { + if (old == Input.ButtonState.Pressed) + return ButtonState.Releasing; + + return ButtonState.Released; + } } } } diff --git a/MyMonoGameAddin/KeyChar.cs b/MyMonoGameAddin/KeyChar.cs new file mode 100644 index 0000000..72cfa5b --- /dev/null +++ b/MyMonoGameAddin/KeyChar.cs @@ -0,0 +1,212 @@ +using System; +using System.Collections.Generic; +using Microsoft.Xna.Framework.Input; + +namespace MyMonoGameAddin +{ + public static class KeyChar + { + public enum Layout { QWERTY, AZERTY } + + static readonly Dictionary[] Data = new Dictionary[2] + { + new Dictionary() //QWERTY + { + {Keys.OemTilde, new CharPair('`','~')}, + {Keys.D1, new CharPair('1','!')}, + {Keys.D2, new CharPair('2','@')}, + {Keys.D3, new CharPair('3','#')}, + {Keys.D4, new CharPair('4','$')}, + {Keys.D5, new CharPair('5','%')}, + {Keys.D6, new CharPair('6','^')}, + {Keys.D7, new CharPair('7','&')}, + {Keys.D8, new CharPair('8','*')}, + {Keys.D9, new CharPair('9','(')}, + {Keys.D0, new CharPair('0',')')}, + {Keys.OemMinus, new CharPair('-','_')}, + {Keys.OemPlus, new CharPair('=','+')}, + + {Keys.Q, new CharPair('q','Q')}, + {Keys.W, new CharPair('w','W')}, + {Keys.E, new CharPair('e','E')}, + {Keys.R, new CharPair('r','R')}, + {Keys.T, new CharPair('t','T')}, + {Keys.Y, new CharPair('y','Y')}, + {Keys.U, new CharPair('u','U')}, + {Keys.I, new CharPair('i','i')}, + {Keys.O, new CharPair('o','O')}, + {Keys.P, new CharPair('p','P')}, + {Keys.OemOpenBrackets, new CharPair('[','{')}, + {Keys.OemCloseBrackets, new CharPair(']','}')}, + {Keys.OemPipe, new CharPair('\\','|')}, + + {Keys.A, new CharPair('a','A')}, + {Keys.S, new CharPair('s','S')}, + {Keys.D, new CharPair('d','D')}, + {Keys.F, new CharPair('f','F')}, + {Keys.G, new CharPair('g','G')}, + {Keys.H, new CharPair('h','H')}, + {Keys.J, new CharPair('j','J')}, + {Keys.K, new CharPair('k','K')}, + {Keys.L, new CharPair('l','L')}, + {Keys.OemSemicolon, new CharPair(';',':')}, + {Keys.OemQuotes, new CharPair('\'','"')}, + + {Keys.Z, new CharPair('z','Z')}, + {Keys.X, new CharPair('x','X')}, + {Keys.C, new CharPair('c','C')}, + {Keys.V, new CharPair('v','V')}, + {Keys.B, new CharPair('b','B')}, + {Keys.N, new CharPair('n','N')}, + {Keys.M, new CharPair('m','M')}, + {Keys.OemComma, new CharPair(',','<')}, + {Keys.OemPeriod, new CharPair('.','>')}, + {Keys.OemQuestion, new CharPair('/','?')}, + + {Keys.NumPad1, new CharPair('1')}, + {Keys.NumPad2, new CharPair('2')}, + {Keys.NumPad3, new CharPair('3')}, + {Keys.NumPad4, new CharPair('4')}, + {Keys.NumPad5, new CharPair('5')}, + {Keys.NumPad6, new CharPair('6')}, + {Keys.NumPad7, new CharPair('7')}, + {Keys.NumPad8, new CharPair('8')}, + {Keys.NumPad9, new CharPair('9')}, + {Keys.NumPad0, new CharPair('0')}, + {Keys.Add, new CharPair('+')}, + {Keys.Divide, new CharPair('/')}, + {Keys.Multiply, new CharPair('*')}, + {Keys.Subtract, new CharPair('-')}, + {Keys.Decimal, new CharPair('.')}, + + {Keys.Space, new CharPair(' ')} + }, + + new Dictionary() //AZERTY + { + {Keys.OemTilde, new CharPair('²')}, + {Keys.D1, new CharPair('&','1')}, + {Keys.D2, new CharPair('é','2','~')}, + {Keys.D3, new CharPair('"','3','#')}, + {Keys.D4, new CharPair('\'','4','\'')}, + {Keys.D5, new CharPair('(','5','[')}, + {Keys.D6, new CharPair('-','6','|')}, + {Keys.D7, new CharPair('è','7','`')}, + {Keys.D8, new CharPair('_','8','\\')}, + {Keys.D9, new CharPair('ç','9','^')}, + {Keys.D0, new CharPair('à','0','@')}, + {Keys.OemMinus, new CharPair(')','°',']')}, + {Keys.OemPlus, new CharPair('=','+','}')}, + + {Keys.Q, new CharPair('a','A')}, + {Keys.W, new CharPair('z','Z')}, + {Keys.E, new CharPair('e','E')}, + {Keys.R, new CharPair('r','R')}, + {Keys.T, new CharPair('t','T')}, + {Keys.Y, new CharPair('y','Y')}, + {Keys.U, new CharPair('u','U')}, + {Keys.I, new CharPair('i','i')}, + {Keys.O, new CharPair('o','O')}, + {Keys.P, new CharPair('p','P')}, + {Keys.OemOpenBrackets, new CharPair('^','"')}, + {Keys.OemCloseBrackets, new CharPair('$','£','ø')}, + + {Keys.A, new CharPair('q','Q')}, + {Keys.S, new CharPair('s','S')}, + {Keys.D, new CharPair('d','D')}, + {Keys.F, new CharPair('f','F')}, + {Keys.G, new CharPair('g','G')}, + {Keys.H, new CharPair('h','H')}, + {Keys.J, new CharPair('j','J')}, + {Keys.K, new CharPair('k','K')}, + {Keys.L, new CharPair('l','L')}, + {Keys.OemSemicolon, new CharPair('m','M')}, + {Keys.OemQuotes, new CharPair('ù','%')}, + {Keys.OemPipe, new CharPair('*','µ')}, + + {Keys.Z, new CharPair('w','W')}, + {Keys.X, new CharPair('x','X')}, + {Keys.C, new CharPair('c','C')}, + {Keys.V, new CharPair('v','V')}, + {Keys.B, new CharPair('b','B')}, + {Keys.N, new CharPair('n','N')}, + {Keys.M, new CharPair(',','?')}, + {Keys.OemComma, new CharPair(';','.')}, + {Keys.OemPeriod, new CharPair(':','/')}, + {Keys.OemQuestion, new CharPair('!','§')}, + + {Keys.NumPad1, new CharPair('1')}, + {Keys.NumPad2, new CharPair('2')}, + {Keys.NumPad3, new CharPair('3')}, + {Keys.NumPad4, new CharPair('4')}, + {Keys.NumPad5, new CharPair('5')}, + {Keys.NumPad6, new CharPair('6')}, + {Keys.NumPad7, new CharPair('7')}, + {Keys.NumPad8, new CharPair('8')}, + {Keys.NumPad9, new CharPair('9')}, + {Keys.NumPad0, new CharPair('0')}, + {Keys.Add, new CharPair('+')}, + {Keys.Divide, new CharPair('/')}, + {Keys.Multiply, new CharPair('*')}, + {Keys.Subtract, new CharPair('-')}, + {Keys.Decimal, new CharPair('.')}, + + {Keys.Space, new CharPair(' ')} + } + }; + + class CharPair + { + public CharPair(char normalChar, Nullable shiftChar = null, Nullable altChar = null) + { + NormalChar = normalChar; + ShiftChar = shiftChar; + AltChar = altChar; + } + + public char NormalChar; + public Nullable ShiftChar; + public Nullable AltChar; + } + + public static bool KeyToChar(Keys key, bool shitKeyPressed, out Nullable character, Layout layout = Layout.QWERTY, bool altKeyPressed = false) + { + bool result = false; + character = null; + CharPair charPair; + + if (Data[(int)layout].TryGetValue(key, out charPair)) + { + if (shitKeyPressed) + { + if (!altKeyPressed) + { + if (charPair.ShiftChar.HasValue) + { + character = charPair.ShiftChar.Value; + result = true; + } + } + } + else + { + if (altKeyPressed) + { + if (charPair.AltChar.HasValue) + { + character = charPair.AltChar.Value; + result = true; + } + } + else + { + character = charPair.NormalChar; + result = true; + } + } + } + + return result; + } + } +} diff --git a/MyMonoGameAddin/MyMonoGameAddin.csproj b/MyMonoGameAddin/MyMonoGameAddin.csproj index de1addf..51e3705 100644 --- a/MyMonoGameAddin/MyMonoGameAddin.csproj +++ b/MyMonoGameAddin/MyMonoGameAddin.csproj @@ -28,10 +28,21 @@ + + ..\..\..\..\..\..\..\usr\lib\mono\xbuild\MonoGame\v3.0\Assemblies\DesktopGL\MonoGame.Framework.dll + + - + + + + + + + + \ No newline at end of file diff --git a/MyMonoGameAddin/ResourcesManager.cs b/MyMonoGameAddin/ResourcesManager.cs index b7e8924..ef53d6e 100644 --- a/MyMonoGameAddin/ResourcesManager.cs +++ b/MyMonoGameAddin/ResourcesManager.cs @@ -1,10 +1,169 @@ using System; +using System.IO; +using System.Collections.Generic; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Audio; +using Microsoft.Xna.Framework.Graphics; + namespace MyMonoGameAddin { - public class MyClass + public class ResourcesManager { - public MyClass() + public enum KeyMode { path, file } + + public Dictionary Fonts = new Dictionary(); + public Dictionary Textures = new Dictionary(); + public Dictionary Sounds = new Dictionary(); + public Dictionary Boxes = new Dictionary(); + + ContentManager Content; + GraphicsDevice Graphics; + + public ResourcesManager(ContentManager content, GraphicsDevice graphics) { + Content = content; + Graphics = graphics; + } + + public void LoadFont(string assetname, KeyMode keymode = KeyMode.file, bool fullpath = false) + { + string keyname; + if (keymode == KeyMode.file) + { + string[] split = assetname.Split('/'); + keyname = split[split.Length - 1]; + } + else + { + keyname = assetname; + } + LoadFont(keyname, assetname, fullpath); + } + + public void LoadFont(string keyname, string path, bool fullpath = false) + { + Fonts.Add(keyname, Content.Load((fullpath ? "" : "Fonts/") + path)); + } + + public bool TryLoadTextureFile(string keyname, string path) + { + try + { + if (File.Exists(path)) + { + using (FileStream fileStream = new FileStream(path, FileMode.Open)) + { + Textures.Add(keyname, Texture2D.FromStream(Graphics, fileStream)); + } + return true; + } + return false; + } + catch { } + return false; + } + + public void LoadTexture(string assetname, KeyMode keymode = KeyMode.file, bool fullpath = false) + { + string keyname; + if (keymode == KeyMode.file) + { + string[] split = assetname.Split('/'); + keyname = split[split.Length - 1]; + } + else + { + keyname = assetname; + } + LoadTexture(keyname, assetname, fullpath); + } + + public void LoadTexture(string keyname, string path, bool fullpath = false) + { + Textures.Add(keyname, Content.Load((fullpath ? "" : "Textures/") + path)); + } + + public bool TryLoadSoundFile(string keyname, string path) + { + try + { + if (File.Exists(path)) + { + using (FileStream fileStream = new FileStream(path, FileMode.Open)) + { + Sounds.Add(keyname, SoundEffect.FromStream(fileStream)); + } + } + return false; + } + catch { } + return false; + } + + public void LoadSound(string assetname, KeyMode keymode = KeyMode.file, bool fullpath = false) + { + string keyname; + if (keymode == KeyMode.file) + { + string[] split = assetname.Split('/'); + keyname = split[split.Length - 1]; + } + else + { + keyname = assetname; + } + LoadSound(keyname, assetname, fullpath); + } + + public void LoadSound(string keyname, string path, bool fullpath = false) + { + Sounds.Add(keyname, Content.Load((fullpath ? "" : "Sounds/") + path)); + } + + public void LoadBox(string foldername, KeyMode keymode = KeyMode.file, bool textname = false, bool fullpath = false) + { + string keyname; + if (keymode == KeyMode.file) + { + string[] split = foldername.Split('/'); + keyname = split[split.Length - 1]; + } + else + { + keyname = foldername; + } + LoadBox(keyname, foldername, textname, fullpath); + } + + public void LoadBox(string keyname, string path, bool textname = false, bool fullpath = false) + { + BoxTexture box = new BoxTexture(); + string folderpath = (fullpath ? "" : "Textures/Boxes/") + path + "/"; + if (textname) + { + box.top_left = Content.Load(folderpath + "top_left"); + box.top_middle = Content.Load(folderpath + "top_middle"); + box.top_right = Content.Load(folderpath + "top_right"); + box.middle_left = Content.Load(folderpath + "middle_left"); + box.middle_middle = Content.Load(folderpath + "middle_middle"); + box.middle_right = Content.Load(folderpath + "middle_right"); + box.bottom_left = Content.Load(folderpath + "bottom_left"); + box.bottom_middle = Content.Load(folderpath + "bottom_middle"); + box.bottom_right = Content.Load(folderpath + "bottom_right"); + } + else + { + for (int x = 0; x < 3; x++) + { + for (int y = 0; y < 3; y++) + { + box.Textures[x, y] = Content.Load(folderpath + x + "_" + y); //0_0.png + } + } + } + if (!box.IsCorrect()) + throw new Exception("Incorrect Box"); + Boxes.Add(keyname, box); } } } diff --git a/MyMonoGameAddin/Skin.cs b/MyMonoGameAddin/Skin.cs new file mode 100644 index 0000000..5c3552d --- /dev/null +++ b/MyMonoGameAddin/Skin.cs @@ -0,0 +1,22 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace MyMonoGameAddin +{ + public struct Skin + { + public Colors backColors; + public Colors foreColors; + public BoxTexture texture; + public SpriteFont font; + + public Skin(BoxTexture text, SpriteFont fon, Colors back, Colors fore) + { + texture = text; + font = fon; + backColors = back; + foreColors = fore; + } + } +} \ No newline at end of file diff --git a/MyMonoGameAddin/UIManager.cs b/MyMonoGameAddin/UIManager.cs new file mode 100644 index 0000000..6a89494 --- /dev/null +++ b/MyMonoGameAddin/UIManager.cs @@ -0,0 +1,414 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace MyMonoGameAddin +{ + public class UIManager + { + public enum State { Normal, Hover, Focus, Active } + public enum textAlign { topLeft, topCenter, topRight, centerLeft, centerCenter, centerRight, bottomLeft, bottomCenter, bottomRight }; + + SpriteBatch spriteBatch; + InputsManager inputs; + public KeyChar.Layout layout = KeyChar.Layout.QWERTY; + bool moved = false; + + public Vector focus; + + public Skin skin; + + public UIManager(SpriteBatch batch, InputsManager input, Skin defaultSkin) + { + spriteBatch = batch; + inputs = input; + skin = defaultSkin; + } + + public void SetBatch(SpriteBatch batch) + { + spriteBatch = batch; + } + + public void Update() + { + moved = false; + + if (inputs.Mouse.LeftState == ButtonState.Releasing) + { + focus = inputs.Mouse.Position; + } + } + + public void ResetFocus() + { + focus = null; + } + + public State GetState(Rectangle rect) + { + bool contain = rect.Contains(inputs.Mouse.X, inputs.Mouse.Y); + + if (inputs.Mouse.LeftPressed) + return contain ? State.Active : State.Normal; + + if (focus != null) + if (rect.Contains(focus.X, focus.Y)) + return State.Focus; + + return contain ? State.Hover : State.Normal; + } + + Vector GetLabelPos(Vector _pos, textAlign _align, SpriteFont _font, string _text) + { + switch (_align) + { + case textAlign.topLeft: + return new Vector(_pos.X - (int)_font.MeasureString(_text).X, _pos.Y - (int)_font.MeasureString(_text).Y); + + case textAlign.topCenter: + return new Vector(_pos.X - (int)_font.MeasureString(_text).X / 2, _pos.Y - (int)_font.MeasureString(_text).Y); + + case textAlign.topRight: + return new Vector(_pos.X, _pos.Y - (int)_font.MeasureString(_text).Y); + + case textAlign.centerLeft: + return new Vector(_pos.X - (int)_font.MeasureString(_text).X, _pos.Y - (int)_font.MeasureString(_text).Y / 2); + + case textAlign.centerCenter: + return new Vector(_pos.X - (int)_font.MeasureString(_text).X / 2, _pos.Y - (int)_font.MeasureString(_text).Y / 2); + + case textAlign.centerRight: + return new Vector(_pos.X, _pos.Y - (int)_font.MeasureString(_text).Y / 2); + + case textAlign.bottomLeft: + return new Vector(_pos.X - (int)_font.MeasureString(_text).X, _pos.Y); + + case textAlign.bottomCenter: + return new Vector(_pos.X - (int)_font.MeasureString(_text).X / 2, _pos.Y); + + case textAlign.bottomRight: + return new Vector(_pos.X, _pos.Y); + + default: + return new Vector(_pos.X, _pos.Y); + } + } + + Vector GetLabelPos(Rectangle _pos, textAlign _align, SpriteFont _font, string _text) + { + switch (_align) + { + case textAlign.topLeft: + return new Vector(_pos.X, _pos.Y); + + case textAlign.topCenter: + return new Vector(_pos.X + _pos.Width / 2 - (int)_font.MeasureString(_text).X / 2, _pos.Y); + + case textAlign.topRight: + return new Vector(_pos.X + _pos.Width - (int)_font.MeasureString(_text).X, _pos.Y); + + case textAlign.centerLeft: + return new Vector(_pos.X, _pos.Y + _pos.Height / 2 - (int)_font.MeasureString(_text).Y / 2); + + case textAlign.centerCenter: + return new Vector(_pos.X + _pos.Width / 2 - (int)_font.MeasureString(_text).X / 2, _pos.Y + _pos.Height / 2 - (int)_font.MeasureString(_text).Y / 2); + + case textAlign.centerRight: + return new Vector(_pos.X + _pos.Width - (int)_font.MeasureString(_text).X, _pos.Y + _pos.Height / 2 - (int)_font.MeasureString(_text).Y / 2); + + case textAlign.bottomLeft: + return new Vector(_pos.X, _pos.Y + _pos.Height - (int)_font.MeasureString(_text).Y); + + case textAlign.bottomCenter: + return new Vector(_pos.X + _pos.Width / 2 - (int)_font.MeasureString(_text).X / 2, _pos.Y + _pos.Height - (int)_font.MeasureString(_text).Y); + + case textAlign.bottomRight: + return new Vector(_pos.X + _pos.Width - (int)_font.MeasureString(_text).X, _pos.Y + _pos.Height - (int)_font.MeasureString(_text).Y); + + default: + return new Vector(_pos.X, _pos.Y); + } + } + + void Next(Vector next, Rectangle pos) + { + if (next != null) + { + if (focus != null) + { + if (!moved) + { + if (inputs.Keyboard.GetKeyState(Microsoft.Xna.Framework.Input.Keys.Tab) == ButtonState.Pressing) + { + if (GetState(pos) == State.Focus) + { + moved = true; + focus = next; + } + } + } + } + } + } + + public void Texture(Rectangle pos, Texture2D texture, Color color, Vector next = null) + { + Next(next, pos); + spriteBatch.Draw(texture, pos, color); + } + + public void Texture(Rectangle pos, Texture2D texture, Colors color = null, Vector next = null) + { + if (color == null) + color = skin.backColors; + + Texture(pos, texture, color.Get(GetState(pos)), next); + } + + public void Box(Rectangle pos, Color backColor, BoxTexture backSprites = null, Vector next = null) + { + if (backSprites == null) + backSprites = skin.texture; + + Next(next, pos); + int leftWidth = backSprites.top_left.Width; + int rightWidth = backSprites.top_right.Width; + int centerWidth = pos.Width - leftWidth - rightWidth; + + int topHeight = backSprites.top_left.Height; + int bottomHeight = backSprites.bottom_left.Height; + int centerHeight = pos.Height - topHeight - bottomHeight; + + spriteBatch.Draw(backSprites.top_left, new Rectangle(pos.X, pos.Y, leftWidth, topHeight), backColor); + spriteBatch.Draw(backSprites.top_middle, new Rectangle(pos.X + leftWidth, pos.Y, centerWidth, topHeight), backColor); + spriteBatch.Draw(backSprites.top_right, new Rectangle(pos.X + pos.Width - rightWidth, pos.Y, rightWidth, topHeight), backColor); + spriteBatch.Draw(backSprites.middle_left, new Rectangle(pos.X, pos.Y + topHeight, leftWidth, centerHeight), backColor); + spriteBatch.Draw(backSprites.middle_middle, new Rectangle(pos.X + leftWidth, pos.Y + topHeight, centerWidth, centerHeight), backColor); + spriteBatch.Draw(backSprites.middle_right, new Rectangle(pos.X + pos.Width - rightWidth, pos.Y + topHeight, rightWidth, centerHeight), backColor); + spriteBatch.Draw(backSprites.bottom_left, new Rectangle(pos.X, pos.Y + pos.Height - bottomHeight, leftWidth, bottomHeight), backColor); + spriteBatch.Draw(backSprites.bottom_middle, new Rectangle(pos.X + leftWidth, pos.Y + pos.Height - bottomHeight, centerWidth, bottomHeight), backColor); + spriteBatch.Draw(backSprites.bottom_right, new Rectangle(pos.X + pos.Width - rightWidth, pos.Y + pos.Height - bottomHeight, rightWidth, bottomHeight), backColor); + } + + public void Box(Rectangle pos, Colors backColor = null, BoxTexture backSprites = null, Vector next = null) + { + if (backColor == null) + backColor = skin.backColors; + + Box(pos, backColor.Get(GetState(pos)), backSprites, next); + } + + public void Label(Rectangle pos, string text, Color color, SpriteFont font = null, textAlign align = textAlign.centerCenter, Vector next = null) + { + if (font == null) + font = skin.font; + + Next(next, pos); + Vector v = GetLabelPos(pos, align, font, text); + spriteBatch.DrawString(font, text, new Vector2(v.X, v.Y), color); + } + + public void Label(Rectangle pos, string text, Colors colors = null, SpriteFont font = null, textAlign align = textAlign.centerCenter, Vector next = null) + { + if (colors == null) + colors = skin.foreColors; + + Label(pos, text, colors.Get(GetState(pos)), font, align, next); + } + + public void Label(Vector vector, string text, Color color, SpriteFont font = null, textAlign align = textAlign.bottomRight, Vector next = null) + { + if (font == null) + font = skin.font; + + Vector v = GetLabelPos(vector, align, font, text); + + if (next != null) + Next(next, new Rectangle(v.X, v.Y, (int)font.MeasureString(text).X, (int)font.MeasureString(text).Y)); + + spriteBatch.DrawString(font, text, new Vector2(v.X, v.Y), color); + } + + public void Label(Vector vector, string text, Colors colors = null, SpriteFont font = null, textAlign align = textAlign.bottomRight, Vector next = null) + { + if (colors == null) + colors = skin.foreColors; + + if (font == null) + font = skin.font; + + Vector v = GetLabelPos(vector, align, font, text); + + if (next != null) + Next(next, new Rectangle(v.X, v.Y, (int)font.MeasureString(text).X, (int)font.MeasureString(text).Y)); + + spriteBatch.DrawString(font, text, new Vector2(v.X, v.Y), colors.Get(GetState(new Rectangle(v.X, v.Y, (int)font.MeasureString(text).X, (int)font.MeasureString(text).Y)))); + } + + bool Button(State state) + { + switch (state) + { + case State.Active: + return true; + + case State.Focus: + return inputs.Keyboard.IsPressed(Microsoft.Xna.Framework.Input.Keys.Enter); + + default: + return false; + } + } + + public bool Button(Rectangle pos, Texture2D texture, Color color, Vector next = null) + { + Texture(pos, texture, color, next); + return Button(GetState(pos)); + } + + public bool Button(Rectangle pos, Texture2D texture, Colors color = null, Vector next = null) + { + if (color == null) + color = skin.backColors; + + return Button(pos, texture, color.Get(GetState(pos)), next); + } + + public bool Button(Rectangle pos, Color color, BoxTexture texture = null, Vector next = null) + { + if (texture == null) + texture = skin.texture; + + Box(pos, color, texture, next); + return Button(GetState(pos)); + } + + public bool Button(Rectangle pos, Colors color = null, BoxTexture texture = null, Vector next = null) + { + if (color == null) + color = skin.backColors; + + return Button(pos, color.Get(GetState(pos)), texture, next); + } + + public bool Button(Rectangle pos, string text, Color backcolor, Color forecolor, BoxTexture texture = null, SpriteFont font = null, textAlign align = textAlign.centerCenter, Vector next = null) + { + Box(pos, backcolor, texture, next); + Label(pos, text, forecolor, font, align); + return Button(GetState(pos)); + } + + public bool Button(Rectangle pos, String text, Colors backcolor = null, Colors forecolor = null, BoxTexture texture = null, SpriteFont font = null, textAlign align = textAlign.centerCenter, Vector next = null) + { + if (backcolor == null) + backcolor = skin.backColors; + + if (forecolor == null) + forecolor = skin.foreColors; + + State state = GetState(pos); + return Button(pos, text, backcolor.Get(state), forecolor.Get(state), texture, font, align, next); + } + + string fieldText(string value, string placeHolder) + { + return (placeHolder != null && (value == null || value == "")) ? placeHolder : value; + } + + public bool TextField(Rectangle pos, ref string value, Color color, SpriteFont font = null, textAlign align = textAlign.centerCenter, string placeHolder = null, Vector next = null) + { + string _text = fieldText(value, placeHolder); + if (inputs.Keyboard.PressingKeys.Count > 0) + { + if (GetState(pos) == State.Focus) + { + if (inputs.Keyboard.PressingKeys[0] == Microsoft.Xna.Framework.Input.Keys.Back) + { + if (value != null) + { + if (value.Length > 0) + { + value = value.Remove(value.Length - 1); + _text = fieldText(value, placeHolder); + } + } + } + else + { + Nullable ch; + if (KeyChar.KeyToChar(inputs.Keyboard.PressingKeys[0], inputs.Keyboard.IsPressed(KeyboardManager.SpecialKeys.Shift), out ch, layout, inputs.Keyboard.IsPressed(Microsoft.Xna.Framework.Input.Keys.RightAlt))) + { + if (ch.HasValue) + { + value += ch.Value; + _text = fieldText(value, placeHolder); + } + } + } + } + } + Label(pos, _text, color, font, align, next); + return inputs.Keyboard.GetKeyState(Microsoft.Xna.Framework.Input.Keys.Enter) == ButtonState.Pressing; + } + + public bool TextField(Rectangle pos, ref string value, Colors color = null, SpriteFont font = null, textAlign align = textAlign.centerCenter, string placeHolder = null, Vector next = null) + { + if (color == null) + color = skin.foreColors; + + return TextField(pos, ref value, color.Get(GetState(pos)), font, align, placeHolder, next); + } + + public bool TextField(Vector vector, ref string value, Color color, SpriteFont font = null, textAlign align = textAlign.centerCenter, string placeHolder = null, Vector next = null) + { + if (font == null) + font = skin.font; + + string _text = fieldText(value, placeHolder); + if (inputs.Keyboard.PressingKeys.Count > 0) + { + if (GetState(new Rectangle(vector.X, vector.Y, (int)font.MeasureString(_text).X, (int)font.MeasureString(_text).Y)) == State.Focus) + { + if (inputs.Keyboard.PressingKeys[0] == Microsoft.Xna.Framework.Input.Keys.Back) + { + if (value != null) + { + if (value.Length > 0) + { + value = value.Remove(value.Length - 1); + _text = fieldText(value, placeHolder); + } + } + } + else + { + Nullable ch; + if (KeyChar.KeyToChar(inputs.Keyboard.PressingKeys[0], inputs.Keyboard.IsPressed(KeyboardManager.SpecialKeys.Shift), out ch, layout, inputs.Keyboard.IsPressed(Microsoft.Xna.Framework.Input.Keys.RightAlt))) + { + if (ch.HasValue) + { + value += ch.Value; + _text = fieldText(value, placeHolder); + } + } + } + } + } + Label(vector, _text, color, font, align, next); + return inputs.Keyboard.GetKeyState(Microsoft.Xna.Framework.Input.Keys.Enter) == ButtonState.Pressing; + } + + public bool TextField(Vector vector, ref string value, Colors color = null, SpriteFont font = null, textAlign align = textAlign.centerCenter, string placeHolder = null, Vector next = null) + { + if (color == null) + color = skin.foreColors; + + if (font == null) + font = skin.font; + + string _text = fieldText(value, placeHolder); + return TextField(vector, ref value, color.Get(GetState(new Rectangle(vector.X, vector.Y, (int)font.MeasureString(_text).X, (int)font.MeasureString(_text).Y))), font, align, placeHolder, next); + } + } +} diff --git a/MyMonoGameAddin/Vector.cs b/MyMonoGameAddin/Vector.cs index 8636eac..44100be 100644 --- a/MyMonoGameAddin/Vector.cs +++ b/MyMonoGameAddin/Vector.cs @@ -11,12 +11,18 @@ Y = y; } + public static Vector Add(Vector v1, Vector v2) + { + return new Vector(v1.X + v2.X, v1.Y + v2.Y); + } + public void Add(Vector v) { X += v.X; Y += v.Y; } - public static Vector Zero { get { return new Vector(0, 0); } } + public static Vector Zero = new Vector(0, 0); + public static Vector One = new Vector(1, 1); } } diff --git a/README.md b/README.md deleted file mode 100644 index 21b1fb6..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -MyMonoGameAddin diff --git a/Readme.md b/Readme.md new file mode 100755 index 0000000..35bfca3 --- /dev/null +++ b/Readme.md @@ -0,0 +1,36 @@ +# My Monogame Addin + +MyMonogameAddin is a simple library from [Monogame](https://github.com/MonoGame/MonoGame) + +### Prerequisities + +* .NET/[Mono](https://github.com/mono/mono) 4.5+ +* [Monogame](https://github.com/MonoGame/MonoGame) 3.5+ + +### Installing + +1. Download last version + +2. Copy Exemple/MainGame.cs + +3. Let's Go + +## Test With + +* Windows 10 x64 +* Linux Manjaro 16.10.3 x64 + +## Contributing + +Get [Monogame](https://github.com/MonoGame/MonoGame). +As you wish, I am opened to new ideas. + +## Author + +* **[Sheychen](https://sheychen.shost.ca)** - *Initial work* + +See also the list of [contributors](https://github.com/sheychen290/Galactic_Colors_Control/contributors) who participated in this project. + +### License + +This software comes under the terms of the GPLv3+. See the [License.md](License.md) file for the complete text of the license.