From 9f69c650d6ab2dcd40bd03943d1d41412d0a116a Mon Sep 17 00:00:00 2001 From: Lukas Werling Date: Fri, 19 Feb 2016 20:17:05 +0100 Subject: [PATCH] Use icons for all controller buttons The icons currently only show Xbox 360 controller labeling. The icon set also includes icons for PlayStation controllers, so we could extend this in the future. --- planet/Graphics.ocg/Authors.txt | 3 ++ planet/Graphics.ocg/ControllerIcons.png | Bin 0 -> 43874 bytes src/game/C4Game.cpp | 48 +++++++++++++++++------- src/graphics/C4GraphicsResource.cpp | 3 ++ src/graphics/C4GraphicsResource.h | 1 + src/gui/C4Gui.h | 28 +++++++++++++- src/gui/C4GuiLabels.cpp | 14 +++++-- src/gui/C4KeyboardInput.cpp | 48 ++++++++++++------------ src/gui/C4StartupOptionsDlg.cpp | 2 +- 9 files changed, 103 insertions(+), 44 deletions(-) create mode 100644 planet/Graphics.ocg/ControllerIcons.png diff --git a/planet/Graphics.ocg/Authors.txt b/planet/Graphics.ocg/Authors.txt index eceedaf4b..7bad63d21 100644 --- a/planet/Graphics.ocg/Authors.txt +++ b/planet/Graphics.ocg/Authors.txt @@ -13,3 +13,6 @@ StartupPlrSelBG.jpg StartupScenSelBG.jpg) Loader1.jpg - Nachtfalter + +ControllerIcons.png - Nicolae Berbece (http://opengameart.org/content/free-keyboard-and-controllers-prompts-pack) + License: CC0 diff --git a/planet/Graphics.ocg/ControllerIcons.png b/planet/Graphics.ocg/ControllerIcons.png new file mode 100644 index 0000000000000000000000000000000000000000..a7429c2dcf22b6ba8ac19e0ff0a389b7b2fbee1a GIT binary patch literal 43874 zcmd42hdW$t^fo$(5Q z!0+e8oh-ngd$tN%3LsETJi(16Ht;`_m71;=2;{>C0tJSEKv%#^f!iREy8sBZYXJgD zeg=Ukoimzsq=5rCuQgPaKzDzCvfGN1fLCzc)U}jxzhlx+;EGDj99@7wrEk=g6!g7N z2buT%$Y&Ssyzgw(NwHZmo{{o6M9V7`IFXtY)|MROsBtjAF3+WCm?`LmcNKsi5a#mW z(-=8J^N# zHOqHwM0({!`bCQe&;M^9mTKzi>hBps_tjR~{Z+qkEk=fhK1mnyIo*`_1qXipZlAKTF?@XmJblaSurq96pGA1L6IO zN|RRgf4D*X^TC@z_b&g2;$pi`748V+B1+%Xbjh*Irg&7G&6{Ve>--%B1%-Ll|NbR^ ztAlVbAc}z>gkb6)NIRFBWzh3^A5~5HK`LR{oW-I&Xz8`SlRUxKE%lwiQ^$DI2jZ{7 ziD(TUk&dM~L|2GN@A5RUs;}xCJ#h1y-DD;EamK}5Qe0eIKlinHL*=1r1rIm!8xDe) zpvveAr6Y&NSeIiJ)>@i=I6Uh8;Q!m>5*!gsiozyB%_BqAqU$KSUJ6=YVL`PQ$*g4M zSDy3l*$WCFsUTs4eta%5nmN2_+a9@WP z1w~5vaG<@}B1wiQaNX+MRQn#3d!}gZEytsulla$<9pzgpLDl|YWHV>fy7R`8`Pn7) zrhOZU|Kw{=--tF%jH8yYqIjlvzq`GNO-F1T$hJ}L?yimJEo zLw|m1JEom(F}6yFg-g5v_$%T_O8NZI%mAG|)>Wcc1ZMy0SL^=gatl&sRE1#hJMIek zb9?k&Y)S-*+?U==gI20%5NzeoB`ySa@oFG8Rb5)k0Ana1^PYhgeBj}7>Z%B%;g6l{hB9d#R=%n_~G;hTZ2 z=2FM_rJ8=(>;0rnDq-w8^JH_}F$)79&q}G0kDNP`d8!5XFF@t6Y^_mXku;7TWf5C)4&I98u;do46R5TUmZI;oAl^-D1QN?urW?h&xY{?7 z0;H}-zcUqPlkYc57MJ$&XS*9@(2{=6b2cmR@#-JCXG%X=@&uGU%QY4YbtbEPMtYVO zSZ{;P`#=F)z}9)Z`hf<43EX&O3?Ij~TxE52fa%s)MWO;YbS({m%pro=v|=o@7NV4e zZOH;jqg;I}%F|euClsw~yxbjl)Ijy%m|d$xEWz zo*|FuzxUDzJBb<5JJ0iFF~3dp`J%^GS6w~8df$N-I8JTWY%J1pSZd(c|Fo5tr+nPg zIlVl(G)DLO(6b}m88JQcRqYFRFy&UJXO{bqP)Zukc5W%$FP#i-XlTr3!6vm}wx*W`$F^#WfetqO z5W%!o2Bc~O%FN9tFgyJy(e2#%3EVh@R^C|Q& z$h7ihL<5ThtF}CkoOrpoYMqW|hntH$-@b^la^@Kea-~*T-n99~>kwZ`H}C9(B}wNt zp>RKR-Ry?WU6-@5aksRr9P+kpHffE@han?f@;1{WTT8OPWw|H}VL^hgq2rknx85B} zAhYoL=TI`T)%#>>EEwFg2FD?ysjs6C6qIyMFPlURf-{H;(Vd?ozFLiJi<`e2d=e>$ zew}oAvQ?Cci=e0q{dF!Nw>!_^7@vSF^D*cUz)=h*UX~zcQH|4dxyMY;=uQ*xdyqZF zXra}+PWZJ_D@A3jC?TyV&##sNBj4(8&^9hUKBo!g;$95D0r?1xdk`$u#Q<)y?htI~ zivRiYx3EuI>7q}NO8iml$V#)}&Xmx(GO7wAwoZzZ?|XjzG(i&aRxBS7t%lXr)fcJ$ zMd%lR-Gb_R#%u87Os(BzH|LOi>@siNCC3*z_?{jU+G>$+^@%L$KFP~+YH!Ub z(~au>!iy=PT9QNy*HX3<^gJ{juSV+7G^y+ruA%B>_~OntO`l8b_A{LNiin8h%wvIu ziLzNfymTaxA6V@QhI3lD+6S=e>2gDHdlWmI^718V>_M|De>^0?nG0; z6w{nM?W7_0J^Rhe#6STpOO;Ve`s=xlKQ`FOyb#2HiB)AUnYOw&gNVym>ca=fAb9fI z(~!{6-gvk9hEm|hU5cVKD!O-PfpSr@w$vB~DYc%N9`*FqPxdTz*YLkNq0X#W9AB7y znjr#Y-#KTkWNGR6OQtEtRANp$T@2lPeg^O7iANmZj$?|snF4JURsq$;+HWRYTwE%l zInp2Rl9jI3$1>9m0_z=8&C0)e9vyN=A*PbtVhbIw|7eU3vSR~Q{2g)?> z^H!8$)7g{oIP-wZpOx-<1_x70o`}t7&&}n~@*8Oof9;r(SH4WQWnPu`(}e{EnaL8S z6NdOh?}&2O#nxvT0P6}A1{^$&epUo~lt)dpg}WGh@ME~CtQL2(eS{&xsSqR*vkg{t z=8<7+V?Z%MR7LE|(oagp1T@~{LmHeE4UVxmr3F=6yW?2m#JkgkY@Rb;?SwqiKF$}% z>0hHW&%r~Ls!O3_+7UL87TB|2rIzxvs#No}$3Em=&xVNR|6H%!5!-x!55R{YB-6qh zv8*RN`ztngmF((DvxZ{ak9UIDO|T!OUPtAgl{HdSMncQ-U}ZEXf++N&B%B_w)akbx zY$TD~;oARWDU60#Z%P9Y zQ5bwm+a6IF?NTI>akE81z zYj^=plATK-y!1-{DEkwI*jTw8TP>xr(LVtE7MesWgkztq)8Ij?ze)jnE9VUUUhZwc zA~{o>>wuwQl+gt3W2$&Qi9_C~yjT?L_>~bYFJnx7Pg(M{{FGxbn8qbqvSHT_qMbPM zk(&DH8_hY^{Lz`wMI~BT#o(5U(QIj^HFqwgj>w@TS1U<>5`m2^VO3^rtzX6yT7adP zgUjewEfR3!1)a)Q&)QY^?zJAv`7*D){rlBV{`Z`-(5g1kpDlB*-nSJsm)NDtynh5E zhnAG;#-R@uJ@qRWvA7C}AH~=w2JeYYdx$xvMm885C;n7ilID_opX5*VStQY+1v~Pui?@0oMM;%8N>ajfQy1R~xUYhoKH$b}A zt4IPjuj}6*z5l2_>S(nE$T>b*$uXi_x~y~k{`&^@Jc-2b?rzUtMC$(Sg*+wewe}RU z{Lu^c_KLrrm0~ho#00EVIB}s?>v3VOC=QjZT>dDs)SBnWA!Xl)lb*dW9Q+BvP4i9M&Cg!4^BIM> z!~$}!4U!TL5^2$$OND#M^F~`of6;??d()3F+Nq2X{q~DBf+y9zwvzG~y&~VBxkNJz z7Y7kcl<627TscYRsjz!{y)a1>U{Uex-WQ|epri2&3BA&Qu~5-$UMJFf{s2Dz zF;`WvlhE8^u{vBI<-T)j!I*AF zFq$s2Vtu6#|GF-5<}!}zFkb1ft8gFSpM&I4!s^+0@07|eh})yBoXh9*2kr8tQHW+) z%27d>aZBaw&&)LI)f4vQ&@4U1JC|P!$h`(aIC2?c*><^8gcb3LQ z4f|B6&M^7-d_O3y3TS&phjSesbUEN_j~k2dVA#@rm!54tzjejj(|Rv6d9{GW5?l3t zB4*iO5^?6YXBoMg)5M1Bv_ZDCc@xLe2{vg1D^+G4JuXEzVBxZL?)fIML(<=j;N^?s zj)l6Wncw-j*TWPmyTIVP$;ha8`u9Sd&Y1X{Ha^y$=5k&9;Lz%k@;qGnDAIQuSPyA4DQj$L{|x>oUTUl^2;E#EUjncM?9Z zQI{)kl&Z7x=DzOvP%qTm#P4HWF9KaKuRNf3b*fTYoStGK;ap9{PkG5|l85LziY4cK z-8}&kLvNafA!-M}f#U_}=p^6+n5}vO>m|LSp`Vq$=Z+?AxWlX(%y*dc=xkd)W18p} zjWM=w8It@iEvtMUL_M6!?}?2lCgNmx`u2P4Usskkmyi)pe9F7X;%c)I&5SBUXUi*S zo=0&A_(;bx$(~~~|ru&m*{g*-Qk!WY;-}`%*!)?3Su49e|8j0``)z#trt8>$>iJZJG61s<+om>zN!? zSI58|`(YSOl!&x@gkq};$AhhV-C0C_9avSZGHDG!1wa8na&?zs?a?0+ahFfCYay}Mic}SI9zyqdwBfQ zr+Bck4241|(a7xc`Ta~b!j#!h+kW&yI?ElBY*!9`oT(*W)Bu#+O1%`VrD<_kZH90nUu>yBD z;RuTu=)+M&|HxOl71w3`($~+;wIsh6Hlh@<^W1jKF(|hidBOD@Hjb41=KIvydQ2j| zXvZh=sTiF23dd$9tT{4lXHDXAZUC?~lnjikK}*V6yJr~ye)PN@BZ;{W;M)goZSO=s zcfMJBIxv_ZI#NbmouQMZyn_K3^8UVYW%cvB4JVV%P!cA$=hXO-(DRx2V6~ z88y88K*Ib#hJ!^}w;XIM@*(S!XUj8P^@Gml3w(^P*WhjCDX(JV38zZQ=Dxw*VTy~B z;TdK2Wgp;9XAT%z7%!GVdoW&hli@k7x|DXA-qKf6V+OyL!#ttoE#IX^Mb;>GQr%(q zoK;>?p=v{(3}zbfHm8d-WXzSDJh~)W()z_@S*=m_B$XLvP>rlGKS*P|=|sIWJHR&* z)6TGiRrmkIx>i28wd?_kFHC$b;+vq;Rxf-Kr=c0)5{3W<6lEuSj;de?f1oqah;s_8 zqo7sp*i2_>pnqvsI@-Rp7gY%$VVS>v{l=jEHH?HY3n3UM zd+m4mGc{{EXi7Lx99M>)PIwJYAK~b8H{mE`zgn~>N+Rdb)=iRsG^1SXtdjsjGQAY+V%`z@A zi{37<`Yw1SEKUJJUhZCI)Z#IV2OT~sYU!RG&yt!%{nk&0|MW~Y+_SQ(PrLX&J^iS^ zF_RJ)CoS!wHp%L-8$T5&AeE8Kw}QJvyB51co^f@R5Z_Pkv$WwjQ=xC;5KdlDUCgV} zO89oc4$2N^V8*5trewLOMJVdp8wG^C@b4{RGlK$Ab?{XIwdotJ9JP`rT^OljWJC&h`?J3qg z{@T+4D}ve<^MjgxhUAX}*_nZ(qYHe`M8)L2zI$&K%m%jt_{j_-qTH#J67+6HN0nM) z*@iPDhbm8V0ZU#8?}n7cz`ofipUb0ceCG`TwLI>r2==xllMR*qV%ng7o{+D+*1->v zwJ(@%G4OO5f$(B_!8y%o{o$z$-=L5$A={4eH?_FPH$^J|#HwFf#YyIGzv!M-h&mpsDorS*OFH;rcZJyCreIUGW&>=5jWwn0$OuYSg_#f#gN<|An$ z(5Sv^x7R71%JNkSwuiotLEPr z@DLRyIekwNPdxC1(d3g*njx{qP81AlWc&OlWXQ>v`QlWSKMV5Ma7QiFU;X`_N` zmtqo8^xbfi9EC{Phme-h9S!QYxI0Pt{nnq{YHr+Io|_f!jP*O)owXO6a^FLm(26xt|we78Z( z#A?*Y2*;7t8@tJco(g_*QQ-lQWFP7q+h>h6m(S2b`%)XA2B76v>ZIl786>Pp8qV;c zbth)!W@~i>?zx?lKjuu-LnXDGd9U`ZeeOt)g772051lzKW_51%_V)75{D@x(pHmZ2 zio!0rLZ7Dis}0LUI* zn>hb-*eP#iP833Uv2~^%Cf8UBUvAg4dMXCuX+xI#ucL!M>A)d(&S2&!^mI5e(f?t2 zn1Odc5*UH^_Ao5t*6-n4>|i6!>)w=-rBs@~H)O^abyO?EYA8h^Ktqyt8W`?>$q>P& z#Q5ij+O@`yP-G3b5-nP>wTRpRn%Gja77tkNpM{RQ+qc}1570a!JA&n(#p*eeRQ>4^ z@=pQ_D2=bvmKiyVGevnH+^3byHwc1UKOvd>1jmNWC@lWknGogPBk!biN31`Yomn7O z=4I+QV@l2x4TO!3luk zZl)_5av73&r2|`~f{ zb|~DHsgrp(%)oZCw1dm+vg1nN|0nm1_7{)!Zg&2-V{J3+^h%qxPF*hJIvXdq|2K8a z6UoHcp#8;$sx6v?r~9@;**gjb_6osSl&}*p%R{RPirodayfTkUcC{9Udr^+xTP19W zuCMm0{=)#adj@QQyhvi5YQ#O0bUXF?<^C|xOznFyRlw=VQ;w7_=%Y0=JlP%7-$w{q zfeP-xC)fx{V=13W6;2)*%QLhRtK)ovA+}SZ5cPisd~wpsGcSto)zTum1!m zZDgZE>mDXn=O}{78~uHJ*3xPb*|C5(uOTwIR?@oYbAV@5`|&e`z{fWXUMxbZtW=S1 zesZpZq~|Sqz8HdPE)CGnn0(rn1v9bqN9+eKtDu>|<6_PQqJ5S|q`JPv78PDk`$v-` z3D%kHlDw=`(?!J2=4YcYi}R1)1;jICSssL=dyH5g!1FVWcGi=` z$!Pvt;?b1+#6)VdGc)k4-QNm}9|uqa=bf6Zs?xqQVwQA4+8G%zjkw zN|$AS$~CtInB#*VHf`@V#T_8iwgS6kAuK&_Z&knzL|eIAMdR9bNjpBF!bjRLYm-wC z#O~Xz+()1C$;vg_H73dYD{zjeE4t62r1z6b0tR%W(TK0N`Y%BpBGhWdm6gN=SyuX> zdr_i8W3jR&SJ5>C=Q9JsYg~5z(liHkR{e3U7>Gd*cpB(Lir2lUF6EoZ6}L9frTHPt zG(nJZdf_4d0aOS)R>gdC&(!jc@7i;rV~-D@uEcb_OvIbIo|emO#vLRo%{1@K|6D9z zKm1J$o9wTj83-=htAoYw{?^taGp`hPH5#u**V)F$v*jYS82K6yl@h&A>y;U&b70~7 zs61=6A}~I$YL;%kRxl4%-j}G-SaGdtnItVB5Mh#;_sNsL|3#JvxY9*RnX(jpnqlGNK+9tG65D zk|{N(V|RISxD2;Xu(1%f(t*<$%r?vxsLHlM=Y;K`&^{!$371CEArswrvt(ZFRWRFs zFp%^w3>3j(nltmvd<*(O>GH^nNpe|`;v+{%3f{qFX&I!fERUlu9MWuL;;+q*7QoPL zZXPH^JA>*8p97skm8{;0Vm)ra3$_!iU3tc&znIW>VFI)m+5fsS)L_fx#=mLi1Ow_e+(O*tvAksv)vVnr2K|Ni}|DtTT>i zGNYxy=tF+IavG&}V_O3g=_qEbt*yP;U0v}#YAX;}4a6c=YvtDo6!5<~eF?%oowthD zl9KyFfxMhF^a(h<@1Jx=ZS^=3Je+=+=(Y=eisPlzx_()*LT_u4PL~%(IQ|}YUz9b+ z=?O9)0d`HAE4!#L`T{~2OBGKP%koFTW5?irOB`K)%+N=*@8`@U0e)K}#|GdX{xh?l z4qWm-GpoF^zw3BfED4?5GWeP4z*&ED88e0w9uN{pt0@M@mhLX@PO;=w*-vR{Fui}I=hYEI=?x0h3>6l4vHdFm8Z;EN_#uUGWdv#46pg5Gap~&DrKP>P)72--k5!?_sbXT)KPO-BSaU_470*sO_my4#LW58D zV<{9E*MyPw{JYrLx18nD-VMvrUEq8c^S5_0ivSrkGkS&zdkav0X_EyST-CfhBLhCO zRj)cE&A2qomcf2uGkFmzB;pB zhM9Z-)z2N?zD{0UcxBrKAxvfE8=fVYcEMUv(cizVMn)jDSVnNm&A#*(tqUrAg*ZU* zf_LYNy^t(r);G>BpjzhL07L27P?KjT#Tpo!UgBMTfvfHiU9x#ro3%EzPXIpm1Y1pP z;B5q*N|g1y5{^qR&EWMx!z-1%taT=5n)?rGV@*J{=2Pd&43YR5TH+?08!lN4tGne>);u?oQ_J+9nSfcRTBruQnoK)?z1b+b{d{tX1cu094^5=B}=l zIKS^hXJkCDwui*D80y^Y@jZgUiYv9Ta$G*ZrE(4|!_{+muU2!iU>kenv71V~s_f*o zpTT4nuKV*f_i^EPQr6G&7};NBWni*zj;5z#@*9>L|F}>3j1z?6MphLBE!B0?Rc0l- z3Te-YXa3epC9b1eKV~zp16AA8I0#x^680BZ1zCVl1a|U4;l*U1o^6eMNfI(Fme>

%{)1*EZR7lKIr(f0SL>qO>jhEVp>sMeWmJSeyMuR1}Q=y420J|im*d=K}Ke6imVmc9f;1V)N zsp-BF*6Gm?d33Th{vwESIED9w&=G^Y*VWYPM<_tGPKws+;6Agvm%LrvKd(gn9iuT1nV!ePAow%(R-|o{K?>YS$2nezVQB0v6XUcU9xN`0h)uZMoCWn zWk+W8s}u*}5mbWHNzV+!cKTDX30u^g=A0m)(XBA@wa|{->deUVDC(q5r&*177LtF_ zGQFS}k|PXvp4Z8QbunxQQ_V(7#B^9{Z{^8Y5YPp$&IX;sr0!?`P0DEmBfJ} zL~D+xVe~1W5L2~jp?jFqp8vT|{2>P>E{DEm7rO?x-A8i@U}payG0<)9OYz;4Xv3Z` zoN37fXP+>7^%QmGMVlR6gR{qiqL&ml>6-nYf724scq>nH;6&aGvQ=wUG7bsnel9cL zYT){dd^o-b_e`a1_(V8j!kZ`(ft+*$~ zy9JuMhb=a(8#Uu1T|~Ago1;UtZCoUBeL}P?Uw0IL0kedu{YR|W$=bhsy#P_jBZ1u@ zTn4<2K&A9akI`XIq^Hc(HY&}`)1dHKfd9znj1O>0yX(!6`$IDWNkUXM8hLr&?6e=T zOM!w}qqwy=Kg-AJJuv4nZxt5+(v@3TIt>{WS1uC#tX>sRMS(W5+nHB|a_=u^Jg>ci z&oC4}pc75_h~f6dCp7FM5vJB-RGtaB3>9)I0S2(f{+GXhW*r1c{4_M8>Y#5xZB~$_xC^>iULYUYE4sxgNC*{tMeS1%0}!s8~AV zB<)nAB5#TA$jh_;xLt|5+RL9l$p) zcu#xIa91m*Z(}ulmQ+Nn3#QvY?ep9g_@pw&$Hn#W!w7pgp?bW&%o?7RU2{%u_tkzF zt+f4KcPO%`<02G(xfWgVKFc!;Zja=7F-PXU{w=ca%<+MxW}c(Yme~F;RqJ>@$>%Xs zn9?Vh(n{F+*%luPDV2$4vO(69xytQYJE+vGr|KFa;@H-A+wSb)Mn55I0=@7$K@39bXE3t+@n}vBXJ4omd3)IASMtz%a;kmnRsA8a)K3BG6UL|zjQA@N2yR|`db60ZgFEDDx zfJ}N4e0BOPyJmWFG?WV^U>8$U*gWS4r{l)b4 zw&IVjO?~!jJe|ZUZKDO%qHE#(T(pyL?y)5Ue4$qzHg-PwyVKKFBv8+1i(A^le^1KR zK~R-#=Rw2CW+E-#by~J?NF(S4}xEdo+w4KV!Pw#1BI5sTsf48*T zn>7L$)v;3?7%ow*Z0##dEj<>agIbLZ9Yn-_4ynpLhQcv>u?vO0g0V~~F>J8Kci&J( zArR)a8U`NoPgZwrEG$KJ-o-xB{Yf5klCb~~RUl@Ea|##Ti&S$Td&7etxVdGHYx0VN zZ$+wQ{_5vnJl6c|swg7Yjk#SbIbIFtDSaB#ZlNun@Emh1ZGqtp`eN`!z{4Ta{-PU$s?oU`E>hs$KPUo6k-`s;f9yjgIv!uZ4 zw2j-A#YKern5T6R!p&$v05zmP0AO&WNYMsixz@H~I2iIueE8of>pBSkA$+iAE|lN@ z^)s;BZnv0fI1UhR6*}Eu)g!;R+Q;?7(Eft6^`S!bJ{^Qk(NK0GhOx1YHZzx+d%~Ur zGZlf49wiHnP@<$_N{YH46LFqlTDdH*uC1`Ju-e<-3V{_6n5Z%;CWca0)yz;SE=_5! z-D^9?ezIh5c&HY*-`lOrEq3{Gd)n`eqC6Fh@45KJ;%bRpZ(2N$zKalcDv&#q$rF=q z1D$kocYG)TC5|>fAkCEV2a(s6>smjibb*u7S#U`Fr{w-0R%y!=5Qs9~x9gckJtan(2 z0UD&K`mMshBUuFlXEs|W1i(<|ORg`Ta|xObM;_j{(&|Kgkj*=Csl`PFyMsF9(&A{M z&UPnN84V62NVu`HAL;yFavd*#IX>7@y9YJgE*TDS>pRm4G{H4w@?qu(c{ttnObmvy z_6Lvv5?KLBwiqnyyxh+}N>VT#Y*EeD#Z^{TuE>4F*!f);OjOc%LKK+&qEH7)#r?1b ziQ>b3vhOx zKMMvM+MH}YZe~@jTpbuXbxd4sc!c>Q91BV z#5D2Qx3ZeLn*3e%3y849vH0&c*m+7!k{CV0HDw+1}lS%;dy?4qr+-ioxnT2l7`fC}Ek;h@* z^UHD+r(Z1~CqahUUm zAqb4Ug`r$W8@OXXMM#7B;MCETdo5NohF7tCLh)Z>f@bDKkAGIDQ<-Mg8_!hNEK5aUxvJNjvQs95j?9 ztq?_&tCuO`>%lBTm(8~Sfc4`nLX~$>5k{g^oUX(po+$JAq!#tE&5GbE>=T~Lt6fVWmZ0qv zZBi+a?ig~Ad&5#tjOSis|4sPWO1(K>ElCKT%OlP=JrUhM&$!z63<`r_I8)4GKUe>& znO8W7nJR);)hoZouI@%NOeyyXqVIIG*X6DK*HAK8Z{nv3%ox9lHq85!?w zj~_;=Ib&-AJ{Fu%-#$JMgm6n`{Ie;9_=1ZF4UJ`vx$!wcwO4;!XG#MOgzJ-I@_H+_= zChb@j*p-rsTDdR7xS369N6Y*TX6-w0Ao%{zjS{|jhy9k{v!#Ip%a1Ny`ZZ1WtU_(6 zCMO@BQiJ{2{DCQy%v%RM!8}E)PTPgBZ1@`tGG`Jzu*Q_S*>0f8Y~6cA=rc&<)5$qs zTrGYu7|azrg1J$oV+yEOBJauG?AyxKRW`0gk@cH>UE)q(Y@?vhneo2|Qu3wR-bOk>>>ifkCz(zWzBa ziu64^-I+dl*ES?vJ*ouWD4(6R{yTb5JUzO?K)i0Yz6fh8)BvK3Pb++>WKB138=OzB z;$x|25q)HS9m9aY+}#~>>8om=V0b@h^~%SAL@TyDsFg^uoK6f5kKFrv2IN;6k2TJtTwTBstyL^w5h!XDRR?2|(G zz}JLNU8W;yq2G?Gj!OMmt`J$;#IG_5%~}#-H2khR+}p6QAdDK7g8`Cg5o- zfFp4=v3g$m>IlBn0qYc*L?>1v!g3MoL4*+GmHVtg-{d%(s9<1N1;(aoS@|0$GFL_T zm&bNK4yrXhW^YJF2CGpd5l~RcJi|lZ)n5Na1nhpl3e}`^ToNG^2T81@|AG~bhc%|_ z90w1MTUhynZg`oM_p6+(8@%-g!`3+=mW?Z-Y;l8h^^eZp69>cAs?RfVGs?r5rV%^Q zc{p`y3u=0&KRmNFeyC1Mmu5^_VwC=yRC&jzjR>*JWy=@l&Vp=pd?7QMSP+vLnm=r` zv@z5eOuPs0)V4G7Erf`764pULJn1SUhc?@sh_Xvq^2l0U*T10D>-NuO83cmEj$)`? zz*PaiqF?1#=oR`LHf^zeC-`muH=1IZd4-Ve)d6J-V;?*J0{k!x$6mL=WAgNW@#F-S z+}NGfwWDTjMowBCEjcZpMbR`?*2+n35?^}9o7aps|03B1H;R=nSklA0A-)s1;9w1ZorJe?s#(MfZ`}^G2d*wAkw$M<3PTZJWqezyZ*ETvP$!Q5h`w^I|8b}w z8?}10sbpi%%Otk}fP1H~cRR?1ub0c+oQPUkTn`nUn`o?LJyid6uy9V#MIT%}%{=Te z8AVJg-d}>n5+hmMRC#KHZ^ep~>ZE$}+Q|HqnA?69{yUa&Ba7&ncD9{_uXIAJGR;Wb za(665I)Ag858>{H6V=nctBccVI1p_^$=^{dk+sUNY^+F?!5ct-mouXilWHoTDv&W9 z_zuM2T+0uxSHqXhzKF#QWz?Rb@hBax4BFP7iM*GAPp~Q(h@aSKIkS_`xt492pG9`0 z0F<)t@pN{yDKexvEw6j=OJwNMS3QGPa2+2~d<)eomN|xySOtWLh|wvh+0CdZTR-Vj z6xCM9%TzX4z;bS;&Nn@vR+w4+yzX`=G!f*^MR$nhJ{FBBLirwAaR$Rn3%Rz&EnobOiSmFw@ zv|I0^L(@x6K^8$8=QN9Y5 zRYnSdykvpmKAxna@p}8Z-45&Qjc$uPtv^%fV^nEb{&T$Dlg<#)d~(Mfvxk=fVkJD z^Y?Yj?Z$HhTYvzWhbi%@Uy49;h;X{hdwy6YmulZE#G!G9MtP zHVjF)*4pO^O;#i4d8ReSm44Pe^zhQ92Wj+0o(`$MAwWh_q#PygTn29 zDPX(5%=N+;bnm5_NM(&l7Weo_nUtovGVvqhA-2ePE1G?tPUDD%wy z*mBe^rSIEWV&M=kkb@Vye`-ZSrwDa=;}c-9f1FM{%uvl+abAwK3yAvtG1IVPh4MvY z78pvTF37W!ftQo%HJ$iN|^MhcH0P6Kgqub|V;nL*U$gFYE0 zAvtNR#HgsK=U1Az{p~9;g!3GM5qMSSq*V`UiNy!qfc@AQ1^~KpP%83&do7_&k?6ji z6J8h;I5af$Uto##Jrh--lG3HDEi@yJP|q~1dfp{(e8M)?Dar%-*-IU##XN>0Q_ipS z;y-VBOaN_Rb$CEq&E@LfhL7)<<5fA3dd5Y268h}%NO1NZWh@0r9{L@Q=yLV@)Z3Os z5ac4{2kn^Hozu0#tUKpUf~q-FXfmMN)(lFUZMeckOq6|{DpJXEeb42mJabTLG`rGq zoXGFr5Q+p+K!JVYL5+IQ;Bk*+tNAl(Get$$m*K~?eXpYxR~#q(?(=ocS{<{)FA z$viakVeC*IJ<+kTVu_>g6B?1^#lN1Nrp>sJkD)B9_7GwDiS0C1X#epR6Vfd8(0`&e zP;u|6w_?#5v})epGtX_{h|$j(8OU2d%OEu?@x9^IYHK~Nzo2?_OpQ8_dZ`@So=Yz6 zDYFaee!hxSI$5)zB#-+o@FN>fL4U_9?_H+`-Qk(SE3R#sZ)9UvTFQ~`l!+;pi#-^e z0sB8F*K*tSCz=!L+nM(sW0L=@ zW9fo}czJ5DFZExrx$p=gBp#YAu5NwNE~u}Be%3K1biD0as+Q*)i^Wr6FAGa0GI_Y2 zc(RvFIL|y=Q(O%3?ZT#H{eG!GfmW5f(lIYLT1ewRJ=fZ6^PSbaI1y@#tNR;p=7GF^ z9mg2yg>qxcK+FMKt$~h^w3hOxKz;5S3lL$;o;+rsHdY-j~f6f+gpnkKFyY6=#UnqaTo?A zl@6twXXAaJbDq!toi7*|=eK6g|_Z9BeqJ(9RDSDwT;!#PFvg`h2VZlQ;o zTw{trCgGIQ$IE0z$}W4`opf4VJmZL*1%3K+R^ zz5J?qcYo6UaSFtRi{1)rao7<1W+o>dvaa9%u47rQ|HXANFc07DtS}{B!j4p$&~7;S z#4rqoMW1O-{Ib=Wrz#2~Szkc%idS(=HXwMsW<=4(Vn|gka2~tpdq}!U z6eVYt?|k|d(k{GqiM4*~JXUc@oaCK%lhXa`^ zpZLy==q|@=WC=q=#&saI|CcAUT_?jbKWPn@yh@g8pJ2_hjN5grX8I^+oPQEzx^<`J z$UHr$qI|dJX%~tF^5L&H%;eGMT(RF?zXZ|7Nrb|xJn^8X!GBDr)8@4q`(;%cT1lEf zqY!CjBTIp_FP|yhyK~xT@-=Xqttg%8awm~Z>mEe!Hq5nSIP8$!s54oD;g(v|6P0(H zk3+mdgB**mjH4MdUjl(?Mg~pAzQJr{z%&7>YZ@=hIo?OL^2AFNztoJK zo;fdxNu*?~5(*@Jpq9AbU~d{&w4qU~hWDfWc0MK{gF6^9l?=);5ihToZ=chKVLNpL zv39}1-&{onmHyyZy-u3oz20bwJTLk#ok)2)5{UM0(<=RDP8hxNRMxZSr$+( zM7IkCFk zPbaZuO}%BI{d@qJ(d73m!_9@~?@@`LZQ$V-lo>-V0Phcs9ysg;H4x)KoGbi2BM| zn`}BW3i2KSB^?6;R@!1`Dw>AVaX=QRlup;2%E7}i8zaD2y6ncNH4{Dl(;5{+p)S;* z+QFf95$b>3GXI>;QUmKh#fhCHv=dU|mQ^@&%h#5plftjyG9`wjFLo*<+HYGn|1)KP z>_0=@Sdf<^yO~1SDii$su-{sS*W71BXlM1dC#~;&CmM;?eC&etq<6Rwr}ip6lfa6+ zH#_t#rMHRCNy(L#OxDFIxU&NL-yP+et`>kpk+@1bRvI z*>#n&so&xEM2F6o3%&^Z@9Y(hiM{)Zf!pdnd5=es|gcyw-OWb}8p6lCcZ zla0xhcL9RfQfTlb=`MD zw(*jq=--^S?1>;OTbaV)YC-We0~3NylC0R){zqGXgMv5@qB_3m$#Pw-*w^*P{^C+133qt3-^XDQ&dTGm-L#!?zrAXAGPH$L ztUfEzI6siA)bp=e{7EWf7lu-t+DeM)Jto`*HcFoq@@U-6&`P(umY;WiFmYvMh%opa zBzUeio%o48{Pg2a=G&F~(+*hr3qiveh>>}#PSB9cQWHMf*?^#PAvZ0B07;N0vnL-jlH~OX8eOLo; zTIbR7b<&X@dbYS9E2qukD&j4#xu(odao7WpysUpY3e^WTqZeeVi z|3aq=yG?A3H#nOvpK5AqPGr$b`W$T~4oFvRWBtO|!Z^UVh+v|7^GQmaHT&LnP<7sN z#8aouBdJIet)kDQZSRD)9~0z#GS^sncwgMxJ%HPRq8=y4ePr54Q9td4ZN6jt;b2eB zCjSSDj;F3}FAMFzh2DkHC5g-0Kv0E3+g7ocmq)YQ1Q0ob=gYTXId#`mq%->Cf4^Zs zH&dVXMooxBfHB&L9+V^PnxzvtvqeHtrz5|#WU>Piw8z-$viENs)RJ&Ky&D+1tn_*( z4U;V$y#0t|JS_cW^y?UXZ@*p)9&iluP+FNY`R+wvu8DoNCiEQ4K?{9jH#Y(+zVg%i zpO`rSOGo=GQum_e*?dLTSzXi4yrZNGnw3Q2#s&iv0H%MWalfUbiRs}PzC)gyg_KiL zo{PNT8aj>6qN{$A?wS44oZ&x@Nb}})L6t0C7z2}3ejf)^OYt&;z!(Fb>xH%sYo{mZ zB397t&Q-*I^7EJrV1@<+`@8~lJ+z*trS|den?LEIj=ZaO*7~Q-V ztvGNMleJcnU^;BHhWEg)Nh^QI_S-Ll49r;|8Ay^D6nw0zRADL#)6efbx|Ah+u0>nx zx}oi`-}-jLVspc{;Vv*5{`aj=z(aWTS6vj{E1s9CLtX}szH))5fqOWn>r(}h2Rep^ zB7Aq?}5pLy8*_^P3);bqv{n_wf6G( zaETqPC9sUdvV_{zTjRuzP!@Nwp`@32fw_MUBiYY1)@{g86M+ntlTR@aZ?fEchu>5- zZzE{rt>j1n%BC#V_T}A@O{(+B$G-&|djxNdFcp21V3B&lk zpS{j>j%}@P>q&kb=HboLW=!;_U3uraKOs!5_Q8d7f+}AiP0)RYKu=Xtm626bx7faJ zVMQf~Ggil#bepW>JZ=7hW%%<60A28J)3Sp=HT14M{;JqNro*S&YNFR?|$A|Dus}%Io$7Ad@;GImLa0!L-eIJ zcA`2nqHaL?iwHI-nE+8rwOX;m|1x^I@di<*iIcx}A!P)~LQnkoV^0*FBUDJWjDQj8 zi2UL)*{Bv6TO~VFCGRm)*k!<>f0JD%jz+h=a}se)W3aNaa&Ie*n#f68ADAf);{1tH z`hp+h9)2&7jGR2?UdG|0M~^g%u8KACG}EsE(F*1U4tI)vhy@c3M>Jyzo-lhK;T21R z_k;;qy-Ig+b;@XG@`&^OPf3>HJf1gP&;QD;tp}##R$85ElMgXSnzk4`s znxfF$emv(>*{Pc>VSvBXbiUK#*HBS$;tkSF0-dG2+?w&LjO53cS=lo>4H5G?Ba z_E#_z50)btu%+^{^XLao$DPBoH7#Yb>YxA4s{cuZrGuj1BmexR?B4|k9D}6JM@(Kx zzh8gGK#4*`XYTj+tX`Swyw|j<8qwiiDMG&2JX^u}QWbxWu;u@9>IN#=3zyq5Ad3;( zgUMHH>pi`u5?ipUt^Rm@bMcJm{JAUonBnTr>)*#9L24`L7+_`yXO6!`);|qpi|=3>5I$pAIjsU_ZvJ?8>uI8g}=# zL+^yZy~NXY{I%t$$BL;BWe z$B8uYNb5!ha+ARQ`x!={+=O0ILx>gIqR6LzFz<+C&Waef@m3wjXGc=jziPnopY+GL zGYW`rQ|ug!B!$i5TF*Da@6UE~z<-~TY+r=GlNEI8OvcPmRY0X;#sjPgQ}1a2Q0C@i z1b_Yb`0<0Fykf6(j!r~r>0qjvaf5*Dl*uTWqgb%Zt(d$q~v*|K@o zhRoA`O*Y@l?#B&=)9u16+n`7dW?tvEk+^$?L=K!Almw%zC4wNXC`R`cEj=&k&CrsMXIY9lIzOHxJE^ z3MGx9rB?)K1?QDDSz1ri-&pX=DSzo7mL27ea8o4U$#fg9xE$Y;9_UQQV8kjxSP@O0 z)#Jn7`t!gKlkeTfMJ@TV%+iu5LZ11Zxlfa&v#Z|&kLJs5cVxMN-Mnnp{$13>R21KK zuAcn1D|>jWB{U7!vRZ?V2dR-SPa)~`OlMt_$-?a|i#=)u4<7Tn?E{8UmG|FX%GKe2 zj}1x7uAdfM?)c%LBIc>_q-+d4#B^#1ZH_5#WN4^a!@cCQ#6SL`s*_?fXa5wipHhfA zlP_Bw@li6XS1WkTP@hF+(`WD)Vw8-BM&01rtfVQqJq?-<-UftcYIR$^6BhobeJ+oF zh1`6!+YK$%wB%kQZ3h!7l_fD6QIG&xMxRyZRS+7 zGHzVfHGv{(HosX-7S^Kb$|1f8Y{y)p3EP$>>&zrRzEfhe7ScHr*N}R%Z=YH*5qOkb zs;*qj1r|nLjTZPlPrp!w{C4reLhyAlZDeHXPcJ(WO+}JzSKE%~Mq|jlidqfx2fFwg zJmBJbN=-uY2;O#ewyCuh)PzQ^;uu%)DB#1ou@KLC-KsWdn;=r^)Il=06qgBMI@=0a zd*rBCdhupSzy2;C7vf?@j<5s=DIU^J-J+#X0$i9CE{aCSe#rMW!mLtH8XRlKA8Lem zHg#xscAcyQTG^2b%_imq!{BM=naaa)O}T)cj6ACt;cQPV-wNZJ;!a@XG^1=5p?91d0mje>h@{OrFCU zP!_UG=*Rpzi&VMV)ch}W@|;Jm}gkC;eni*%!0#k z&vIuzOvJ2-5bwceg8|fMxtW1Ihhu^TJ3LiK&r~BF=MJ z{N*Ll9jmd*o3DeEM>(PEzIrKJZY|v#J^aQy`imB>hOX6hB~{IL{X!^E?f2$x4^|9& zj6!0t!xGy3?^{+h>vLgddq)I);PM@q(duY}!1VV5wh4v?G~Mmh^F z%rC(Bbt1&mzu4({#qzF_3?<@ld*QY~YgGTxhB+^M_?!15EJUM?2s>82P3GIe!)}Hv z9`5O~#vk)`;%cd>-^7b#Zspz=eb`Hu5nCX~BT(r1iAlw+PCV(m9U^UL~Yo~w=G)*by zqQ7aUB>vi4?cuajZRgP!f)v{v2V%dAJcq{63iWP^$S~%=3fyxG7>d1V+#}4TC-+B~ zk$vQnKFcwJzF0;@S2@qwV}$0%J_=Om{lwQO3YnYgO@Rq1=J^M8^J^0g*{0<}+VT!( zd?B&S@Sncp@@R``B077=I#X0Urh(pUvIEH5bhyO{Wu4%kdjJ|KS60)U`l>s56$i^G zpi}p@9&tSrvN1*!k`NTbrd60f71HCy&cR_p1RGbV=6ZOhuA}oCSNSzLYGTdsK=95$ z-~_*Ke=Hq7jJ%VA(D8!6AyjDfXCSBek}NT*(c?C&!9eoY(-law8yGv!hK(M zt&jcL1FV}v9o!mNvtGN^2r+}C ztWJcxi*(E#hT}Ap4lY|ts|W|SC9;Zcl_t`p;fQs!H(>7meYl58NxA01^DXAHCp37` z2}0IX-HljAwpv<~BcmC7)Jj3F`@@1X1r31`K(l5SOSD?+v(uzFBS7uPfrU^{JzM^+ zXF4nlSC?JrcR2HPxL|1&~?H>&+xRNDXYJrU%d5$OF-RKk#WdF$x*( zMrPOOejH!bafLnu6+V-Xft2{3&@5Jmyr2(0tx!B>Jaxx@UU~U95B~+hu6>|%iZ;{l z6kyn@2G-Ak6>jA1a*}2n_OEyy)#A-S4X9IxqisW!Z`bYi+(?x!c7AcGH%g0%%5vYL zs_jVm{^(7K@FB>N2O6b4z%E4k2(pf>m{lJ)m@m`gF44LklO)p`n&ZKFvOhEb=s zK|bdMBWQJy7oCeDb9wS$R(8hAWL7lE0bZbOVHa?|%y8W}`4YFIM2{7B&0*s>By#gJ zK5AltL2hP+8E$p$0nQ~?%;JfqJxIe6A%_sRB|F6@MK$czR@Wo?iG;f;;exeF0!$hFy z9wJCfRVqlPX_~jBKW_l&%jY+5zyMhd>GZ2n0Dux2e|+0q`U4UBPk-$O)`gFv_jNf6 zs;FSN{1Y~~f3d76xpy13E%6y*^e?n!JC=!T;3JEGUYJrOltR}V^?mR6keA4ORr}dS zs~g;cK4_MZ#r?|_iyqiXjWJ!` zR^wdy`BdY?JmAX!>6-1r^AF8nzZ&7EV~BcSE-Vgu2D+vpnq?Gj3=V-@R+LEMpS;|Ux6eo1hYE?r~1Di(R6sH1Gj3az-~^z6PF z9!bWb`e&`{?01C9u2;+%wnpH76vEyoC!p&tHf!kaIAx%-hmD$GHKKl0rW~=wS`qb= zg6Y38wszkpolz~ucjEcu-#>5StOe#cxC*rS7cGHkrEAr9COy&bUy2_l+OV>pdFc3? zj#F|Js_J4GmA@^-5Cmn$Ob3m|`|VDB;>xr;Jr$9Nnx>RZ z(X6vWnRha&@B2LiPdzX3j*$<3cTIm?!nPu)rvSdoy7Q=kbdLyy{`Uj_DyRgES&Xo4 zP&eucs3`}12I!c5Y=_lrzx>0k{vl=@1h=D!mGL!lJQE%IuLojf5%g3!2ENV1M=Izp zgj5aU^n4{8nI=waycBcLO(dyG>josdyBD)6+-(oVxz+qsox9%X6HA8GVol4X#+qJk z=&@zx^yPq~i{GQy`_32uPCTDop&C|o^aWO>&lkin`(o0j!qa^jAi8`+8k0BvFXjoaC!KaWa|DNo@@2f z$2&Y@!}M+|-=5bh+S#p-!M+h)6uu^3iahG94KwwTBY?Smryp@kWDrtuh-kW75k!Uw zccj>M-Ky^2sp}7+G+A43SQ2}T>5lnkMW)U>-UsKPb$?`5*re8G^hFv2=t*3@6UyAf zK$T8Kr1G9t<~3GXkp^znj!M|Q_}8eda54vRb}sIy(q|rG&S&S$Y0~BgcK_C8xD!$Nu|p*WO^a<}`%k-2ka_d{2Y( zhRIMHWF>r-8}0DWb6nO;U5dr{ni93wS8P0Pz-vZ^r z_7U~;I_c5%49kgF+T&H-#95%C^cJJaDLW?H8fXyhwzRoMYg29qozm2cx58`zRCsNI z$s*Rg@+_!U8v&d7P?HRG%-J0N^wgr+`!h3wfLh*%*6(0E=cnWn6&)S2O_su##=XrP zTBeJN>_X#X#9NP>-ORV_9#UXKSi|B8prU~P&P-6txyG^G0gLAGycNjT&)=M!T>B?a z|GW*hXAMouZ2qJ$Bf`@|h5``t+G<0}S+utmCTNLfc&73V9)Wu~ew*412r$opB4R=Z z-7ycMWtx80+3c&Ipg5ZPUQ`-c`CVG$)}&BC0MN)J_B;P<=KoC_aMI22Du@%)x96D; zYws%MznbjSODnLV;+c|gzLPQTH?gA;Xs2ho3i~e({}lSCqNmB*$YJhnb$Yj`OM~wf zSF<7i?ZPHU>!FU6D*DmSaoOe@#p~NQZALRb{a;Lhr?f_zUsn#-xfM^kd6q9dsO8L| z67;!jI_ozcO5$o9^AXe!+TDw+X($t0&!ef*&fGm_n71?rkc>V@*?%XjJME1~>X41Y z_U;>5XU%OmcHO}q4>lAJ{+wJ;dx}&_`}TxG_@Q~m?oIa@?Z(`tBlZ~0Qg(hTEORRd zv*d&PLgaFW+gG4aX=)Pwok~TM?}==SUT7UTSv>!B`+MT=u!d&Z=FijhQ6 zRoSMb0cL41$R+!9I$mdI08VVw^4ZKp!Qeiu#&oH*?muBT>Dr0Phs<_$brRK2NsA3T zg{{eXY8s7XNlFsq=h*Qq`i_!i%h%~rNf9?sA%vyK)DBBs8U=Cu*ly8gbJr;q-8zw> z^Ok0;#B!tES}`i_bbLcV@{ducGiFE3t273e6A0Dq zkXk@suu$9r7Qz$VUK<_=I@?9pJ=?4zyCj}`R6BE9dJ|UBvGSnmf-3pQ3QzW(^aYj&x5hJ{g)kd? z(L!yAdBW+A!ilkLrMzD@xPC#Ag!$yf`6%V>(B~>=;NWC^tYi&`(#0}0Q^aCdt;fiN z8FME+3X{;{X;QH=MqDtudlWGAvA27iaXNB}SHtFG@IOhKeR-X=pBJ(Hcb?TKU-)Vz z&DnR<`0+M167%Df`#qd08=oAH7me> zftB}c_M4o$Vp*<1?*ZJ{g8)7z;bZj}`sfkMi3NmLxJTMvaV9F|^dDbJxCEIue>ITpv9$Gi%M zSCBIPn)!M2ryTP8Hba?X!*8LSjH|oQue%8}FSq(=Djdsn?W8%~hjQiT&=$w?TQoP) z*2xx6HE^44$zGlZ&=7A)La+N|fAL&NIOP|yYi>c`h0iws1$X>MH3X2gh!M{!m-wz3 zaG#ppr=op5z&N#Nvbs$FVNd1;-GA=A*vq9aN&IhI&2i@#%b`uKSi|U3r@`l?2HGil zGjQ8W4wjM?k?c~h+LwJ_TeBvWbyRHQ<6Aahy+k=O(Og#;S^uc`<1PLid7mxdI&Al+ zk=|j1E27rR+P=l{?9h$X)I1ZBw7(xHR|KRSI=>+KigENwK*-l{N&DDs2MamLm!|RE zG@2AH&tTW_l;TD=6=4xk9rLv%t3WyFv&wjV69ndAB}Ro>nfLyUjgrx5&_!5hyjhBP zTW!+&_ljOVvEre;6VhR(=0>Rp9EP~CvQ4==Gr%mtR!-YyYk@meew5&k;w0azS@qIa zocm>Re&kO8Z@Y}Ut|^?~sc>A2LJ9u+il%8pjp)uodp7oBJ(%9#@MJXgPXS>{GiPOT za{o3em)m@P3@CYlzDbM83qRnUEno_2FumUrEUzWg&Gehkv9n9SP*n?DJG>cM*1b)- zS6=D8i*MRV5s6sKh3U2PPLiKZxDWg%W^OdcxxQ~@6E^@+Y`1(XJ*IYo&YOz)sj&hr z!`v%>EdH-Jn}zsnl{z0e1YI@yD9ECLY%rS3IC=xcGQmVdO(p^-kQE$Gx0|DHAp*+k zQh&$qTrK&awlu!ei3lx}KiYI5x;GPQ%a%Wc?R!WAIQ~*frjY}N+~cW0fv1hZ(c^jp z__8_I*4B>Bbub?LIT&lM$Ze9Jpm29tepenMHA2N0f~wcaQUlk<|JwI!@g7 zmYM!O)+O0w&yrxt`S6k#9Yu6kllz~q4i9TheW0)z`s@1sS?7+7m6I;8vm(oE$DA;% zo_@@u&&0=9nC#~UuFVpCFh9!^+f6I~_w^>jpLriA9!3ULG)>ek^F33#_j~y?r0qto z{+v$M0SE`4yX_FwWMQ%00TikcA83@sgulg;wG${&(5SK8S|L|+(;l!Fc{kq8% zZvh+zKWC#!Is0r$au-ek^cgfLlWU~hW?b5?ZszqO5%(m0oW!Sm*}_8yjdQ_#%0}y- zcz4pBw9$KN8FSyPTJ|3jISp^??qJcGx~~^FcXo40FPc^}RlfPiwcav*sa^|4P?^eZb<3${ zBB+eidMf5<^1kTUJO-bEjT|t*{$5&9q1Kwte2>V(r7KuKDI=0PMX5j1Ez06{AU&D? zz=AN83gY+)@k!hVQ3m`EapwLDXpIpf#iz+;Q^d&`G~=~qT?RJ(*<6pAh;0uZ%*r|u z;h>$seOOxvulGVB?XTFQnem;L7gY8YnrYB|+}tcP(kb7vl9Ic_EH3SX3yzf_BS}1E zX|5l9>1QKJXxza+y6C=N=CX38BgXt-kSlzNwuX8fMV1pK)o;x%DZmE&%uh@3?mmbw zsT+VGz~+|%Zs13lILJLodoHdNZHJgQvP=VH7XwmzcTT2{&+hA_+Cf$NQ zYf45PDzY0#(@w7*_{#67hqia)$|nsch~bq%9HXP##RgWkcH zhjh;>Ory{p8Z*rN_Sz=@qGV{7-HjfVO9UJ)lN-~?UeVv^?L1&asnsoHh9)z7U)>V7 z`2!fNF0Yo;5~avXK3oD%^S`O|>2>2Ny~9_dq`vX`wY>6Os*j2817N)tcqa&%Qr`Eu`7A323UZ{6_Vn) zJLe6GNmITkUzY0$K4(_@x5XFao!AT55ElG!yrPyn4&6$O4-2g^Pa1*k{+B7Ac^x58D?S0rz`sS3muzFN`V0g4F&w+8gX+5;d{1`v$wrn2wRsi7 z6&%;Wd>SXX5z;`0?xL5@gLP*zNKCVv9wK%UH1^c(&t+jGi=w{oo-iD^Knpi@ z(s^yi?qQk9%_#d%su`H<|4Shh+!~0w*lm<4u($zsv9J70Y>P$~?rG*qfC2CBL2}>8 zH`9O|Y($xfhh)){W(vPVWL16tLu?pPY2?;vGP3%z_iu|*j@3|ApUuNT0gF!Ed&W@` zgJ-c%!9A5(MB%ty11$9Dd&qeM5Gv?YTif%Ptm8QZ7uxbwNjvpYqd{}hw%!%y9 z-(@|Ilby8-7*hmxE5AXJP)(x8_Zh#J&hkg55F2LC<*WNiu+kf@sg&qvg^H*>^gtS3 zDg?tpjY~l`70z?7B*1EHFG&1YH7G42T>D%wK?my7PluEYIMdq1lH7ja@iu2I@41L& zw1NIIw+gR)E+j=deOFCQEoVoephdXBaW+}WbiLkq4G-X@?sv`b9cl%PB>*T;{@hDH z(!l%WDQ~_SJ6;Q@<%v6WTpr08YZ^Q>i=P@O4pA9ht-mU<#f$4?=JPqpU?Ai>5LHZ9 zBgnm7!u`tBG|N*$PQ(T>QX?*g!lI#uCp?l7;?SBulG*?ZU+&<#CU6PA*nd~4Bi+}t zd*R}?R+`y1+dO9bpfliXZqdshco@WejuJ&q6AVcccA1DjnMsnaa6qKzd)jk%YYuYN zqYctGrYGKdg1uX}=lB}H&Y1FPsc(F6wOFgjj$3Y{6@}bG4Obsnx4Hq<5R9o(!~o1f ze=^ufq6bag+uVKQv#XKgp1=P}$KnG;6W~|_Pp(M4na_guzzscP)w^-bA+>!X^B8T@ zUejkA_zeBx{GCKY%HIO1TJ#Jx#{bntJR$d=KMK4yO;Et>09hyu86xYPy_K2c?Ir8+Tk^Wd?2A z2>$$Kobsd^F*R+JwmMuZA-ws-!9pjg{wfg5x4=r_zkg@{f?j-Lg3;nzSDp0r)umCe z&?l=AFJo;Z3kwVL*hzk#@Q;!0Peeq07kj4Vr9ysNQr73^_jt9D(E0>kwon6noaxDj zC8a6pA3#|A%t{Q>C=adnJ$*e7xwY9qd4fSq6~Y;eX8v|6y&7&*C$e!q!79^n6v%0p z>cTx92knY4|L|HM|0A0H?yrr+ zy@uqL{*A)!3D!o(bK}TcqjzqQ^Qn3I&l-Gf_@t@53`fl6xrvoZk zHAz;Le@bhHwe;UD*BFG|TurUU@zkPT2{lRMaw&47KT%kTUMcXC0oduPE|{MsMo#rz zd+iIDc6uU>&)j5JC7y(RvE_}al%Kcs>(jSnr>kM+AV>tb-|$7Ho1GWHmAzIsyqo7OU#BX5D9GrH=fx`IB4#@o?JU zoO0!&DE4yNs5!XrsAijrUqswyX=98xf3~O92UbKp!2Al^Ns*l9Jl9?F7gj z3+o+p#_Pc#Ztba1yp`zFclol(^1~3~ z?(v-|I+2rwcYcZv)X^GlcaCgb`kcWAu=*n)r@Pfj2TnU%V#;+{J8yG?4L!*}7GHv~ z?Mh7Sh7BRoL~Mn|hb{A$m4ozZ8pA}dcvYoB?&!KkLmBLeI_g8%q!iyXVQaXkVn9kfgtnEjaIy+dREtO-!&PUEMc!o{V3qnc>?r~~UC4j8^SjP{@I zgl|rUIWmBye@!OX7>LrQ0PsN@cAO47-y1KlsHg}+5*e_+DtD9)nEjyi4OXOJePbLq zPz}0SXhCM{v+(>s0npeorGc|EiXVO}azoxO8t(JcO;c+ad zy28waA;M@n{R0pN{`WysMMW3Ldggl>d|{=w5?u_Q(+qq&&YU-?dAG`UwJ|-Y-j>5r z^6cRzM_*v9%GY-6%WnFBn{1=5WUAwitCM{EJ~M6P89(>_MrZ;9N7x9 z?ohVvAhKp~j|E5_7l;nAZTQoiWx2e}%lwk$@1)7{1ZR$d*`zBteUR8E2i*puxt|yS zQN;!KEMr=q6fOXb=`;-DXIAzZKyvic$9AzmdR^?#LK?%5V!PS&7pw(&XhGKr*HuDOiA&Gw&9$ZYA##x^uU8mb9sLQr} zF4g5{ZvV^<Ty8Mv(TsVnLjgdE9YYPNm9 zRTV(?JBQ}gR32Rba61lW)o1OxBm{%sheL7;sr~{$<~~<+jI(2&jmy7rp~fiX z`HJ{Fk|LztY;(V$px_vNEnb$!Nk4Ml>PCMqy{O9&?+N$Yx@R=A({ma-+VeKLS<-!E(zw`vqjijuX{PeUDly3#>VLXm+^on7m0 zrxO9kB{@??k6WI2sV8Ir5{)$md2+MdtcnCB{Ow9ylc(B!eWDX$Ia6cBw)#mjz~8Vg zHHFo&pMvZS6)NxM_zDX32ZG{9FDCz-l}tY0bQ^>;v&CzEG5D;!qW@{1xoSHou|;|T zMzJ+6BVABR=g-I`@NLYs8SIP1oW*iTe?wRvbRfdAo#&8bblr^zyYwk`jkBA+S&nM}q7yfI|7@Z)ybA1+NZoEK;BBjC zO}AvX%u`b5R+eUigzXqilc6dN>)GYyJ7pw?1mL~2ABV-iea)^9nhj=WLfXG+8w8xq zC(v^sQ`nvYqK(H^j-4Hsl?<^H1gs}UWAlwn`|<)>%(Vf6UKcHNAPU`*DmJYow2c_x z9-6QB?Q;5v%C&uVt_`Z2PR#%MfQ->XeG=_F_G)wYNH}flx{{rZP5AqjcTg1fv>bN~ zEt;^>>E0Jh0DJu?qq;Vgls1{YnxD1|BC4-Wq}9_@`?811QluG~a08ZR`jqaLC^krO z_E(GFZmjk&BCk6L0n|F1X7&UwPIU*kR6u>Hx{qg1+=qZ zT`&ec`ao+^U}oBo9RsoC(ZTWdlMwo9%i(op(##tOJy^n90M6gA<2g}I{?|WpD)5oH zL~Bvtg2$AQM;#z{q>cj?G8?S;dgY>t4dhmNGtScl9QS^~Kd|{p_Xw|h*ovknX4{rg zK5jvoK6lr)6?|hbl}Z@NGm!y<7bh)IL+a zR{mqcxskg4sI?9EF0-ZY^o?Yx>v5 z^UljO7kqSt-nFsMIS@-P%GchtgotppY&|m`{5!U@3RV!*^PLT1TxeI{eW&1&lP_0^ zMSKu+g!j*e9U4p7$3wHrV$m19t~?11C21qi67=kzo@OtwHTeQD4aNFotOA!sG z(d1^k>p{~IyP&AOCUKHYIGfVRg#xtowoEv#)z z6ZHR!Db8kHa;sTqeVdzIMVi@fkNm<4G1PAgKyw_2aTWukaU6sBF`EN%t?~L_@>S34 zefVre3Vdhil=J3$49P!xKiIzmOA@qwJ<{^9e}oq{%1`gyT$P-dc+p9QLTAO*ox?w; zTj;br!HucOu-x2k^L`$*!h61(bz5o~*U<`25h*cn7AnEqB?SHevE0#vE=BT3*y_;H z-X1&-+EJ$wug9e^BX+3*cZklKDb+{|WK8K@)X;q&>GGZ6VzWo_@-s}-vj!Gs@1B2Td5gGP@mG18qnvX|-<&c)-3LlA<;e3ig8p{4 z=MEhyi>lIr-@)2=!fbbY1AnN-uFy!N_LYBUD9x{MT%^b*_>X9mJ$F=E1J>LL=$EJc zv>$8#U^y0DN;BwO7S%s^>S}0y3wxU{-i! zJ@fpu;twp45jzgq*`Y0tvjUr7Br|s^Ji&y6flx2Ea%UDmwr0~jet5jS0+Tj6+U=X~ z08(o2tQ^T>+{ax4PoNG}cX_SulXTxgJU4c(5_|-#@BnT}cs^X`S@KpHm#-sW9L)zw z4cB)JHwAmio+EV+q>+N)V;t3WuV5eaTv^O0@8{ZP$4iYtrtey5cScuE6b=&l;=N7&hdD>o?5RQqynn8o*7 zzHXYxp*LdaTE_lhCb5M@5JAraV$p(g%Ud+tF&}7*n^vS3eInDCCw^T>rXbR}gb7P{ zMyjtxyPQUO>b_oG&$CFL^H=m{V`j z6KpwZ&u~N^5T$S2%&gWQllghImlYe+cpEYpByvu;3U7CwOnNdUv7?F7ASm@Tb#-Ea z_~s+DgYl*`X!wRNB+g*^Ntup4M!&q+d9|gHvVO{V{&T_kL@h^hjq>tm&aRV(*7_Us z=r+_XVilY*t3wAJ_>Ug?lb9NDbiVk8rCqenF_EhyHY#zZ$Fc3h3|8#72Q;ei+uk!! zOrNzKx{5JeN_AdEQo%XZK;N>hlj_SoumzF zG%uXx-O_dU3!6xRN&jr;f1SR6N|`6}8vMTE9sI#9c(j1$^9+ytbC;q0nq8&J>qg9-7YBD>*DuE`wwJ4t(vORtL(jD$BIiZt z^S2WQz?ynHZM&ibN>;7g40}U|n#9yasfe1?di6Tv@7xClwC`>v#j^yTlK-mxTUlSA zQQ%f4%As|;s--~&SEd`F6XpLW+R`x{hC~rBXpmf@pJ~9zx0qKg2EWaESo=|3+gS{W z0akq@0vDM(TzWO2$(TaORs6L}txfkhI|fHaEby&b+eZ~##Ygl|e9tCpu|slT1|hh7 z@YSpGvEUqoec(2EDxI3-1YZI3#H;w-`JXR}b)+hpvE{+%bZst3C45bKH1B0ciFJRv z$&C(BWr()O(f&eC>4%w@!AWZREsNpIV%>)ML4}w7pDgV!JTx?23WpW~@u?y;N)NC@ zC4Nj&*MTuuQZ+N~d;!19`l+3t$kQ4XY%$v`+W5fgYzjZG zS3|!9CtB!LzWVIxkDK4)4QC%HtW}&EAA!aFs1Bp5h~b~I^q0*zN-Nj<2TxwPP5Mf! z{!32}z4~hA$GbicnI)<3o4kor#l!O~evb?VyLoNQu>$dLEgZ{y!5|}<*XW7>s~W>R z{p)m)I7OknI?>pD4+-lXtYY8j#K>^753yUEeM{Tz)J3^>ZKlK>a%_e3gF?2}Bm^7A z@b*{2dx?ub-AF*7$ij5^>)f#!HrvwlQ#k4#DkkHeioPqeudxD4L}EP(OA>N+C54_7IBLWR7{QV4{}(ZOF>C4{hlM99 zN8`J!aXB9&4>e>)qUi5)V&{3)rQ6>qV(y34gLTxL4y5SP4V<%2w*kkN&uWP9#@%4Y zNsF91V4=z@|3<(H5(;^9}EgjQ^G|(({I^T&7Ts1|& zI>cY7A$yX@PDp~B3GI~2M3ftC3)eax3LrNpv&%}DBfCt}qcXF04%`>Y*#5|6@s~Vd zj?kTypNZ6P2(RH?f5(m{1ZKZmnqZ~mOW~uN^^(GZ_Ufhf`>E*eN8dTNG(J|Gn%NWC z_>b9I7-YPd5+d(+2jxlMf40D4fW1>8mT`s%#aVb5tWCz=CY5?-ik@YYydFm&<`Wvr zA#Iv~#XK47V|!!1OzafB%fhT1G*M4YB&^Ne;+cFl<*+9o9a^1|zu4nuEX>bGJ>-8| zuMnO1J?uSG%@cg7AX|U$o#i-5iA1+Nu!N~>LrUf;g}X10wQFEKS^WDX-22x8eshj^ zoymc-B0A`Ce8rzW#?#c7kma&&N{%v3vFm{eMgRd;pE0E5PuClyg5wmt`Rf6sPq?I~5;4@_`trQz<%KF2WcIzAuet|sNOFdaMCto< z9Fwa`vS@m*X-|i(y>H!yuSlnp>+d@19Af$9Un-=o!DjQk<@!PNFf=xn-FsbW%rAqh z&;XXyoEjKg8u*%;grVWy&qDwEy=PKvJg_zPozuUQO; zfg!EmEokofy`FKj_*7KI3tTWTdlKP{gi*$~^ka>A|H5HI4I>0L0 zGm%*F?&o!qG0ZFibcwMogK0qNE9S|$)7F5hb%5|7%(22z<-y)BA2U5mlT}vqYSWBz zSC!a^1de7Eu}b5?U^ID^d6d^4t=ien6MSCWFiCEqSLPu^Z~m0)C?nn8EWQJYiZF01 zI$&z*ao$WS6gEt_#%s-r?#Zg4s6&;~eClx8r;EztMNFv>g*Ob!f zmn04d)n1-@`7X5ZVT{1}5@9WiUrs*@cH04;=La_f8XK&<_ot8?O3ox2F6|B#%XoS@ zb&jY|`&OA`Vp>QCjKW1JtB-F-+ziI<%*N3^23>3vG0chW!MFhTDV<7MLbUz zb@88DSARWF(Ju1TxM))>SP*b>3OS`pKa6~Nn}Mygnz0xWAre(xr~wtx9_HrDX#x5nSk!g0u4l!r={5@UMoI?1PO;RlwIpz03DzvX0r8y zcm;8D`PB3kwk+^&m}Mwe3^Uvn9%6D~zjR%AUoK7S^+X0)0-s7*tB{KfHPKT8igI;;vZEk4`B6!&Gn~YI>i9XP(6GDtdeHR zF_>+~JWNka>rUI}_6T8KdNlUhbHfJJt6^+S6Z6+Lc3iBuoxF*|bVskFN)FC>=C3TX zpt1Cxu~Hb){hyv7=)dY(>>js58NGm0{ml@PO{g!nQVv9-Kz?fJRD?pCJdi z1FRA+14Gqd691yE+%zp>a)+_A(P)ASwhv+HTaLFcw$RglwH9EmNqGfu)a{M}zwhELzE+0wmLEfmEEaJ?o`bfsatR{-XDkrWt^yh8C@>-aT&gA;~q`I=VglA6K&SC!`7Z=)i zBMVOQ$g2<&60!dp8Bh|Y4$|l`-@&b8%Cs^Z%((Z5?V!^&kdx3hiAnrB5WRTAt&XWe zUD;Pv&>t%H8&CH|k_vSM-ai3jVvcHXKuNO((BS#{T-(j7rszSMkYK zxtAS&8l!B}*mICP5RMI6gAWsV=bdPFn!BKrGa0p z`Eb_vM#bvNWzpGBCi9gNg;y_~Wy~;Ua3)=_fqX-YdAkRD9|H%m`$++dKatvpH2lJl zCXy?DqHnq2A|tQ`zwLe8>L^EJcf#w{hyO(JBY$Mh|A``E2Q`ZVJ@J=lUj6g7H&^!R z1)0B{P^|2&e`eWjo-qCU!i3-BN?kk%Ps^cKq*${BJ-ql#t6fQnFU5BCG!EODu(@=~ zBGXo(*3zmGUt?o9E^|MPBs$}+*H;BIAA9EXw1Woix37+WM=h5ZGvtMx39P51$hozcmdTkY1 z=!LOiyiP?h&+>lnnR(o%4eJ z+7VRhHMlI=3e#iDs~w=k@OGLvR@Sk@-tM{ClOMb$T&;S_nHsh)o!KAml_kJe zUvkIk4#zcdy=QZk%7XL}1}SY=#WGq`)HPIF<b=~7o? z=7e4X7+NrF2BSs#0gzNq$F?i0M}S@Y(v3Q+xv1NRuXA%l@mhd=(A0~a zhhtU@r&XQOS+9Y5KCpn&jPP&Ne0aGd&E#}2bY-&wI`em@F(#8``h%j2GlGSgAnir4 zWkJ}8kmu&PVJJ{fW%qxnYJe6=p?QZh)mxCq{9eZ-*iu5V2bE6@Gq&>}%Q}1N@1MU6 z(IjhHI}lF!>NXHglFb3X_aSQ`288o0U{o#Pza#ST{=2>i#QK{B)%3C!;)}|TCJQA#B&{EbF6z#^X)1=|zna$U_ zV{nJP>PO2!crfVfi(pu_9`A8Qe;?ffKu>%`X`DvA4`t5y6Dd*0ep0@)jx#k=5QvP! z-Z8GS96aM$I4KbMrAV#y2Vs|uP+dnYl^}d7-KfE;`lar3PN@?ok#;RU`UyN&LNw&MvPh(-alwwv$o&AT~Y8$X6Qz2PQUVt3rSWL^W&rxj_u4aVmT55=(zJ7|D6dy2q}^2e*Y)HzWi8KI{*5SetFVS5`Y; z`))_ksW7s-TJOb8zS*CTew^`-YiZWATLqNq*Eitjm&m<0*(dR@c53gLJk8OIs;@JX zktV2Xe$U0`B~O+~pIA~umsLNMR!74ENB1&1pc=n=xCv(*C8fT4q)FIvGftIGSxhGI zc)vy7lD>Pz%l*!*5P9xLV|)wSqr4p$9emrGsRDFFuAJ0c)Sf{BJ7;&}@pc-ubmhyP z2lJZ-q}+kFB8L@5f-K&&GODN3m>A>&Jc-xrK{3NuI$WY*cd}wNi9!7u57{G=Hp3-i zIZ5No30~Eskpm$5*1EI)j``v?%g7o7cYRnJtEA~91NY5{9+!5P)F(kiJffN>T?sUO>Xx&T3oT9mL34fvM#a-IiCyWPLRsghIM*m!I2N2coM zr+lcSY9(8N3D0b6J9E0Dl!o%rtay#}C0};T*{Ga2q3s#NVv`E3ZFto~!Y1f+G`YNh z@f;ufu825aEPN&c(>L&_B(mlhg9eh#`^ zXT4q&EjMzgKv|~gwDUd?o2D$x#5j;>5Th6V;E zqVF~H`Ehu9LWp2=7WSk5u)x1CQQV>apJ7rEc0!%R9O=84?QB1u&nT7RiQNGL-jZJP zG;IYqn~BQaP=A&za4#)(aWj zDMELTk3?zU3w*w-w_qpIc|Iss);y%P(zhGRo0~X(u-#9NVShk)U*vOqAhEbr*mJ?= zEZR6ax@`H3>M|V$BJ1-g?pDR=zrebpk3-okO+{*b@;hC7*^(#(2O8d!`Zaw~}6FX=@HOKrAkL^?UNT)m=HY;48&{_iJS8 z>&8#oy{6vw|Jqk+&#l}B75UaBgz`7q`atf_++i|-`M2K?F6J3AZOrI=uOO&HOzPHwKa)FNDNP_tW6!ck69h?9oB+1 zW_KyMbGYgF=<=@^wm-~ZnK>+>IZrQrd@(+*KloVmj====?DC4z<1PI#YM+NAd^HJ` zUjjRyS$6e&`_B#5Cr*Bsujeg;z!^W{&X2JyfYzJ;oEdmh}FXoP+dH{Vom{zJj%U zN;A8xoUcEmaFKsQxdV;1q}D7U~YGU%C=P z)f|zW~&ooG%$tznWki6k;HxNf6ewGDQTUf+sNkqB1{xp1@$S;@(KG5>Rni2`qoW4 zO_L8^7lRWOUMP`>0Fxizpsw73yHlObonG4EK#2UcWLeQof9M_$mWY1b^_9&bv_a}S z;l0%^7m2)m=7O#nuRrmb+II4J7lRam8K@a9Arg5F-_q@HxP$rW@)E;oL5_ePPTh0x zcpZ8TKVSQ9x=5|j5S!;CQ$CZ^FQ}koqjihiZ;8HFKUp|CeWbW>Psyk{6{g2yFR^$S zE*yomdp*>ge;y8WS67!_0^5Wbm4T597*go+epMlj-GS|Sj+m`0waQW}u?RTDh8Y+? zrL<`5D%GLGgYnlPK<}WRFdgk@K?J@xE3DbI(wpWow521Lb$P8@pTG3}&r9^KBf{R} z*B8V37%A$e6vP2Z)2esf-d|@pBf-|*?D1bUPKzrQ=+|xw@qZ)JT?RPNN3Bs0-$K%0ylR9&YHZ$zeGt=?$u&>O_cIIFBq*8ze`k#Mq_wes2 zbW2#!^&bsZ`X|Q30!_rFjg0))Rz;Hq^YUM$bo}$A>TukqJk;$%1g+V`7UZC`HM7W> z(1>cWlkTPl84O!Y6>l$i85H0XD#)d4x3nXcZ?NjkA8IZ1Jeov?qsG^?-KmQ4o_yuY ztfW!FyK4R9{`MV%dhf!4oev)w9!A%w!O^oH4qPv09YFyy`I3ZIE zFCt6eFokK__w(DC5B&d)OkE^hOAf@YMIP;bQhK3j;ZnZ9{w+ssj!Z`L*d zz+~`>kTSyU0A?Ysj;+Q);2e!=m$ts}O_^6-Gg(c^8Z=98{dh|=g=e7BJ#j}`4J_P* zLT<2Ahz7aWZHok^MxYbX0w6%8Y>4j%+=d*~U_Oo)u2l*%i#hk&+nasymBzV+`EFe5 z)yIP4F2{Sv`o5nI!~^huH+6cu`?jj}WiB71mi8=gEugsT`Fp6WFPt?%|3<>>+*Gzz zm7odqb;&~e8*KC4;eHXwP^Ndam{)PNtsQaXd*pq6MiKeU{CIe5+nvFJM^Eb6HFt4; z4280IhZ6(GiKFDw%vzp&s;mA+GVAY!^m1hru5CvsD=SOkmhuecez9tKM48;y&@+oz zrn#zGEUa{9zQW{u-$bLvcVMa=&;a(ds<7$tiu@5u?&D#-`f{dHazo@)f<8 z{p5a9IwYDfWy#qAb~3P+xQ;y`#6l_Kuj)vduUCRjrS)5!eU)elToP&O zftM!}i>E(Z5%WsWn;*OH-brE<7W&R&_snZVIA2TaG>T?c>~dklch)id5ZgjL)Q?4j zeF)-UXylx#;)(Ps%Y03D&4_fpe98m5usrZ^9Qo;A;T-*`P<7Z$Ll5U>{K$5w>w;N? z)1h{bFW5tHB~A*VMKy*g%P5g&H5wb5z*%ux$XP9{317RPsF_Zdw`l|hVx8m>g#5tD zPMU-R+}?h!G=*#cjdwQLjpK$%6Dm^S34O>c9{LuuDihYqXt7vY#g64#iUe2imaDcl z{ec4|lBG^VuMy#WbA#Wo=UJ=)ayNv_@682(?&itoQt@_FI;0r(AE1H}%{I!SYB9~?@Tu%CMaPMZM4Grl5y5g8>~*bPTz2692HV(wsdEoQzd)|@8!Bkku(|so$r>s zrmN#s*;SZwm=wr0)r3^d(u@A5ts=6rkyOiFjKVDRr1&BWwNlzRj%=i1V-ehc_k99+q-GXjU(F zmMUfku5VY$8D@lhvQsvN2j!xMro+E=3x#1FntBX_q;$186rFIf842w6W{jFkd2n+{ z@=NDBxj_%RDLdcS60FgFm@{A#!p5#~eKoR2@Eg{ku%rF)-E+)_fAyL>5D5y_tac>t zR(DgwZ?pR?X9Y64y!z9;FI7L*NMZGu!n)~I*?#7&#tJkw>(zedMVL036eL2kF@aQf@lAG#GS+%I?W(gl|{Ng08&Lt|W){ za2s;eHTbFcz^_2nrUBw1LlB($g?Y|Ol%ndo(^*|&7^poOQ&8C#Ck)7a&M_?D>(2bV zI~|zqtLWcs@vC4btv&>TDY+}gY$)_0*7G(+F_tK?u0mCT=)(Sft%ESV-acLX+XU-? z^gX&sFoC?XEUbnJBt6=&8|egEWUNTXZmL&mx?*Wln&*cG#Xr4!$CaNUcVYD!Pzsae z3=?3$9gziD)hOoWLm3hoz8J~!mfbS=jO1DS|68p;kglTXyU zl_B93!hlU>jKDO5N5lrBTg)FJ@~z!9`*PrSw|7E_JCq!BctK9CVY2cpuk#7yz|RO) z8mOP_P+Z_?Eq0li7Q(CH>~mC}xf)NJ4X{afMJTt5`_pxYQgitLp>Afb-c;a zP^%C9oJ8&C&vsx>`Chae#xL0JO?7%flg~gq!3pkI75@e{Wi{1ozY)fl)TA~sgg?y^ z8z9=iBKhC@@j#fF4Rwl@0S>24aG{!_h|`{~0f_y0ez}LSc7A?nPYS2bMO&&y(^&h* z$mnbrT}0Ya0fKh|{)@&}szxPPzxJc}9=tc&IQ8lXq~gS*EimUwFO6 z|75Wd7-c9q?USv>)c4MiN2$?D7NH-$y$Uk}d1Zs%@zUaf<7F(S9k#y_SRK4g*ad-(9wuIFU?tigX(5fOEB{ zZF?`fjiqb5N0K4Q)F<0M_ncAVAcxVtMUcv-zB9rj?wm+cS}`~SGt++|;O=+eh^Viw z{<3lxV1h0eo)$hWe`|8YKM_C(;rrhspQ9)GbuAVvw>LJ!#WS?z&U&$_TsQl>o~g_m^?(Z9%D3$2=UzXi26hlwXpH$LEvyM{@to2x}j9zWjUiPDn~K|A113F#xe4 z)K0q0U^p%oy{&nWn3y;v^S>Vk{>oPo1KRh+-OBn;>)=T*Ihm0kDSLe%&fT|=7D+C@ z>NRS>RXg=+hK^~r$#_}_q5b8ldjuL?U0Gf2@reH$r>nCw_`2YI|35t>#D5=CM-B93 zdQF73QBhGz1Zi6bxj6^9tGfocgI`pN@(L;tc}0lAWpf1;b$MlVWknfz1$BA(fJQIm@6u(%d4s@EB)t!Zs&SgZ~>LRwh6T1hEx3i0Ixoi4*&oF literal 0 HcmV?d00001 diff --git a/src/game/C4Game.cpp b/src/game/C4Game.cpp index 8fa12a6d0..74440d868 100644 --- a/src/game/C4Game.cpp +++ b/src/game/C4Game.cpp @@ -75,6 +75,8 @@ #include #include +#include + class C4GameSec1Timer : public C4ApplicationSec1Timer { public: @@ -3609,6 +3611,33 @@ void C4Game::Abort(bool fApproved) Application.QuitGame(); } +static const std::unordered_map str_to_icon = +{ + { "Locked", C4GUI::Ico_Ex_LockedFrontal }, + { "League", C4GUI::Ico_Ex_League }, + { "GameRunning", C4GUI::Ico_GameRunning }, + { "Lobby", C4GUI::Ico_Lobby }, + { "RuntimeJoin", C4GUI::Ico_RuntimeJoin }, + + { "A", C4GUI::Ico_Controller_A }, + { "B", C4GUI::Ico_Controller_B }, + { "X", C4GUI::Ico_Controller_X }, + { "Y", C4GUI::Ico_Controller_Y }, + { "Back", C4GUI::Ico_Controller_Back }, + { "Start", C4GUI::Ico_Controller_Start }, + { "Dpad", C4GUI::Ico_Controller_Dpad }, + { "DpadLeft", C4GUI::Ico_Controller_DpadLeft }, + { "DpadRight", C4GUI::Ico_Controller_DpadRight }, + { "DpadDown", C4GUI::Ico_Controller_DpadDown }, + { "DpadUp", C4GUI::Ico_Controller_DpadUp }, + { "LeftShoulder", C4GUI::Ico_Controller_LeftShoulder }, + { "RightShoulder", C4GUI::Ico_Controller_RightShoulder }, + { "LeftTrigger", C4GUI::Ico_Controller_LeftTrigger }, + { "RightTrigger", C4GUI::Ico_Controller_RightTrigger }, + { "LeftStick", C4GUI::Ico_Controller_LeftStick }, + { "RightStick", C4GUI::Ico_Controller_RightStick }, +}; + bool GetTextSpecFacet(const char* szSpec, C4Facet& fct) { // safety @@ -3618,19 +3647,12 @@ bool GetTextSpecFacet(const char* szSpec, C4Facet& fct) if (SEqual2(szSpec, "@Ico:")) { szSpec += 5; - if (SEqual2(szSpec, "Locked")) - fct = C4GUI::Icon::GetIconFacet(C4GUI::Ico_Ex_LockedFrontal); - else if (SEqual2(szSpec, "League")) - fct = C4GUI::Icon::GetIconFacet(C4GUI::Ico_Ex_League); - else if (SEqual2(szSpec, "GameRunning")) - fct = C4GUI::Icon::GetIconFacet(C4GUI::Ico_GameRunning); - else if (SEqual2(szSpec, "Lobby")) - fct = C4GUI::Icon::GetIconFacet(C4GUI::Ico_Lobby); - else if (SEqual2(szSpec, "RuntimeJoin")) - fct = C4GUI::Icon::GetIconFacet(C4GUI::Ico_RuntimeJoin); - else - return false; - return true; + auto it = str_to_icon.find(szSpec); + if (it != str_to_icon.end()) + { + fct = C4GUI::Icon::GetIconFacet(it->second); + return true; + } } return false; diff --git a/src/graphics/C4GraphicsResource.cpp b/src/graphics/C4GraphicsResource.cpp index 56cf7af83..383a91ac1 100644 --- a/src/graphics/C4GraphicsResource.cpp +++ b/src/graphics/C4GraphicsResource.cpp @@ -128,6 +128,7 @@ void C4GraphicsResource::Clear() idSfcCaption = idSfcButton = idSfcButtonD = idSfcScroll = idSfcContext = 0; barCaption.Clear(); barButton.Clear(); barButtonD.Clear(); fctButtonHighlight.Clear(); fctIcons.Clear(); fctIconsEx.Clear(); + fctControllerIcons.Clear(); fctButtonHighlightRound.Clear(); fctSubmenu.Clear(); fctCheckbox.Clear(); @@ -218,6 +219,8 @@ bool C4GraphicsResource::Init() fctIcons.Set(fctIcons.Surface,0,0,C4GUI_IconWdt,C4GUI_IconHgt); if (!LoadFile(fctIconsEx, "GUIIcons2", Files, C4FCT_Full, C4FCT_Full, false, 0)) return false; fctIconsEx.Set(fctIconsEx.Surface,0,0,C4GUI_IconExWdt,C4GUI_IconExHgt); + if (!LoadFile(fctControllerIcons, "ControllerIcons", Files, C4FCT_Full, C4FCT_Full, false, 0)) return false; + fctControllerIcons.Set(fctControllerIcons.Surface,0,0,C4GUI_ControllerIconWdt,C4GUI_ControllerIconHgt); if (!LoadFile(sfcScroll, "GUIScroll", Files, idSfcScroll, 0)) return false; sfctScroll.Set(C4Facet(&sfcScroll,0,0,32,32)); if (!LoadFile(sfcContext, "GUIContext", Files, idSfcContext, 0)) return false; diff --git a/src/graphics/C4GraphicsResource.h b/src/graphics/C4GraphicsResource.h index bc83798e3..95456813e 100644 --- a/src/graphics/C4GraphicsResource.h +++ b/src/graphics/C4GraphicsResource.h @@ -83,6 +83,7 @@ public: C4FacetID fctButtonHighlight; C4FacetID fctButtonHighlightRound; C4FacetID fctIcons, fctIconsEx; + C4FacetID fctControllerIcons; C4FacetID fctSubmenu; C4FacetID fctCheckbox; C4FacetID fctBigArrows; diff --git a/src/gui/C4Gui.h b/src/gui/C4Gui.h index 51bac6147..ff7facb98 100644 --- a/src/gui/C4Gui.h +++ b/src/gui/C4Gui.h @@ -94,6 +94,8 @@ #define C4GUI_IconHgt 40 #define C4GUI_IconExWdt 64 #define C4GUI_IconExHgt 64 +#define C4GUI_ControllerIconWdt 100 +#define C4GUI_ControllerIconHgt 100 #define C4GUI_IconLabelSpacing 2 // space between an icon and its text @@ -627,7 +629,11 @@ namespace C4GUI }; // icon indices - enum { Ico_Extended = 0x100 }; // icon index offset for extended icons + enum + { + Ico_Extended = 0x100, // icon index offset for extended icons + Ico_Controller = 0x200, + }; enum Icons { Ico_Empty = -2, // for context menus only @@ -705,7 +711,25 @@ namespace C4GUI Ico_Ex_Update = Ico_Extended + 14, Ico_Ex_Chat = Ico_Extended + 15, Ico_Ex_GameList = Ico_Extended + 16, - Ico_Ex_Comment = Ico_Extended + 17 + Ico_Ex_Comment = Ico_Extended + 17, + + Ico_Controller_A = Ico_Controller + 0, + Ico_Controller_B = Ico_Controller + 3, + Ico_Controller_X = Ico_Controller + 17, + Ico_Controller_Y = Ico_Controller + 18, + Ico_Controller_Back = Ico_Controller + 1, + Ico_Controller_Start = Ico_Controller + 16, + Ico_Controller_Dpad = Ico_Controller + 6, + Ico_Controller_DpadLeft = Ico_Controller + 5, + Ico_Controller_DpadRight = Ico_Controller + 7, + Ico_Controller_DpadDown = Ico_Controller + 4, + Ico_Controller_DpadUp = Ico_Controller + 8, + Ico_Controller_LeftShoulder = Ico_Controller + 9, + Ico_Controller_RightShoulder = Ico_Controller + 12, + Ico_Controller_LeftTrigger = Ico_Controller + 11, + Ico_Controller_RightTrigger = Ico_Controller + 14, + Ico_Controller_LeftStick = Ico_Controller + 10, + Ico_Controller_RightStick = Ico_Controller + 13, }; // cute, litte, useless thingy diff --git a/src/gui/C4GuiLabels.cpp b/src/gui/C4GuiLabels.cpp index 1305920d8..9db88cb0d 100644 --- a/src/gui/C4GuiLabels.cpp +++ b/src/gui/C4GuiLabels.cpp @@ -428,12 +428,18 @@ namespace C4GUI C4Facet Icon::GetIconFacet(Icons icoIconIndex) { if (icoIconIndex == Ico_None) return C4Facet(); - C4Facet &rFacet = (icoIconIndex & Ico_Extended) ? ::GraphicsResource.fctIconsEx : ::GraphicsResource.fctIcons; - icoIconIndex = Icons(icoIconIndex & (Ico_Extended-1)); + C4Facet *rFacet; + switch (icoIconIndex & ~0xff) + { + case Ico_Extended: rFacet = &::GraphicsResource.fctIconsEx; break; + case Ico_Controller: rFacet = &::GraphicsResource.fctControllerIcons; break; + default: rFacet = &::GraphicsResource.fctIcons; + } + icoIconIndex = Icons(icoIconIndex & 0xff); int32_t iXMax, iYMax; - rFacet.GetPhaseNum(iXMax, iYMax); + rFacet->GetPhaseNum(iXMax, iYMax); if (!iXMax) iXMax = 6; - return rFacet.GetPhase(icoIconIndex % iXMax, icoIconIndex / iXMax); + return rFacet->GetPhase(icoIconIndex % iXMax, icoIconIndex / iXMax); } diff --git a/src/gui/C4KeyboardInput.cpp b/src/gui/C4KeyboardInput.cpp index 7cfb8c384..b4f209808 100644 --- a/src/gui/C4KeyboardInput.cpp +++ b/src/gui/C4KeyboardInput.cpp @@ -333,32 +333,32 @@ StdStrBuf C4KeyCodeEx::KeyCode2String(C4KeyCode wCode, bool fHumanReadable, bool { switch (Key_GetGamepadEvent(wCode)) { - case KEY_CONTROLLER_ButtonA : return StdStrBuf("A"); - case KEY_CONTROLLER_ButtonB : return StdStrBuf("B"); - case KEY_CONTROLLER_ButtonX : return StdStrBuf("X"); - case KEY_CONTROLLER_ButtonY : return StdStrBuf("Y"); - case KEY_CONTROLLER_ButtonBack : return StdStrBuf("Back"); + case KEY_CONTROLLER_ButtonA : return StdStrBuf("{{@Ico:A}}"); + case KEY_CONTROLLER_ButtonB : return StdStrBuf("{{@Ico:B}}"); + case KEY_CONTROLLER_ButtonX : return StdStrBuf("{{@Ico:X}}"); + case KEY_CONTROLLER_ButtonY : return StdStrBuf("{{@Ico:Y}}"); + case KEY_CONTROLLER_ButtonBack : return StdStrBuf("{{@Ico:Back}}"); case KEY_CONTROLLER_ButtonGuide : return StdStrBuf("Guide"); - case KEY_CONTROLLER_ButtonStart : return StdStrBuf("Start"); - case KEY_CONTROLLER_ButtonLeftStick : return StdStrBuf("Left Stick Click"); - case KEY_CONTROLLER_ButtonRightStick : return StdStrBuf("Right Stick Click"); - case KEY_CONTROLLER_ButtonLeftShoulder : return StdStrBuf("Left Shoulder"); - case KEY_CONTROLLER_ButtonRightShoulder : return StdStrBuf("Right Shoulder"); - case KEY_CONTROLLER_ButtonDpadUp : return StdStrBuf("Dpad Up"); - case KEY_CONTROLLER_ButtonDpadDown : return StdStrBuf("Dpad Down"); - case KEY_CONTROLLER_ButtonDpadLeft : return StdStrBuf("Dpad Left"); - case KEY_CONTROLLER_ButtonDpadRight : return StdStrBuf("Dpad Right"); + case KEY_CONTROLLER_ButtonStart : return StdStrBuf("{{@Ico:Start}}"); + case KEY_CONTROLLER_ButtonLeftStick : return StdStrBuf("{{@Ico:LeftStick}}"); + case KEY_CONTROLLER_ButtonRightStick : return StdStrBuf("{{@Ico:RightStick}}"); + case KEY_CONTROLLER_ButtonLeftShoulder : return StdStrBuf("{{@Ico:LeftShoulder}}"); + case KEY_CONTROLLER_ButtonRightShoulder : return StdStrBuf("{{@Ico:RightShoulder}}"); + case KEY_CONTROLLER_ButtonDpadUp : return StdStrBuf("{{@Ico:DpadUp}}"); + case KEY_CONTROLLER_ButtonDpadDown : return StdStrBuf("{{@Ico:DpadDown}}"); + case KEY_CONTROLLER_ButtonDpadLeft : return StdStrBuf("{{@Ico:DpadLeft}}"); + case KEY_CONTROLLER_ButtonDpadRight : return StdStrBuf("{{@Ico:DpadRight}}"); case KEY_CONTROLLER_AnyButton : return StdStrBuf("Any Button"); - case KEY_CONTROLLER_AxisLeftXLeft : return StdStrBuf("Left Stick Left"); - case KEY_CONTROLLER_AxisLeftXRight : return StdStrBuf("Left Stick Right"); - case KEY_CONTROLLER_AxisLeftYUp : return StdStrBuf("Left Stick Up"); - case KEY_CONTROLLER_AxisLeftYDown : return StdStrBuf("Left Stick Down"); - case KEY_CONTROLLER_AxisRightXLeft : return StdStrBuf("Right Stick Left"); - case KEY_CONTROLLER_AxisRightXRight : return StdStrBuf("Right Stick Right"); - case KEY_CONTROLLER_AxisRightYUp : return StdStrBuf("Right Stick Up"); - case KEY_CONTROLLER_AxisRightYDown : return StdStrBuf("Right Stick Down"); - case KEY_CONTROLLER_AxisTriggerLeft : return StdStrBuf("Left Trigger"); - case KEY_CONTROLLER_AxisTriggerRight : return StdStrBuf("Right Trigger"); + case KEY_CONTROLLER_AxisLeftXLeft : return StdStrBuf("{{@Ico:LeftStick}} Left"); + case KEY_CONTROLLER_AxisLeftXRight : return StdStrBuf("{{@Ico:LeftStick}} Right"); + case KEY_CONTROLLER_AxisLeftYUp : return StdStrBuf("{{@Ico:LeftStick}} Up"); + case KEY_CONTROLLER_AxisLeftYDown : return StdStrBuf("{{@Ico:LeftStick}} Down"); + case KEY_CONTROLLER_AxisRightXLeft : return StdStrBuf("{{@Ico:RightStick}} Left"); + case KEY_CONTROLLER_AxisRightXRight : return StdStrBuf("{{@Ico:RightStick}} Right"); + case KEY_CONTROLLER_AxisRightYUp : return StdStrBuf("{{@Ico:RightStick}} Up"); + case KEY_CONTROLLER_AxisRightYDown : return StdStrBuf("{{@Ico:RightStick}} Down"); + case KEY_CONTROLLER_AxisTriggerLeft : return StdStrBuf("{{@Ico:LeftTrigger}}"); + case KEY_CONTROLLER_AxisTriggerRight : return StdStrBuf("{{@Ico:RightTrigger}}"); } } else diff --git a/src/gui/C4StartupOptionsDlg.cpp b/src/gui/C4StartupOptionsDlg.cpp index d1f89c0e9..5ae86a329 100644 --- a/src/gui/C4StartupOptionsDlg.cpp +++ b/src/gui/C4StartupOptionsDlg.cpp @@ -212,7 +212,7 @@ bool C4StartupOptionsDlg::KeySelDialog::KeyDown(const C4KeyCodeEx &key) // --- C4StartupOptionsDlg::ControlConfigListBox::ControlAssignmentLabel C4StartupOptionsDlg::ControlConfigListBox::ControlAssignmentLabel::ControlAssignmentLabel(class C4PlayerControlAssignment *assignment, class C4PlayerControlAssignmentSet *assignment_set, const C4Rect &bounds) - : C4GUI::Label("", bounds, ALeft, 0xffffffff, NULL, false, false, false), assignment(assignment), assignment_set(assignment_set) + : C4GUI::Label("", bounds, ALeft, 0xffffffff, NULL, false, false, true), assignment(assignment), assignment_set(assignment_set) { UpdateAssignmentString(); }