From 37129bbe235f1ca7d1b0e15a2c095603fb17bf31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=A2=E1=84=91=E1=85=B3=E1=86=AF=20=E1=84=82?= =?UTF-8?q?=E1=85=A9=E1=84=90=E1=85=B3=E1=84=87=E1=85=AE=E1=86=A8?= Date: Sun, 10 Jun 2018 11:46:23 +0900 Subject: [PATCH] Fix: RoundRectSetting.x, y --- resources/image/ui/hand_left.png | Bin 0 -> 14975 bytes resources/image/ui/hand_right.png | Bin 0 -> 15291 bytes src/game/lib/app_button.js | 70 +-------------------- src/game/lib/back_button.js | 3 +- src/game/lib/fullscreen_button.js | 3 +- src/game/lib/game_app_button.js | 25 +------- src/game/lib/round_rect_button.js | 23 +++++-- src/game/lib/typing_practice_button.js | 18 +----- src/game/typing/practice/game.js | 15 +++++ src/game/typing/practice/key_button.js | 83 +++++++++++++++++++++++++ src/game/typing/practice/loading.js | 2 + src/web/client/typing_practice.html | 3 +- 12 files changed, 126 insertions(+), 119 deletions(-) create mode 100644 resources/image/ui/hand_left.png create mode 100644 resources/image/ui/hand_right.png create mode 100644 src/game/typing/practice/key_button.js diff --git a/resources/image/ui/hand_left.png b/resources/image/ui/hand_left.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0165eaafb1a9efe8c808c349a42bd4a3c464cc GIT binary patch literal 14975 zcmX9_1yq$y*G0NPO1cE3J1!w82-1D&kOrwsH%PxAA>AM?Eg;=_rMp{7L|VH3;rm_d z>RKo=&&-^&_t|?t5vt1XaWKg-5fBh?O+!)(CH6pk~f9&%jIua6+gzxEbGy>IXGLmxS`PhPd zj{YTHd{vj(4Eh#j%+)8hUB;bSx@^(~<|YhZPsUVzH(1(40SE`Y^{DaA;hn!hnOq`Y|+| zNJ%IZ9{NgKab(ASgM^V#0X+xv)~)I5aYY53%D-Cp;5cQ(n?Ve*QpUvi<^?>UI(`Cb z;w4P=(OvhtDfT`-%-q3U#df}#9`iimWoyy?Pnva){j>gfN0XZ6NbjUL*$>*~ehaAjydb7K^7Q``M zPoHx-7v9}H!*2cDt~)7m(ba-$mBPr;jBWu{UBiGrzIaO3+ko zj$h0XT@9158%m4MIOA^H=e0Fzt8auq&)mV8V8CQ`T@Vnk2%kRB5YjVA5fEq*dO-NWBV0Yx8_|8KS9%bcj>eJ@16n{|9*`Sx~rjw%7z!+B~tJZpyL0ic>9U)1T zc6|{m$%OUh88ZTumSvU;5wnz)?F_o3edKo}igLz4gn9jp10TJ2$0ueWq-Ue<&64Yp z0?U9o@4w4S!f2TZH>!purT6dA+}zv}@FdnRZ^Mg4wV8=NK9_WTCV)kH8t&f_FndIU z8}5iygbm}AW#K}!LJIs;|K%(ZYY9>OmW3AgFXxmF!o$ns-mMpIhP!_kYAMBiQ){ip zc=`Ez=jTboOg=O$?fw4!VX5A}+^{7%om>Hz8qp|iL+=tH0I6K3)3ZT!@$&K6cc*7_ z&#uI;Pm&M9oAF8LA)h7bapVX!l>#}56?%YAVgJNT0RijmFmt-#2reHKv#K=ZnfJ?lBvVq&sNpitrBpf z!LMWn_PkubAtpJQTD=AH=#qGs`r&xA;Rlb`4fGPy3GG*To0cGDed8IEY4BMIr+= zOu^Av_#ZgWqaGvtWPi8&>)!3l*-z1Fq2gFKTlp=I4KMG%Pz0b#`|CZuh&jc62Q6=*Y1c zN}iaWHuty7N}ODon}bt0wsr*~p^;KkTiV+7D}l)*!SGgz-*a(H@j&o-l8v7*q4 zsP)hlT%+X!dev9D3+0Z-`gLk%!V@#Llq0K71+8_KsX~>}XRBNPA;wNG0n2_k+24NY2B* z;=6S;iFJy#tNwibdb{f&6H-|g9&EGj#)8DI_IB~LDHVy4s(^c2a&mH=c3)vbL&L@u z2O?>@B>6Z+CNfge_3aeno%_qR-NTlnosDpsqOvlqjEa9tLg~a}4MPL9N1_Xh6(^lL z>?;)_${7sl>i>jqd?oC=78`Gp0 zwKcfy&ngZeG4o*=l@=soSzVE|#+O2Yg`Ho4@_MiC^JfJ0F0E61uPFaMN;0GCVBRq}{L zX9d9wdqTR;=!-XlKYtMCZeqNR}>7(C%MT6(fUU5lP)voB;bqouC zc%a9pK$|dUESQRdg2M5{dm3pqqHM1nGXL{3nsdWQ5(goie=V*&F5XHA-0h!yTTogK^FzV-Or z6{F8PPqa{Eqern7fZSXux_do8*c}zb$Irh-DCvqpN6yrdGPLdOaj>|3zs(geu-fLM zTWg5}?q_apZXgUYywMZBP-}&UhDU9FdARcL;zIm8xG5v{_V$FyJS>dr@~(!vPo3g& z%>RNf1pjU!=U#V1(M3}JI{ytVtZ^P9l{-Ecir@BT{OIy*Js9t_3ytQx)fja$r{PBq zsJc8s1Tt6KKLQnrdwzvv_6_~D8xl6{%1k${9}9MNi$5YRF5G9!b$e>Z#E15#iaVNo zE**lpXhEOWuoRH$u1vu7f5=Wq;t+{ljVr2f^3LTsfiT88DkLak`QP}wqJFX5&TECy zQMv!SS^P|nbvP>MWuXCQh^IQblfuS+mnq(bIa|jRksV`}K%p zjohv z{Hme&TEc&CgC=0VU?GF4*l=d9(xb};K@h=%s9ju4Y*^p1&7$HwR^kC-Z?BEh?%tAB zS;-0ZeXu{8;t4WDJr1|d=Ztrkn_R@sr!`z%UDutPzNi!6hI{Q5ra+vx&|}3;(Lw+E zT3zk5YAmlt1UeHpb`LL+Jj?Z5z`b_1&!I44Ai~=Hp~phK{Ze_e29G9myEf;Z9e~`X z@x!(;#P^EZcDB6QQiX+ak5a5-s4vtcw8NiPNhL#kmr7l`b~Is$@2+@vx%KKj+GYJN zO-hl?oB?ddj)faL7*FEv3!eDZr#joY(@rEjMf`NhzwV;1U%wW+m^ZsSH+~c_e!Q7$ zf^8s5+)TuR_5N2k<#p6{Ip5^+Dnroz*Td~maZ{7mTVr|jz@cqPH6nhc9&T(-j0kxy+cxHV@%iVxI88Ryxs@}lwKj$5qO8wl}xRj92hx^;Ty}jIq1`p+%x3u`{?YDC`M$SV|-)YGoG8d?EFp5pX!>Ep%*_`;DJr=Dj+ z?$AJyGZx;nan+RQ+%>8Th0@HodYyR~du=Bb0l26&=?S|#|6`_{b*R+mkR z@Aed#J9XJc+Z3+Wf+m2i<0e&RO~oq@RK&o)h+M*KE(DoaFF0X;=Xn;FmKMI71lK{C z9Er0d1Ul6}rKgk6RvHdD2Hfhe`kpDFqM_+FI8cG7=326QS;&wiPZ#nA3bn=BcW-fm zP%=k44HT(-%pG4;$`G{B*VBV|9@Bzn89FL8U;S;Rk><818qAD3Gv*vCfW zb#=(0{86m#u?#;ib^A(ceGzjMIU~db1~!4ysP!i(Bybye*KVQ{Pp{KPUxr-aMPbF{ zG5`DbZ+v>XH~X~@Oe9O};cAmzx5nILtpLGr4kNq=aGN1a_QKxHli>j+Rm{LQpAHWl zR{bsw!2=9zJEwY7WGXwvN?8p}V%_~Z_KpeFYeKs%E)t$L>K{^87zoPW7xDA+16Zh4 zt`oR+B(x?%gN|%@cOKTW(bfHU^!xYMwzjO57LTdPNl9((xgd9lbR|5AO&hSa^5fzo;vY7Fk9R&9bnO55?e`0 zNwsU%9TLY;mKIUp={$|7dz2zm@S6{$+?hXHCe$jfx28mPdmL6JwrR@@TROAi zbNmG}7~^CC19xg!!D{}7kJz#@3c6s^<*JX3qazK0WF`}hnod+~DE@%@sQt|tK|~1S zmo!CGr72aS!oNXC>nEPymkt09gME^eT_k6GDfeIOwpEt%Z;?p)`NgcF0piVTygOg_ z!hZD}eGNv9R|)=F-y1g#|eX^ptFyNyKkDixW@h@1kGTiT33|A7s1wZv z8Y%0miVVjO?+d7U^QJY z*d+sOdcw4+B1HUWxG0E$vAcezrHvt*$Dz{%-0^_>unhVGW4PpS zC_v%Erd{e7O5q?fNOHWm=E6wjrbtHej`f-7Pz~jhX6XBRZ()LnlWrP{dHkp;BbxWm zHO*PFV{|(rifp!=h2sYbh;3`}yW|)Me2=@(kP)AGdwYLh8fw4*jUFtD2Lh3`vU=5A znE-ae{|*AUz*EBtsxjacqsDt0Y&bYL?l$lO)~`-B%}sarY;bFLHIp}F-MeMX=$IoV zRkR6>TLct+v9lk7quF}$qu$ZK%U7e1lhv){+lN?s*V5|600d@J^=%i4soc*L^@us! z9djAtX!!2DJy>%usknbUknl>bc#7SyIT74JPJ_lb3sxD2-jYwR#4VmbRV6qg} zDPP>{Gyp3bt|GgBX97xQj}Q0XNf8HYTrevYQevgHe#T_g<0SyTwzEph$6YiK|oJ2IB^8JBW=f7s%# zzq;;qeQNQ+VEoP>0J{31+B(OFw?TZH2`&)IS!^(9g25cjoL+knb$R7%F*(5ui_QM% zA3uI1LSfiF>tMEKNRadP@u{%r**&Ya7$VWr*WV?&71Jh?HaY(@^VEYp#bQP*^UG?J zT4q_^O&W2A3_5x^wHVmx9IpEqD{35-Z1%+_TPBYYr{ms1(# z#s--6br`1u)$00wK ze%_$R6AGb}ZdP?8r~oE3#+he-iZ5wSlQp!obb4kc4evfR@zibIW2ZV!cFVRiD`AYT zaCs37xFs6J<&7)dE@LQkz4COu`JK((bGNs*!T}FrSy@>>8XADKF<@D%W#q+JUy{(! zA&D;Nu>9ZB!OncOSyXg%wV3ty(wPrqWE93rdE>v+N?X&l4zBY`Veey6&95YkozH?j zR_I?1L383dHV&rk5@nHhA)M8iQP3v`N(9qD}qZ@DivWNQOa~}k@ zj&N{rP_9#rxL$z&>yZz8v-fHw5}mF{!7puCt%v)8W<3x8*I3}90Vf;`KA;&qNj3fb zGQ4TnVJ7RYA{9q!4v|??nLkof{<)yXK(?Kry9Y=@&th~Cpb2Ul9D z%KII<)AZ400RP;xTi@+fV#Ytq6buxT}*B6M;P&-yPHo?=+@znInk@>G0?6 zScfuPwSJKP6}8>8%|UVWs=y~yCB9ltXTMiVdOZEZyDH9l^7-_LNnw(7YLDN{%DOb%~2R(Fhk6%DQfbX!hoP*{X&3(P|8IVH2 zfJIzgD9ch|-Z+55pk%`1meoCHfx=$0)5K-m9#v#B``0Q)3jH_cA8QeVi20v;pKGV| zXY4+O486ouPd-Yo#f&i_1^;=?!r#n0%?((pMzQk5k{l!Gztf z6-8s3%sEh-D_sB_xEhX)K@yf(&mAK2-mq%4(_Sp-kaHi;bj!x~uw(FapM22xW}0_EtJpm|0PD@03;q=Tq}AqT2=xOP|`#3v{yBSzhDr^%PCIFPZR zQ9^Woe-9QAIZLU`l)#WMkk`^?z!{$CtY(!7suJ9#p%gCo-cLt*Ohf7tc5|2SslphD zuz6BEORhC9tE^5y+p2Z2W8r*d&&EjC!ZO}YB~3f7mr5^fJ1dR9QfwRM#x~&8mPTsC z1YGp}oEsq7)eBUc52XW~u_xh;%r6JAK2Ny|R4JgJFn$#v!qgSS$eo7?+y8D3EM+yH zB#R;wJNNH+EYU@=^7Kr7NB`E$Y_mMhtp943k03&aGt!xufH_Q;za(`XV9PTdlw{Uu z6Vj-ZIL2|JPRj-pQq+%cnT&WV;-`xKo6MstWJnoWalZMtryoQ8dazI-<)>xsr?2(( zsE$%E1)+>7Bc`$gU?i3C@bKVymd*;E7S*%Qj4xX zzu*E2iNa{{B!4tes_+5CZaZ72Ydw!`1V}Ftko}In3ovycBmDZeH}%FySOWCG63xL# zM6lmFAYYO)k9HNN&qNa&p{9#!+#?djdx+^?w*bIa4S+%0EU$FSQTT ze8msi2*HuU{75CNSq*U+{rOE&Kfix4opSFGDt3CT4Jy`d{(B(M*mWhCYXv{yBgVpe z00Hp?f{Q1Ri>?wRt_g>{#46TP+lhO)e{MU6^q5fMqCE+Pc8q=9lq1LQ`I4A2M)c|v z2NHWGQsoQB`EiP;1{UjV_x}Ff`qlT@pb^%ESt-=8nG_>DYR;RS%b%spCn6%U_aOQ+XT%^6UiEh9~xgZ|dE}GbdL2UWz`h6I5n( z2#L?JB)Xj-1^B_hkN|htNhC`{+-g)2tIM*s8puC?{`>*O0i3GM6Hl8dN z+mYX5}eYBLe#ceU< zIlA?c{4W5(xo?!N@U8~Gn=WLXFXtK?K}t$W3!Z6{Qri7@#F}58og^QKlAy7&IB`gG zM&btn76cYjZjm?r^`eOY8x^!mFe}>Hlvh+R;-h~6=pEWl8Kf80?Xq~_UZ$i*i~qH- z(4yN7%?wkwr|*w@)*?BD>T2WHUt>t|WN2A$MI&W1`0hcs48QXam>A^))yF+%5w;N% z6QiuVSd`UMn23#o6DP~?8;B1;8IasQHVqbdTuW5e@Zz{zcFoCRQ-Ip;6ZAD&DO-pj^5Km-GB7?5jSO4)$DX4QA1N&k7gpuRr&=Ei$+&sChbke1EN&JH`gr`lS} ztg%^4(TJolgfAE~9d{^*d{p|6Lh2OqZWwX$jT@20A!2FipODl%$s*!RSCJ7Q+yk#} zc6L@+_tQSG*%s{H(LWyw(#HVP4=@(R-kp6^^=3+-OBvD~f}4I=w2fr>6&4cwLesZy z{O^p~Oy5GJl>liBR;$1n+ohle%B2m;EAnW7Fvr)v0KiA&nt;F6yMG=pU&zV|DJ>;H zM~1bm5c(4rv6)tv_rqq~HHRs3rckU|~t%brc-6hHsDY5tKL<%G10 z%5+Alpsw}Ip`4}_2cYzlQcz@k9AkbNnFn+y{=)Huy>)Qb71lNhlKe_9Ge$_x`(I54 zwLkAVWx|>Jg^l*<=eOueOW`A(%x?7H0U}~b7Dgl_q^PK~0a@$onGakS*o zqmI*zUoNo(z=iI|Nudofm42L=nfV3NJd|6o6V#M``w5C#l&W!V`csCULubKs-Jn-8 z*6(>2K~7+gL&jYEYwj;&gSe={v$mGJW@@_p*ulBEbnycWzT$Jh@kPG)?4fK+K_^7hX%9Xn!z)HgqkfxCxH zhpeQe)M!xYQIIH+&CO01pP=wlo@EVzGBWQjbnWOetq+qmVowSS2QNWB`WFl$7n|{n zQrSuxWw$g-M%h~U^+X;!#9Ozp#Av-r0Mk2SH@YxSQY4kmguAH5tuD-DYy3ykh^ytC zWX6bKE^%U-o~9-Y90JMb4HyIrP|T6M>u1-I7d`9@z`P2V%*E=|p~ZhQ#a~uuQb_#) zc*Wv5v4A-ykW=+JcyJ4@iVpIP(W^4PbaQ=46U1#87hGMw-bU;N7@p@k<;eznDNuOBArTdbQo?ox|>#2Aoz4Z+A3IG|_>e+_?b*_nRZ!j1dN* z1fDHHL~rABZW?-^j33s!(2pY^kfuIm0Wh&*lBd3er3odyNFE4++4T0SDt@n#hQEHh zLV)tfAt6k4BSWj>_;t94Fh`c*X>?%IDrY9|)YgOzlLX?1o2^E;`ghO(Talfl?Dy#4 za{PX}3{!^mV40Ci%Sf1d*C3Jb%6EVGELZg#7z3<8g|4_K-5p0e*OVP+KUJPPnRuS) z*n1}>#^rQN4iLw-wl-<2KAV7;9q-p`CDV4S$)JAP869nHd-j~4N4&GKw+Gk!MS*+E z$~WRnC(M@!m6mo!ZpeR7DH}iZ>^}b?@MoUrn&g;%^EF$+){l^PjQ#E`cEzJO^6PLKtKPycwE$0W*PD2x*3~DI=8wy4*ZH_{V9nK$T|=t4O%_pfCFf2^KW`q zOAF5ORTZWfZxh<{0;*MSJ>ASetD-Q#7Wn3CK|2u^UAnr?uY}I!9AnNDGhoOy8gQ~@ zn(|6-tEmx{?MIS9g|vrL&1%!N8Be_1=IsQPvqYrDs9$9%=QDrw?^k;<<}9WwEWVI4 z=O{j7fjRoiNf`Uw0f%Lm6A~vIA{CBX?Yu1yR`r>h4*>Z_>Y2R;d&t+OrZfZ2_hLrs zhCjW`7L_Xvn!11gW?rx(0dT9_`MJxS3jQVNQe}SppD&-*9KDApS!8g>Xllx--_@}R z*l3SsC-@H$2emF9N0DKPySM0pW4pEW7fJu(GrD;M1;dJLv>1%qf9?DdeRC1B%)>m8;%1DF>byYZY zZYr0RVmXU8pu+X(D~%@U!QKGQKU31^$sG+9wls13=^ne%+1>Wo3#o2vncTX!+&OI{ zR^n%5$?Uq_qDQTK_Co1-#RB_eY>_oz)4G@A-{((69+nSxCjy_^a1KaPTKJQu8|U6O zwziwoB^q}dJyWes#=BS)wafLq;bn?Sqw>;ICbUe}_QNAXVYR;3&WDYgxKGx~_E3sK zES$$Ie8l*#!9Qe|K|#V+fb(RaC8a4UdphPezu)izUufEl5w*6lF#%RM(68W|T^lgP zCQD&HYRs|S6HmYb^~F_<=Ddz)*#qhY6l%41T>cFC9;Ef>Q3S;?OgBZJNa7a;1WaL1 zt*qF)X>eXF*aXBEjSttcdTe~vgw{oUO4xKBq=PVli3x{75FZ`+3OF)Ak#+U(&=xB& zJ@xQg4@83i^|irOXsSsPuFdx9w_uXyG}hSbbdqVvX&)++v2#67Dq$#@Jm1QWb${yS zwW)lO%?yX)1?$`hTU3BRRyBYKfNr1}`**AjB9%=?nHeqJ?Ss$-*W)RdZcFp$ui9Nj z>T$Lt`7nz{ep9$UQYr7{kv+9`qcHE7;bfGCXMB@?U^mxuY}5)4uO`Hq5tmfG4l=vx z)zz4#1Ez$5@$vBw7gl=5b(Z8(bdu=JEiJ{bi{iUAJRQeyF&D{k66w>33YTNMiJ173 zeNK0a(3MRX?tD>-k0n791oxPqJPSWT|8N>#T1}_PnGsN@-c6@Fe+lJc7c~?sLDq`R zRD+111|}@i!yvPEV-1bq%6&jhpEai6K@Or^e)VFw8onaJ1euHq>*i}(i}vY*C%*4- zv@@0SzznEOL}GPW=hNMY38SZubAqSNC8>SO1Y!c~IpheK*A~Mjbmt z<=7shOoyzH!dXYK#hT^xq)7|4pWxIxu8r=BUp5U$XSv_rKgP~tvdYNF0JexR5z552 zbF~>97rW{b37rPQ0^&=EEHa7LAt*0&YCT{8pe1hIU_Yy;-G8fXHQe@ThE=_puV3@leS0>XfDF<~s+Ec9`d zco1S~PB2AKTJ872f%KdkSRouljqrx)A=~LxnaZy+ynWPkdgFfy(W&p;dKltF@X&Td zTy>BgrDD?~4wK{A{b?#K1-5_)IR(W+M?lB=F$;XqlF zacvy>JgA#Rh8a_GOLW@i^UU5pQ!jgvz!>r7+kPwsl4RHYy*)bWSbgO&8x;6I^Rbx@ z1|k!TaP#Glwrv=)Uu4UUq>@hQLv+4S@10$*7QI2^eTk@DWuydh0Kib_WLKE6+u1WU zuO-8l^Dp6*;zyvv!On6DRVWNfYZ7{$pl`{AJasU=un=KF3IO|gs^f=KN$$Hl zM#Lje>xnDjvqutid{dq0nQ4!6CFKFTEQJ>LIrZW(O|dy;2~)dRA)m&( z!}KlMukQWTOQu_SA)iea&iWtMh<@4(WdaS)w!cYNY)FWA2gw~mso`BQmQn^fi6U>hckPLWOtrANnCoSnp7r%yDS-OGTl-{VNohF8(WP7N zTm>bOG4W3!i}?QK-$8eWBGb@QN&!UECI9TxHCrLhqlWv_@NHi1&PT78FMZ> zuOJBux5iD*p&&3dv9x5HwMGJb54P{s>n?@^=JA@W7Q{J~&i7_vWvQcE&U?ZL?_(%I zQqAf1ph3U%GtO_6Lsl{FIN2}qh4K!?I@>p0;;a7(GM7$(X`f%p`jiPV%Bj&zQ} zff!YJ%qCAjD`|$m6Hl$G$B@Cfu>o#cB~=KputF@6ru+N*<8NVFO&92N_?sqq`T6-4 z&jAO8U!Uy)ngfg>ohp^*lq`iw(W-kFW6;4^8;=Y}#<~HZH-m^^Vm6ru@++V`;22O) zP?Ys|P#}X2q67sK?EJw63kSz;B!1+~DlHINL2drMC>uxv|2|ET;By}sqoDUYsFL4U zBTILp8#c4-NWh}wo@-bB1Lm%^jeVa(gKlU#z!*TX;$#5{2WH;!DVc^$%8v5bgDHNg34ivw%Sc)+9GKb|dU04;r#e z>Ue;hfc#z_Kr>yOtg5lGv0DZJuH!+ zW6ijZeC-W$WKdq|ma|utr?77n5JNx1)u5sM{SgNONdst11Q@oZW#0Xclp*+}&7;?6 zFTk#Vv6JKKT8;(C-@V(;Dkr+isZSd1%a<>;f@@iYaEmnfh%nXk^=&PjIgxv~|ATLW z!GJPhFmK%;=Odg58?1Q8+?&*945Zw6yJ zGGbs2hB9YLer~SG4jDYErvxw)?>@&j0KEw!5-V0F$Jf6SLm^}e!pZ8qf`Wp%f&IR= zRN75~vMfWhn#$-V(4HKFI~V!k>XNh!d*9(M&6+vQq|;pHLFD`c-+<$tUDR;Y3fS}j zQAN4iykVxwnY5k$eC}2kI?}K%;G*D564mYLo}~d* z)2@H>M7l!GVEaZ&J{SgxDlO$ZDy20JYpbk`(P7s*Oz(w~gy%d<;Arq+&UIbVL4?W4ef_ArJse9$VI{-<_-wazU9{}LQr(g5&j zT-vmfY@^0@DKhWB5s)?P3kV6lSjkoLl!ijV!Hn}qTl4GHtu6P;es4wZOQnTG=IQuH z$TFx`1ohkU1JjAZFoeFp>V3PcNl6p%RLYq;Gnsg`&`E}CYO|K=5X41N$0vp(9| zg3CU`ajg`!=bv7QxEocd+njn@O7a?^Fld8X0OuhL<}T%xAU^jwlQaI&DO0 z5NEPZscFJW1!5c>3UM zj0w?Ysi&FkWrDesz zK5BCBhuK`EA&>(>Cogx1D0&bD<5)}SAA<9UB8qQFMT!Ksmq)u>0||g0B2~?a=Dz&V zw3MzcHkruUvLe1KQweoY#LNf>{qO0nnUSJ`EZz6Q-SpZR;WR~CVRw znhK38VyV%_0araVyxiQK2`b`pAc`C{W;AzR;!f$Z1g%62fmS+(;6J4;cXI-=L4@I? zIN+wZh-@bS@sWx-8I77nZxHCinaWmf+HS!-yu7D|U#Fd`-9H&{4y`@juK@~m-O_Q} z(w(@54jbJ)+v^iInC`Z!T_|6TfjTfhAgLOZWkqVBcY#^4=jpTJu{Hu|l0r6n^X1`F#6<$M< zfd~qN7;xy`Vr)I7&+}u&e}Uwu$-!dXnY+2lwWgWbOE5%%3ydG}jznynbq+60F^uN% z3Jx;2jw}5I)+U7?xPO9<4S4QbqzY$05Nb9OzgkDCcUX~kbUX^`wk*<#u@|HO8k*Mr zIFw zttJKEe~C$Vn7Kpwi17_`)NS-+6MlVv6rkeh$knjoz7%9AuYvp?{Vg|X0T5we5JfTS z;*yd948;^#af!Ot!Mxmkk*5$pu*bzf%0)}%G*okxtNAC8n4exb=+`%Ee)0;;Q5;!N zuGhOc#URA}p4zKmyp6lmX7S6|ZbrikA3dxuO|^f(4xC2j0zKc9Jbpwxuc3_#@SPUMXwW2YfnY?Med^kTzEC z8irO_>qKR#Ml$#>1zwv4Oujqh02s{-M zfvY5`HLxEbh6a9`dF{eS{`ERIY9stH6690I#BbTbae}z$5*BV&Y6O`yI6M%uf;AZc z|Ep}#J!wCI&ua7-F7XfthO%1VpG7AB%20!Ws1gW8fI$^39zY*4g=|u2t_``waY6M&;27-u>vpsIZPs;`A{Ojprap=hcs^xP^gq*SWwzg~$?}DE6MBJjm zJAjUNQxf-trKP7^2`b7gHxRNOZW5wi6h`!z5?YEdHKp+uTpsM;r-UYWP>?u|-wf9l{+N~cL7LFbFf}ozn{*6l!*DfhqYIX6PQv&IgKJJ@fbw|v& zTh>$f8VoD#C(({NoOyj;0sK`}feZJH#lo$>N%@PqGl&TTYqjSoXn8)X|Duk-UykV= zc+m=IBv4r8OA!4B5w!xqT+paJKTISuC&VMFW+}e{^*odQX$}LV^MODCqBlzoj;~0u zIlXz#;!)t!PBjZ@-I`^?Dd4FCkgke-jOD#r@VhZ!fJ8op_Q0DZAV1g4G@>U@KnaC{ z#Apd?f6}(kmX9p4G;@)1Z{Q!^$ zS_klT?UozkfPyk|W1qt)AZ45bR>{-tzblZ;Oktud&Nax(IAtV!LLwLs;p!fGq}67KNndJc^M@b|XozmeQtGUgTD~A7h`ykj3Rx(d;?)Ra& zJn%9QMK?sjLODpop2g4$yXQN0<3QP4`eHRK!$7JQXOl#>Qe zBZw%!VX81TO&lJaccf}Hah6~zCwZv>zIT?F8k5iC68$*9UT!2qoWSnVax|CtNW18D);M_0aaCROJZZtI3XxHe$7jINayT!Vqh;kSp5J+rUQZyZZxvG@7EM*oR zoY&qj-;=lWEDfq>R>)d@VDrPMO;hKEx-mIADG|&gQ>sRHzJn@{r9s zD40}HAgDWtMN6T7&2|yOL?Vxsj&tQ&|82jxxSPhW{N>JmLcbRjfnFkIY;;N9?Oz@< zj5PLqNn`D%b5S346Z6T`&P~ds(Sz!daTnI&yAP^TSbuuI^}R+v9%g^>d*zJuDEF6q z31ej!n~?nXp0`Wnt~v!QOgV3qfB&kmKD)CwiqP;+S8ry(9951#8N=RXXGQ6bt!J2# zMSeRZ;&95ozJ7q$6xO2iN9goNBfdof6MGBBI@QqSx6Wg2)dEuYY_)wa^fXpJBZ=7$ zBbDjCk$Vgk%to#c8@-2^)|kSNPZo;fjz-?kkN5QL&GJx|9OCxl=2h}jUG+* z&1(&hl$~ZP2kLd-{R{7g^%ep=yY~wZ=7O=XzvHWATK2k`=t)buQFqJM=qtGu&J`5@ zzVe&!neweYo%WmlZI_*iigZdTddC#WC|M3OV(gcPJP*y4A%wnOqJLk{bv8MBWjv%v zjp2aS_uf>nwIH97dt`Rdu{ZWc`h7a1ickiyZTW??NwOnz8y!oKQ8aQjml0L}G%PYZ=@Qe_POHlBaO=)vi zi|ThU*wkSCdLI zP)6{Gh$srB=4it*3)o_y#_;3=4@6aM?efvZ=hZ1rxQIyqw0&!Tl>hZRFK_RQ=J_j; z8q_3@vPV}}m!SVGqV>F!v(9-PfBtIj%;R*@qI`PC=1T3!N;D)*Ms8_dta`t&5OOFP z&{42hZi8vSrdiqLBEEFKZZ4HY?C&8ssP0=xLXSk&dmb^fD5tIb$(9G(5ZzNVaK7l0V9LzWm7R$WP9NwU6 zd&{0a%2%vlHmOTSVBn#YB3PbPU0uza+#l0#e)f_Yzn1WWkL>6(#f&3Y89>az6KMe05Suu@&W}OOkr7(!p-y-eC_* z`rF#+$vVepR04KCSDlQ@wOQljOnE4Ba&uq0{d=laqR)`3bkxb|=a@XceM7?VMprET z7X52d(o*x;+_wMKPA&GMkJq<*ccRK-H+-6fuEW}W=DgE2w$Dg$77skme-QY!>Df0w zEK_@MX$#qKy!1c|By_&JDaovO7KQ0cCgqc;C-Ypmw&X4R8i{_Yz5>>QhPLB|hA>w`zPS9`I8 z>o2{ISqH`L5Xl1eUF%1SE<)VN{a<>`DkfpWmS1qmIrf$Bj+K4xuI9TpT^>bJza$=_ zE8-9=D2VAX6?9y}yt^K}3!mRxC%D@uprEEMViR=6#zb#Aow7l@UU)3FP%eM+)DHrlgT<-{ChkVsO= z*CTwNa{I2&1t74BuI)k64SOvJc4Xvi=0T8wWFPVMO)2~JMpeZ4W878}eCgVa?l)Pg zpMrzSb&E;EB!z^9FHTDR`_u0((h268y%Xl<3~v_*Zr|UZ!N|zS0%4lcad}YCdNrsY z*42mP{s-jOH}iKQcD2)lIFhO=NHU%HdY4UNvD_4;dcw~KV=$*mVuMVc?JPIsocxw#KI9R$NCQBta;`W)oovVz*k z(ShM%)kqrQt`HKII=3ClAn^y4lM3b9-xVaUeFjQk1zv)# zH8L{NbbZ*{bbGn|Z?0L-zpmG$a#9d%_M*dAy4(HW>rtZ{vZNfxg|-J8Nd6M%+iOo| zX6Ew&_m&RlK@owo838`UtH${F_=4$W8R(%a!_Tx=^g}08Hl@*W+2;xV7vz5XAL-tf zYa7mjo)r+(n?;C@L{d;vF7+ky-dGH#tpWDy$BBb0VMwK|QAk@D>HCu>MT8Z;|Cm zTv->pd$|Xy7Lq$s-)UVvFj5MNB3C(m?dEKL{cpbduZq45iC{se6)X%4jH;R%#$KL! z{m36bUeEbm*+$ZdDG8;{ozCw0ohiHROvUM(-|#C6XIM?mqea#1gPRi)x7M4jB_t>! zsx$hAXPJB=r!b|vw};NRUIkE{LH*o@#r+%G7k4Dl-f4bKNm&8QSvPAJNh=~}Z@(9c zDV>{@_0isEnaVP$E6VTq+3f+{T{O7)hacZEo=xt!QR8_UR1_42~3V+!|9qJ|-Z> zdo;`!!D}&qSz|j5+1TCf+B@THa?u#!8+UrAcVSS-yXr)tI3h!4OWkPKZ4IHGMP`op z`}gQzi@Xk+pEJr-`A}Kg*JsM~ZY|m@(Pq5FaeIs%R7dw%u^xA#=G~Q*jm>hu!2HU_ za8`<#f7<=|NKB*vwXaGFgW#H1dMdVK49(9E3bbA*HW_l>fzCNFG(?z`lfjBZ=X*@# ze^u)r29^C^b>4R>&*cb#jh!8XKags(UdWu!k>ZCR^kP?&gHI_b#gU_AQQH}~QKCmP zi3hx*%f=3s?Yn6_IY`QDOs=x>pIw?k(PeK0pHm3vs*>)`HU{Td{hO)|tEs8sk7@!^~CAt5w z-`+3wexFb?b>%rW;HnAh>HcY;4TxT>ki_(?gm$0E!1NM7EGz{+4({)IW%QucX0`Q0 z{W&$8FFRYu2v0q_rIXoONcS?Bl0(ze@>*J26DH*|n3{g$kTTopn$%>t?G`O9Epu`| zC~>?1gMQ8iN~PS`1VgWo`&u|ylI-g4uJ<}&8!t6l$2B@f=WN<<4|REwJJJ)z+48F= zmgS}E7U}&ExH{W28iv)|wUdOraYLWQz4HSFT9WacB%urTZ$oo(F8{6WvJa~)p-YD) z-tVmoz1dHuip(MK$*P`jUDy&cM zj9v)4{d@cN?fd(UTmBvQqU*5QeqMBHdRogTVz$w}(*Mp+^n3xMM8Ccr^hr(AenWvp zBJn01AK%6KVx{@Dk#(3tXJu23QO2lxdfZ>wN2$)l0@cYlyeChhWuOx^wp6pTv)l|n zJF{#0UI1vMButI3z#Lod3s3Hc#>#edsuF;1eE(%xlu{O0#4fN8JW@cJ!0l%0hTeMw zJ#M6N^FpNUf>QFk**0lYS)sa4h0qdUf1UlnpZ*HNI% zrmAhiqoQK_%@4eqUF#zU*WYcA75f|yOM__%x1Upxm+x(lnnhVzy=qg zMYP1AQA&^+o{9DTG0vdGtnKVqK1aKs18Z=>if-93e_METJ+$I8hsH6DPCNw_)jKaQ z%JjkD>79~kSC_T4Qf=6ukr4@c!Ua(EfgOtt2HmDSj_3Qvr@OQAdU{keG&DA$SLNC; z7dJQb&kD?1-xtKH5?PFhuMZ0ng=4J@h4gcT>Bk+%h!j{J!g)RZy?-=`ig&6a*2#p*y75xVf-{_LxJmm@WhyWB-qF-fRm=Ywr02=JL|Hs$C1tP3>vqMqyu1u%dU9^MpO>P5*YnG( ztIds#1u&Ap0Ync#Gq0@YNy8=gSPUY!J~VlZ9w10)v~@H2?LvLFs?fY>ZrGKj(#pXE*%J#dwd|^%uAt-pPY?e>NGI_;Ae3Y zU!)eIY#;xshmdRj8Qe9Pghh#qoBKyw8=79No$arR(aFi4A0Hq0tUBFu00m|+de3kC zK+F7@D(t>hWA?aAw-|9Y;|!Xa1E?*h`k8{kRR=*pdiox%sItY;vI^d>hP|dIbfi089c5nV6QwoX`u9`SJ7p`jGD*-Am7(zaVa{<{X%N!u+ph z>Pw~Wg^z+6pLx!F!jFRNIzWNI?i?Q<4}lJU#@-M)i8Al_^aOAihn*>Y4*j}UtfZOM z)p4K!r2xnsBLlS_W3m3ReNy4PuB4QP=qc8#)uh(Vd{?deBx_B7QHNYunVxWhHSjz> z#|k4+;Zfc{(Q7}k;^JbondIp6(TC*f&jm_F3>I*`6+Kc;ko9~|q|DJ}Dn91cUQkTT z3|5Dc(X7}QUFr4L<*_b=(DOGC*xZ=wPi3%Du5 z?vdcpk7vi_hAn7C7{84b`y0fwM|Hnza`6?%3K-dhKE*R}3KZo2)9JwXGvN%o<&@6_ z)7JGsaF8iJzK+asgpBX#7*1E5fwt*F8P(m9CgN>rWo4DO4=ToOccup%l?$IVAJIX8 z8^NeH^YNMCY9GbbiJz=6!@ZvlCMF+3LPC(KfN_}APJ@#K_y|B~nuR9;jU5f!2o1Djf_iUR-{$oA3K8dCK)w3CbPW71#j%zjKK-FpAM;b0Q`hrO{l&-R-`4{_ z7!4jgDgSgmkd63D>ENl6qXI$gXzU9wjtr}|FLK?3u$`Tq!at9#jTb$@F#}cdsne}H zlE&wJF?goQGggDGdf2?uR^K7iJwW;Wux<(enO9OyIXEQ$+=RzV43-lu(lUyRccu?K zuJhS~@3Q9i#Iomn6my3Wr90r@Q{DUoc+_OeSR zUvjDkBaIa2Azr8^?&&Xv)O$?piVLQuPq03I?dK6}E83s=`lXJ92vMn%!J_hrZOtvV zCvbjG05Lb()vO6glO_;jhlGK{b9s5WvAw+ zBv7d#PdFds5~AzG6BHI)c7Oc%aSni9hnq`R&?Un<7PW@~_O2yTDBTv>u0W=T!Fu&m ztM-Tc-Qccmh05fc_$3^)^_qMOTVF#m88_@Xm)(s6$-eflHT)zh#q_lrJ`n|l5YMhB z=yxqxYd;U5+7?F)#ey~0(jjx%M$o@eIOO{kY6BStzv6S?ebw9=*5`sJLj)=@T+ zlA?fkmoaO>u)@#ZSHhE^@Y)2%YWk^Oe1Q>Eg&px4I_j7qfV|#@WbGYo=7C@qZbm+anQX znE5H+Mze|qkshPt3i5B%$jm19Qtr@vMd@gxf@PrMjH61m+I&ShSL1*AB3{wIAKzx8i~#eCvSs^E{=ehzl8)SdU~vbf8KdbF72tg; z_3ygz0XG75&oBIr20yqQwdz!#w2K7COtsDWQ9=YV7q|404thed8as-EBOy$M^$l~Z zvAMbVY@oE(7gyZM$XUDYy)$(fq{qDS36-+EJT8EX09K5mAY94)f~iWsS1Y3P&gr+< z5Dh$~)@_#xh`4RJg)-}~Kd?xrcvTQ=1U1`&sulhMDkHGfqe}D$Tp@2 z3YZH&_6Jz62ZEMV(o?WE9=4g^e1h2iNQ7?cIIqAG*k&3Nfj$Wd3vv*g8KN1#KF}at zwO&l|;?fr3l`R|w&^AMbo;akBZI5204Fv`)YeMhJ(Zz{TO<*2O>rlwz<8vI-Fcq~I z0@CrA;u@r5r>AaUeh*t#F-$L8Z}e)`>%*PKUG+H<79Zug$~RF00pxi?FVIJ*(wsIQ zx&>3Vu$N9`g91EM_Tajg)(MS=QyW5K?Tof9Y{M#7IJWd-9 z@xGR|$mGza66?5=`Rx;cgtlpWYDt}GvT!3};mJ>AWAMD?nt5c&0l5cS8IWOl67iIB zD^2cnAC-=WO`@1-qhjT{HzO|*b*0kj1r4rxFZY2$}=ntWMc zkCQtxr!5>6ve&dGRmvU7!%kJo#SRiD@ZkW`1kl-G5Z+K$m^8A~i!pj(r*?h~$id)X zbk$9I{r5oQA1e?ifB+8)r0w?R%JHOGJfn$ zI9;9EN)Vx{_P;7HX9;bIr*;EDe~(|y13(JV^eDiql3bgC9zVGLj5tJvmGtyQ=wYj5 z*6_x^X@7FOM^S?}P1tY2y}1~%83cVV`G6!u3t)u6oCii>r&>?ozSqHp4`6wq83@?T zEF5o+`0W39d@rr|4n`3Z_yjM_?N}yRy_9yoVU>FQ!trcZB+}mnqqO)v6dRgfaiXp< z%Jn;_!#K3lq{CYX5X26I!|u$>XFFI6fU$iavC2A9)Ed`K+Jz~WYXdh7;FbTRvZP|a ztPVX1a^IaX_VH=Tt*orHQ2Mg*{B8MuANvD6R?_qkQ@HId!px!}O zl#Kz0G_b=MXi2{Tvjm!5`=%TBPF~SLP)wVKcmF2x9q$Wmvmgy!=D6`Pd9vKOCb{() zcb%fg;#jbFIZ@qu{TvOpeyS+DSNe6|N4@c4pzJ*4Fu?hkpW-=P9GU?^FEsOM^n+3J zZO`_sfm=EI`IdSXD@_LyciHYP_#;>%^nh>jl2F$tXIvYhF#8xD75ku;gLUC#MjJOJMw97_LMp+ritS9l4%L8I2G0%2nxg9OIxYDus#!TukgoD9#+4fOTlWvlfJi2=z4Fr-5H-KiP6 z(8!L(w&jC`vn!xcb)cJHlHGR-MV@fu2 z*pl-zhULN6@~?egz7QvAO8s~7;P6CTECJSgTrKB8%?zzfcop^}7n#gLPaE|ZK(k3y zNxkWmbywyySz?X^T;K|IEPewF4J<^y2G56LA5o)O6ylOMNf=)?COo(_;Y&W#gKyQ< zWToRa+A9e!9G-8o3>!75)yGhYXbJkbsc5{;LEHL(*_QpNi4sT+9Y)yQ|5=#*@hk_h z>AyGC@3#5lgE*7>KM}@-=3Q1W^zr~p0|gK3UgnM;sWxn!dU`w{3}m5S-?imD)@XCL z%fbJ9AX zv4W`sNltYxfB*oAHm^VqO046S+$!U7oGrJ9U9P6UBUns1`9YzkOq5nl=R?{zsSN0U znu!O;UIE)?>j9x*;_ecCWV(tY`-7jl;XDdjr4MNE9%*TeNn*XWuwcOt{+OSiZ}(r4>Z@%vp>#neGmE;dG|;%BLmZEmz$Ez&D@vVasVMcwv65 zr0siW_X-q{&q52V@f8_Em8;k2(MS8I8L|7mtJo?rKQOT1 zxl~eR3+eWA?&`4_JzTQXTt-Bv8g_6F@StTZc+PKb8{!iRrC^W_>*_6WFPd|C#gT#j zn{dLVOVn_n=QMY4$HDyc)D#?o^Ds+6p?b0x^XTj@L*+kUW$f?oXF44ch>!BA@Xffz ziDRqPcVS1##;cHp$Tg&XLc0`a6KlkabquLs4F76w;DOipNocxB(K-d)wsx{imz}J8 z1@+5HkXq__f?ef{ZZtHCzxP=HKD8s&&IeXnK@L>jWc zOevQHU>XZ2{(>n_fC=7rEG__Pt57c9S)2bKg!Kiwq*dRaZ$A)wFEw=E)OaFyrI>Qm zk7z1z?Y|XRefiS0(_~s7^E!HP{W&BoFG)%$mD@)tLZ8RN-2B(7Q=oVTQme5R*m$OG zYF;{{CwZl%QQ!b()lbSrV+t039_amk7@?ZPFZlSH!m<_jnq%MJ>)+PS6Lz-6?|r8F z;-hQAc;vcYsjO_raK*RQ0$hX?*;2uvTspd-Y*9>rVzF4;Cj+O6mhuo<0DZSaTf z&D3`^d!K2ds8snQ-pfnI1QJo|+Uw(Y19p3*!}au975qf!Sh1LfoaexU^k2W@V^dE` zwOxnk>2jjnsPG#*us*c9mlAJf3e!@_@=;30uOe+nTzB154I5sGkMepq-%HCfY;inW zS0$LpQ3q|(Kc2P*wjyZ44WvFwamngD!!E1a{m8H5^6!BU;}+cUpIV*w83&M2q$a1N z!0La7V&^)a*iyIz@6J$4;O4U-Dqxka+nPY<1_am8F@qj0${<@?vu9LuE8EWHp@xtT z+c*n!S88Q)cJ4Cn%gC?@UYp;Z}wzu;E`vv9P3S?CTTIAq%vcg!xQN&P%W z`?6INwTskddQk9Ec?SDD*euziYWQCh*%-<(m=a5z9H>YzAnWu?km(l2`da)2xBQSW zpty?zCA$&m^>LVw^>NHxeIj;Ps#ClG?Nv_ymInC4H)zWq%l=w4+v!=HIiTQDI<;P$RPw2VAe+FGh!xxc0Oh^k z22_}E)($TN@7?-iG>&G1U)CjAjZUUIhH%!hf<*PR2QO2VvW(6?23jyw;JL{&L0wA< zzo~BDv>!DTu}Ql_dR9^4J5%C%+pmF{D{7BpSB3w5oagpj?YD}k>OvAcg63t zJ$x9W+e~@br*cYHgq#ciV|Sm)Oti2=6vBGD$bE-8$yYHS*io5=l1XHA6g*wGC&g_I zo_@qp7-Zjc@d!Wooncmul)3W82L2G>_dvzEHzS)iPbfQPwxzRF0c59*vWQkLor5`r zxBFtK7H`5g34v94?)ldc!CYel3GYpGDx2o+^1t=RqM9oCV?=n5$Vb_V zq|vTtyy-&TIDnoO6gG-u#V%IiIZ4vcw!wdWJlpf}QJDs2>xeG1md39>Zc@0{WI=q7 z$_~H#jEz~ojYqR#7VY4tCsdHNAET>=eK#Bp0<+fDl)}ZMe&h9BKeE$WvDqjhyc}wv zvMC7981J)PV0A1a_wayTNlUxB=8$NaPUreDYj}D^`TZRZ%t&KRG`6i@$l&Vk!L9G< z{M|#3hg_FmlKaiUIaLHkpTtQKz;og92^`@0wf;7nGk7Jrz?03KoMJLEG71Ih9)t zxMT01?0a>3Z^xhqyprh7C?ypU5wY2_W|fUuoN#TNm1_PF)F&_S=zNvazh{4+3p@)9 zcvswRdc6$2PDq;k%Fdv93ygfsqRR9oqPFdm!$0zz+=7DtjclUw90_+V3hXAz76XvY z@e)|ZsH0-dLRC!*hNGIT9@7|Q(ThNn@?Ss=21@9WQXQ$6TYEd#AbxARy$BMzqB@qX zF__gRE;+L3P{e9)%?=1lAR%b@{DoL?b*HPskNQc{fGP_FCObZn(Mo(s&NjyzRf`uf z141|9DV$9Ge}}qRUyBu&%ub-TRm#>Gcx#`}w9~0)0VfrUA$(3JqKh;_Dhk~Q{rvi9 zkb;hGy?Wd*tG0HWFzK;p08_r&yxJ(+0i747Zn?_BxwKd===-*MwFsj2XMyL=3_n{( z^NN&I#j;anpdWfnc~G)884$fM*c*?$dRHrk%`HZ96hB4Frnkfk%QD$4`K{XdK8k_% zutHP&&8cWHPgob6>N(KK$FCZaa)_e3pV)gfo2Na-CQwN{1j8$MelNGVnFf%Fr&YA3 zTpGxT`j;9F!t*M(R|7C@DodLC;*fOh%-aQQnB;F zapG_5YM@A16SpzjNEk7H{IQTE&h27tP=j_K_5!V(TF3=}gh0cXBDk4yc)&TqkZAgi zL~V|hH&hnqSH;YJMY$rI(!`$6y70u#X#+MvS2N%$H+=)X_Y}+xzOsg#vEHaSr52{ze73l^y znAO(w$Q-`UvApGyk(UoE??~#nd+1XZy8RBGJjQ-}B>TO{I?kzGEgL)7-12dp6q7i~ z`@p95Z&$kU?AUDaJs@C^RV78n0i3aNG6Nd4{tc1Q@7x;ZkekIh`*ixiSL*y#lWwvm zLH#@Hc3(Zb=V8>N zf}EhBoZ??G#oilqd0d=$N(J)@832!z1Jp6(?hGm5q>W<13*7cK6nToO&r_4d3g}&J zH?Qo6mkw&&ELaa!U5%~jG7={vC^r}=Dqvd0`FYQN-1yCtker2^ADnpn^2*gWa7u1J z^7v+TCLq+y9|u|_P-};QSqE&nr&Lq|LLGg+#iY&eO@&h7a^N$gHL^EfsSGQ>?}G>* z2+9Dv8dNKAmVrQO-F7ZFR3%43YCtqz$&!qq-EjS$pjV^NAYlte5GMMA-MMCY7^G1C zhoo<^1ptzLpSa-fP>*LYqJIS+u7&|_M$#mg7i zy?j83g(;J*cCR)4oZk>4(BS+uv@+ZY?s|0b%arH4T7JRdTdb%~lOO-DDw^`RCbGL= zjCg5uSgRQwk4<%&IQBRsP0o>^$D$ZXaUS%^CGl{sx>RETmskotQ8u0`t?}=7Q7i_m zAo09{-+g@wqcr11`|nXP`&SrW`^+`eu>)828S8u;=)|5AH*X3*$RVZOUsLw{WCp?i<-WT=6%eCACp~PG{VT&Z9WrI_c zc886uGD7YJIg23clclWOdDc+fL|?w*{40bM5cL7x0``=PQ1gbb>`0aITacX7=U`C^ z{s?d;bF$>f7+ij0$1MxJzQ9VVHJ>@^G2r3}y=FhX*)@`w*vh-DkcB^~rgz}L?#(x? zAkMCN1lSrpxwvAQIF7o^9MZY`ad5q3$L&6;$`)6^h5%EVB)MNnG`&>A*C=a$;|BMO z6U9)H-f1^paEI~VOV4ln+UC!0kK09Us!xDx0+`xCB853IZy^W#@5&;5VB7jp2CE#> z^D7JD5XH&*w)2L$AcOod8!3({ug+id!})i?hUYJ6qp0T4Q$0bmZL_OYXC(#uXQOEs zL{!Y6EG=JU=Gek5w@N|~))P%o);2YZcUjN9J-oUBzlC$* zV{q7eqP=FWKe*g6LsLF#&CmQ^JcDbGf@4c0!+lk8;1gYmn~jLTV}-K<0b4}WV`l+5 zKywO5b@}~mRQIr(S3pvwxYunKxRbtDZonJVnuS&OT&fjw+m7Pwdy%N6)*E<66yy}X z60^Izy#X!}6+eD5;{ z*IF~+shU@=9NEm<@_RN7yX%Oi+p7wVWhP1!P!(f37Ej4|JU-`kaQiV|T6`L)NQ)1) z9>|a&09Ir9PzMTd{_=@e&-#&#PR%i85H3c%g{D^~GeLqSpB!6U`}PTk^~W+9Aa(%F z?U}MCzcB?Mg#>)KoOdkr)cEQg2|(x#vxXsOZzoW3AL3V?JPoFG1w5-%ka1v=!g}jw zcO@H(3)+`mgdz$Iy*k60m1%>-1GHhEMy-ntJdS7BnroCsM2}2)z=;H210mMJ(FH`2 z5t%K1=3Z>kn9dwU+hh7?B4@ixuH}Z(NU0E8x~(b+M0|AK;#|uXNo@tX3ar? zbAi8r=Z7Izn%M!+g*PrET3Tdd00RW(5y+VU^~Y+rCXMSjrTB`Usc^gb=&61}lW3?2wvBvcl2d1F6D9 z;trdCn1HU=m}4~^up^Gu91wJSSkfzCU9r0n`x_(3!VWKr@B>JlBmwheAWftfs0&RW zlOY={7(mOLL>U@-0760fasuS_)Rjd#!LV2#Oc%hRgg;#Gd0qOs{L8?zO-lYgcM0uc zO?(=mH}38NATMs};ZaASa~_y+M$tbQKdqxN^vAT|yB)HU5g!kai;L?%BmUC=*2j7J zHjsO~u%+xPQy)Cf;P>@E7a`Bh>;y}D`}M3S(WT3i?f&d-Y!hSq6G`4dHTzd)o?d|T zfmHHJdl2sRnm{W3rJaUT7s%4w8Jh z4No|-^~G<(L6sa{k}&*S1yM*RfRcfO`r}}^8z9JS{##}OBH%S9_sg6A`D!jd9jPTO z2tW*aC@?3qjC|wnv(t0ld*%Lj>eMd}D{jj=nI(8Nbo@p37&wJV1Zk zN5D)~n{e{;+HwM@X|Jzt%uFmiww}b$_);mdA|J2k}pG|qAcI#@Ve-qqN z($d>JZOl<{+!t9}MKT`1o&%9)Q()CzUyiq~U0)ozZYmG248H+nHPcXKpbT zu*875g4qH1-tbi+NBN)O;U6Ha_+O4yijZrl_gRw2#BC)}$Qv0bF;K|j$lSdMW1t83 zSF#!B0O{K~@F*nr??nLQ2E-P(M)KxX>qQV|-QBe_^jLfd>>7)K6k{(hFU60xhn65A zi~Y*R#%6R$iC^z)A<&AYBdHg)S}(~!C}VjjLjt7f_zQDIAAuK9wBC!zH#G}`w>P-C z14gYo_s+C@b8Lud-zz4=9l=)Ihn?!3*PlLpO8*qEbEg{XLsX-I?=_-0^i z1FajmsB=V`F(?XhQ>$QYfOcP<2tD_Bi!meL)K{(@{)X|jjm-cs|@zi?s3NQ`s zQ@R@)tiaBHmZ(s2TBS%!1gKw#RM!8$>`~yC!|^+061Da#`Wb4jDG{VUdHDFirqDVA zP9Y865CN#WwARbeVwP`O#QXHVxTl?`3*!V3y!8r=zEd)@$4J*;HHKtP;E z5TNz`G}|yK=Z3)n1X3I~h8RG90k1k}JD+-n%R-426chlH!NNqB-%U%HwS9;lfL?|Q zTL#_;#+L{8&kGzn&%2wmdWS`H5YH>sec9BLr6@=ZOvaJPNm*7>T{Vv_>(AgN5bBps zfi*So`w-O5bnUk1CG+;rpFc69Wdi@_ncl^u7Z&bgF$jW)GT@+#z>U|hcgm(HIe5wg zhf6U=f2*u??n#CG{UK9Fm_FEjpUnn2`1?(EaQOU$3jX(sN0IW^$_g|F3VaaJarOgs z#SxB;J0kIv;zn@c`@9@@5ytNa2*lp^6_9p@hd$@?tdeDp1;I%$j}ESGoYSWp+vfW( zEbAGR^1#!k`QLg55~jR#&bfaOAcum@08z$2Q&U3Y75X4d*|SypmP@a(#cX zgId@v{61O&66#YN1v{hKGf{Jfe zS`-Io^*)W1z-hDwzC7aOuR0JXOEFrT`!?qu+dWWR^pu$aFFF9=2NL2Hzj^q|bdsU6 z_sa?*FOFM(pM$tpXh8v_t);K`&o6Fpqi7jS*%(V38@<2Mz6?)%RX`$bZQ;j9P zUmULHj9w7ks~Z54xx2fMf`n30m=ox2zoVZ?V?FxlbA8YazI*Pbqdz7%e86@Eez}d4 zWog*`2CgMqJO$kz=w13PKJ^rPNB@C9A<%F^gJ8m#Bd@TVHffw409TqQfA=`u@A5e? zY%K>wqX_?}v)TNFiK&6K`Sf(}!UBB^)N%E9T+ZP&7PtnXIA9h9=E0g-47(xOL*BZ; zG{4Wz0ZBwOogge*hwGm)h$#U3FREMp=t$e$rle!>KIIIW&8JVFK=9L&!zc<%vyiNI zy4kevP<+gFZFm!8-$3WRkG)4n69F$BAali$8XSfes<6(MioV4=A}mbM9e#*1fW+1R zq_6d12rUC9C?lXna)Uz;xIPfSb>eH$_1>@MWXgVfj&PM4;rpM>+q^bW7|e)J(P^o% zo0ZE@d5c2fwazO8F%cT*F{C!-k^)DQjRC%()a+_fWPXS19fn7m+{@WjLwoe~b=rx! zIVF&74b3FP4+db*^{G&$fXt#eJt&lUrc$e0406rg7L$KK zE(aul09psJU~%I~*gCVTxm|2bQk2z#hbAx>+W`5oqP*~F(V=&y0dFE{7mtyxj*IXK zEAs~u0>lmy#QGfSY;j3FAGQObviDbYUkeCbT5}Ktv;B))w)x*hA%@<=Wln_3u>Udj z=HruBwrX@xS>2jiO@0svrv&PUP=d#uO&gj~~6rbr?4Ex>z a?a^N`Mam>R1-t-?CM&7*rbPVhhyMfnfLgo& literal 0 HcmV?d00001 diff --git a/src/game/lib/app_button.js b/src/game/lib/app_button.js index 19991e1..1a53262 100644 --- a/src/game/lib/app_button.js +++ b/src/game/lib/app_button.js @@ -1,76 +1,8 @@ class AppButton { - constructor(x, y, setting, iconName, buttonText, clickEvent) { - /* - let setting = new RoundRectButtonSetting(150, 150); - setting.fontStyle.boundsAlignH = "center"; // left, center. right - setting.fontStyle.boundsAlignV = "middle"; // top, middle, bottom - setting.strokeWidthPx = 5; - - if(type === AppButton.TYPE_MOUSE) { - setting.setStrokeColor( - 0xaa6666, - 0x884444, - 0x884444, - 0x333333 - ); - setting.setButtonColor( - 0xffdddd, - 0xddaaaa, - 0xddaaaa, - 0x666666 - ); - setting.setTextColor( - "#a66", - "#844", - "#844", - "#333" - ); - } else { // TYPE_TYPING - setting.setStrokeColor( - 0x444488, - 0x6666aa, - 0x6666aa, - 0x333333 - ); - setting.setButtonColor( - 0xaaaadd, - 0xddddff, - 0xddddff, - 0x666666 - ); - setting.setTextColor( - "#844", - "#a66", - "#a66", - "#333" - ); - } - */ - + constructor(setting, iconName, buttonText, clickEvent) { this.button = new RoundRectButton(setting, iconName, buttonText, clickEvent); - this.move(x, y); - - // if(iconName.length > 0) { - // let icon_fullscreen = game.add.sprite(0, 0, iconName); - // icon_fullscreen.width = 80; - // icon_fullscreen.height = 80; - // this.button.setIcon(icon_fullscreen); - // } - - // if(buttonText.length > 0) { - // const style = { font: "32px Arial", fill: "#fff", align: "center", boundsAlignH: "center", boundsAlignV: "middle" }; - // let icon_text = game.add.text(0, 0, buttonText, style); - // icon_text.setTextBounds(x - 50, y - 50, 100, 100); - // icon_text.stroke = "#333"; - // icon_text.strokeThickness = 5; - // } } - - move(x, y) { - this.button.move(x, y); - } - } AppButton.TYPE_MOUSE_APP = 0; diff --git a/src/game/lib/back_button.js b/src/game/lib/back_button.js index 7a72570..f5c7a6f 100644 --- a/src/game/lib/back_button.js +++ b/src/game/lib/back_button.js @@ -1,7 +1,7 @@ class BackButton { constructor(clickEvent) { - let setting = new RoundRectButtonSetting(50, 50); + let setting = new RoundRectButtonSetting(30, 30, 50, 50); setting.fontStyle.boundsAlignH = "center"; // left, center. right setting.fontStyle.boundsAlignV = "middle"; // top, middle, bottom setting.strokeWidthPx = 3; @@ -28,7 +28,6 @@ class BackButton { setting, RoundRectButton.NONE_ICON, "<", clickEvent ); - button.move(30, 30); } } \ No newline at end of file diff --git a/src/game/lib/fullscreen_button.js b/src/game/lib/fullscreen_button.js index cf72739..108c7f8 100644 --- a/src/game/lib/fullscreen_button.js +++ b/src/game/lib/fullscreen_button.js @@ -5,7 +5,7 @@ class FullscreenButton { this.game.scale.fullScreenScaleMode = Phaser.ScaleManager.EXACT_FIT; - let setting = new RoundRectButtonSetting(50, 50); + let setting = new RoundRectButtonSetting(this.game.world.width - 30, 30, 50, 50); setting.fontStyle.boundsAlignH = "center"; // left, center. right setting.fontStyle.boundsAlignV = "middle"; // top, middle, bottom setting.strokeWidthPx = 3; @@ -32,7 +32,6 @@ class FullscreenButton { setting, RoundRectButton.NONE_ICON, RoundRectButton.NONE_BUTTON_TEXT, () => this.clickEvent() ); - button.move(this.game.world.width - 30, 30); let icon_fullscreen = game.add.sprite(0, 0, 'icon_fullscreen'); icon_fullscreen.width = 20; diff --git a/src/game/lib/game_app_button.js b/src/game/lib/game_app_button.js index 6384e1b..308a6ce 100644 --- a/src/game/lib/game_app_button.js +++ b/src/game/lib/game_app_button.js @@ -1,7 +1,7 @@ class GameAppButton extends AppButton { constructor(x, y, type, iconName, buttonText, clickEvent) { - let setting = new RoundRectButtonSetting(GameAppButton.BUTTON_WIDTH, GameAppButton.BUTTON_HEIGHT); + let setting = new RoundRectButtonSetting(x, y, GameAppButton.BUTTON_WIDTH, GameAppButton.BUTTON_HEIGHT); setting.fontStyle.boundsAlignH = "center"; // left, center. right setting.fontStyle.boundsAlignV = "middle"; // top, middle, bottom setting.strokeWidthPx = 5; @@ -47,28 +47,7 @@ class GameAppButton extends AppButton { ); } - // this.button = new RoundRectButton(setting, buttonText, clickEvent); - super(x, y, setting, iconName, buttonText, clickEvent); - this.move(x, y); - - // if(iconName.length > 0) { - // let icon_fullscreen = game.add.sprite(0, 0, iconName); - // icon_fullscreen.width = 80; - // icon_fullscreen.height = 80; - // this.button.setIcon(icon_fullscreen); - // } - - // if(appText.length > 0) { - // const style = { font: "32px Arial", fill: "#fff", align: "center", boundsAlignH: "center", boundsAlignV: "middle" }; - // let icon_text = game.add.text(0, 0, appText, style); - // icon_text.setTextBounds(x - 50, y - 50, 100, 100); - // icon_text.stroke = "#333"; - // icon_text.strokeThickness = 5; - // } - } - - move(x, y) { - this.button.move(x, y); + super(setting, iconName, buttonText, clickEvent); } } diff --git a/src/game/lib/round_rect_button.js b/src/game/lib/round_rect_button.js index 137dddc..b435a95 100644 --- a/src/game/lib/round_rect_button.js +++ b/src/game/lib/round_rect_button.js @@ -1,6 +1,8 @@ class RoundRectButtonSetting { - constructor(width, height, roundAmount) { + constructor(x, y, width, height, roundAmount) { + this.x = x; + this.y = y; this.width = width; this.height = height; this.roundAmount = 0; @@ -120,20 +122,24 @@ class RoundRectButton { target.events.onInputUp.add(function() { this.mouseOver(); }, this); } - makeButtonStroke() { + makeButtonStroke() { // outter(bigger) round rect sprite let btnTexture = new Phaser.Graphics() .beginFill(0xffffff) .drawRoundedRect(0, 0, this.setting.width, this.setting.height, this.setting.roundAmount) .endFill() .generateTexture(); - return game.add.sprite(0, 0, btnTexture); + return game.add.sprite( + this.setting.x - this.setting.width / 2, + this.setting.y - this.setting.height / 2, + btnTexture + ); } - makeButtonSprite() { + makeButtonSprite() { // inner(smaller) round rect sprite let width = this.setting.width - this.setting.strokeWidthPx * 2; let height = this.setting.height - this.setting.strokeWidthPx * 2; - let innerRoundAmount = this.setting.roundAmount * (width / this.setting.width); + let innerRoundAmount = this.setting.roundAmount * (width / this.setting.width / 1.5); let btnTexture = new Phaser.Graphics() .beginFill(0xffffff) @@ -141,7 +147,12 @@ class RoundRectButton { .endFill() .generateTexture(); - return game.add.sprite(0, 0, btnTexture); + // return game.add.sprite(0, 0, btnTexture); + return game.add.sprite( + this.setting.x - this.setting.width / 2 + this.setting.strokeWidthPx, + this.setting.y - this.setting.height / 2 + this.setting.strokeWidthPx, + btnTexture + ); } makeIcon(iconName) { diff --git a/src/game/lib/typing_practice_button.js b/src/game/lib/typing_practice_button.js index 9f27573..ff78864 100644 --- a/src/game/lib/typing_practice_button.js +++ b/src/game/lib/typing_practice_button.js @@ -1,7 +1,7 @@ class TypingPracticeButton extends AppButton { constructor(x, y, type, iconName, buttonText, clickEvent) { - let setting = new RoundRectButtonSetting(TypingPracticeButton.BUTTON_WIDTH, TypingPracticeButton.BUTTON_HEIGHT); + let setting = new RoundRectButtonSetting(x, y, TypingPracticeButton.BUTTON_WIDTH, TypingPracticeButton.BUTTON_HEIGHT); setting.fontStyle.boundsAlignH = "center"; // left, center. right setting.fontStyle.boundsAlignV = "middle"; // top, middle, bottom setting.strokeWidthPx = 5; @@ -46,9 +46,7 @@ class TypingPracticeButton extends AppButton { ); } - // this.button = new RoundRectButton(setting, buttonText, clickEvent); - super(x, y, setting, iconName, buttonText, clickEvent); - this.move(x, y); + super(setting, iconName, buttonText, clickEvent); if(iconName.length > 0) { let icon_fullscreen = game.add.sprite(0, 0, iconName); @@ -56,18 +54,6 @@ class TypingPracticeButton extends AppButton { icon_fullscreen.height = 80; this.button.setIcon(icon_fullscreen); } - - // if(appText.length > 0) { - // const style = { font: "32px Arial", fill: "#fff", align: "center", boundsAlignH: "center", boundsAlignV: "middle" }; - // let icon_text = game.add.text(0, 0, appText, style); - // icon_text.setTextBounds(x - 50, y - 50, 100, 100); - // icon_text.stroke = "#333"; - // icon_text.strokeThickness = 5; - // } - } - - move(x, y) { - this.button.move(x, y); } } diff --git a/src/game/typing/practice/game.js b/src/game/typing/practice/game.js index 90e0b48..c1d91d0 100644 --- a/src/game/typing/practice/game.js +++ b/src/game/typing/practice/game.js @@ -50,6 +50,21 @@ class TypingPractice { .setShadow(3, 3, 'rgba(0, 0, 0, 0.5)', 2) .addColor(textPreviewColor[0], 0); + + this.hand_left = game.add.image(300, 600, "hand_left"); + this.hand_left.scale.set(2); + this.hand_left.anchor.set(0.5); + + this.hand_right = game.add.image(700, 600, "hand_right"); + this.hand_right.scale.set(2); + this.hand_right.anchor.set(0.5); + + let mask = game.add.graphics(); + mask.beginFill(0xffffff); + mask.drawRect(100, 300, 1028, 400); + this.hand_left.mask = mask; + this.hand_right.mask = mask; + // bottom let screenBottom = new ScreenBottom(); screenBottom.makeBottomLine(); diff --git a/src/game/typing/practice/key_button.js b/src/game/typing/practice/key_button.js new file mode 100644 index 0000000..992522e --- /dev/null +++ b/src/game/typing/practice/key_button.js @@ -0,0 +1,83 @@ +class KeyButton { + + + // constructor(x, y, ) + constructor(x, y, setting, iconName, buttonText, clickEvent) { + /* + let setting = new RoundRectButtonSetting(150, 150); + setting.fontStyle.boundsAlignH = "center"; // left, center. right + setting.fontStyle.boundsAlignV = "middle"; // top, middle, bottom + setting.strokeWidthPx = 5; + + if(type === KeyButton.TYPE_MOUSE) { + setting.setStrokeColor( + 0xaa6666, + 0x884444, + 0x884444, + 0x333333 + ); + setting.setButtonColor( + 0xffdddd, + 0xddaaaa, + 0xddaaaa, + 0x666666 + ); + setting.setTextColor( + "#a66", + "#844", + "#844", + "#333" + ); + } else { // TYPE_TYPING + setting.setStrokeColor( + 0x444488, + 0x6666aa, + 0x6666aa, + 0x333333 + ); + setting.setButtonColor( + 0xaaaadd, + 0xddddff, + 0xddddff, + 0x666666 + ); + setting.setTextColor( + "#844", + "#a66", + "#a66", + "#333" + ); + } + */ + + this.button = new RoundRectButton(setting, iconName, buttonText, clickEvent); + this.move(x, y); + + // if(iconName.length > 0) { + // let icon_fullscreen = game.add.sprite(0, 0, iconName); + // icon_fullscreen.width = 80; + // icon_fullscreen.height = 80; + // this.button.setIcon(icon_fullscreen); + // } + + // if(buttonText.length > 0) { + // const style = { font: "32px Arial", fill: "#fff", align: "center", boundsAlignH: "center", boundsAlignV: "middle" }; + // let icon_text = game.add.text(0, 0, buttonText, style); + // icon_text.setTextBounds(x - 50, y - 50, 100, 100); + // icon_text.stroke = "#333"; + // icon_text.strokeThickness = 5; + // } + } + + move(x, y) { + this.button.move(x, y); + } + +} + +KeyButton.TYPE_MOUSE_APP = 0; +KeyButton.TYPE_TYPING_PRACTICE = 1; +KeyButton.TYPE_TYPING_APP = 2; + +KeyButton.NONE_ICON = ""; +KeyButton.NONE_BUTTON_TEXT = ""; \ No newline at end of file diff --git a/src/game/typing/practice/loading.js b/src/game/typing/practice/loading.js index 16ae580..fe21c13 100644 --- a/src/game/typing/practice/loading.js +++ b/src/game/typing/practice/loading.js @@ -34,6 +34,8 @@ class Loading { startLoading() { this.game.load.image('icon_fullscreen', '../../../resources/image/icon/fullscreen_white.png'); + this.game.load.image('hand_left', '../../../resources/image/ui/hand_left.png'); + this.game.load.image('hand_right', '../../../resources/image/ui/hand_right.png'); // this.game.load.image('a', '../../../resources/image/icon/fullscreen_white.png'); // this.game.load.image('b', '../../../resources/image/icon/fullscreen_white.png'); // this.game.load.image('c', '../../../resources/image/icon/fullscreen_white.png'); diff --git a/src/web/client/typing_practice.html b/src/web/client/typing_practice.html index 5cfc9df..7be7554 100644 --- a/src/web/client/typing_practice.html +++ b/src/web/client/typing_practice.html @@ -49,8 +49,9 @@ - + +