From 8f2be5fff227052fafb8c455f003ba640a78c77c Mon Sep 17 00:00:00 2001 From: MeowcaTheoRange <58280776+MeowcaTheoRange@users.noreply.github.com> Date: Sun, 24 Apr 2022 23:04:55 +0000 Subject: [PATCH] Cosmetics & Optimizations --- .github/workflows/format.yml | 20 ++++++++++++++++++++ .prettierrc | 1 + code/easing.js | 6 +++--- code/{game.js => main.js} | 28 ++++++++++++++++++---------- index.html | 2 +- readme.md | 4 +++- sounds/nullHit.mp3 | Bin 0 -> 17998 bytes 7 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 .prettierrc rename code/{game.js => main.js} (97%) create mode 100644 sounds/nullHit.mp3 diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index e69de29..dc2bb3e 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -0,0 +1,20 @@ +name: Formatter + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Setup repo + uses: actions/checkout@v2 + + - name: Format code with Prettier + uses: creyD/prettier_action@v4.2 + with: + commit_message: "code formatted" \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..68ea04d --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +tabWidth: 4 \ No newline at end of file diff --git a/code/easing.js b/code/easing.js index 267cb78..7bdf7c4 100644 --- a/code/easing.js +++ b/code/easing.js @@ -146,7 +146,7 @@ export function tween(func, attrs, timeLen, minVal, maxVal, ease, type, onFinish var upd = onUpdate(() => { switch (type(time(), stTime, timeLen)) { case "CALLBACK": - for (h in attrs) { + for (let h in attrs) { func[attrs[h]] = maxVal; } upd(); @@ -155,7 +155,7 @@ export function tween(func, attrs, timeLen, minVal, maxVal, ease, type, onFinish stTime = time(); break; case "CONTINUE": - for (h in attrs) { + for (let h in attrs) { func[attrs[h]] = minVal; } break; @@ -168,7 +168,7 @@ export function tween(func, attrs, timeLen, minVal, maxVal, ease, type, onFinish default: break; } - for (i in attrs) { + for (let i in attrs) { func[attrs[i]] = lerp(minVal, maxVal, ease((time() - stTime) / timeLen)); } }); diff --git a/code/game.js b/code/main.js similarity index 97% rename from code/game.js rename to code/main.js index 2fe6635..7e463fe 100644 --- a/code/game.js +++ b/code/main.js @@ -11,7 +11,7 @@ kaboom({ }); load(new Promise((resolve, reject) => { - loadFont("unscii", "fonts/unscii_8x8.png", 8, 8, {chars: " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"}); + loadFont("unscii", "sprites/unscii_8x8.png", 8, 8, {chars: " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"}); // Music loadSound("tutorial", "sounds/Getting it Done.mp3"); //135 loadSound("faith", "sounds/The Friendly Faith Plate.mp3"); //120 @@ -21,6 +21,7 @@ load(new Promise((resolve, reject) => { // // Sounds + loadSound("nullHit", "sounds/nullHit.mp3"); loadSound("score", "sounds/score.mp3"); loadSound("metro", "sounds/metro.wav"); loadSound("explode", "sounds/explode.mp3"); @@ -477,7 +478,7 @@ scene("Game", (arr) => { ]) onUpdate(() => { if (health > 1) health = 1; - if (health < 0) {health = 0;go("Lose", score);music.stop();} + if (health < 0) {health = 0;go("Lose", score, arr);music.stop();} if (music.time() > music.duration() && health >= 0) {go("Title");} strumLine = lerp(18, width() / 2, health); noteClick.pos.x = strumLine - 5; @@ -550,6 +551,11 @@ scene("Game", (arr) => { } }); onKeyPress("space", () => {judgeHitsLol()}); + onKeyPress("backspace", () => { + underlay.stop(); + music.stop(); + go("Help") + }); onKeyPress("a", () => {autoplay = !autoplay}); onKeyPress("d", () => {debugMode = !debugMode}); onClick(() => {judgeHitsLol()}); @@ -696,6 +702,7 @@ scene("Game", (arr) => { } function judgeHitsLol() { var iv = false; + var hits = 0; every("note", (j) => { if (!iv) { if (!j.empty) { @@ -703,6 +710,7 @@ scene("Game", (arr) => { var theColor = WHITE; if(j.pos.x >= strumLine - 20) { if(j.pos.x <= strumLine + 22) { + hits++; iv = true; destroy(j); //Destroys note. No score. noteClick.play("click"); @@ -718,17 +726,15 @@ scene("Game", (arr) => { str = "Perfect!"; theColor = MAGENTA; } - if(j.pos.x <= strumLine) { + if(j.pos.x <= strumLine + 5) { score += 50; health += 0.02; - str = "Marvelous!"; - theColor = YELLOW; + str = "Perfect!!"; } if(j.pos.x <= strumLine - 3) { score += 50; health -= 0.01; str = "Perfect!"; - theColor = MAGENTA; } if(j.pos.x <= strumLine - 8) { score -= 100; @@ -755,6 +761,9 @@ scene("Game", (arr) => { } } }); + if (hits <= 0) { + play("nullHit"); + } } function beatHit() { every("dances", (obj) => { @@ -958,7 +967,7 @@ scene("Title", () => { onTouchStart(() => {go("Help", ["tutorial"]);/*losemus.stop();*/}); }); -scene("Lose", (score) => { +scene("Lose", (score, song) => { const lost = add([ sprite("jellybeanFail"), "dances", @@ -985,9 +994,8 @@ scene("Lose", (score) => { pos: vec2(0, height() - 30) }); }) - onKeyPress("space", () => {go("Title");losemus.stop();}); - onClick(() => {go("Title");losemus.stop();}); - onTouchStart(() => {go("Title");losemus.stop();}); + onKeyPress("space", () => {go("Game", song);losemus.stop();}); + onClick(() => {go("Game", song);losemus.stop();}); }); scene("Chart", (song) => { diff --git a/index.html b/index.html index 9a3d75b..e196b61 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@
- + diff --git a/readme.md b/readme.md index 83cfef8..7589ea3 100644 --- a/readme.md +++ b/readme.md @@ -3,4 +3,6 @@ ## ToDo * Good practices in Js code -* Module code \ No newline at end of file +* Module code +* Custom font +* More minimization? \ No newline at end of file diff --git a/sounds/nullHit.mp3 b/sounds/nullHit.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f31f30544fa5f0694f1245b4680f5d8c56502e8f GIT binary patch literal 17998 zcmd_RcT`hf*EM<)LJOgHqyz{ZAwcK|q4!<{1?e573o1$oy?3NZ@1hjJhDw#*Q3MqM zDWal)C{lB7@_XL$-21)X_s_lm-7^NsA<3C*k1_Yzd#$Zf35!2(TU@4$?M8jvBm#`Ts=yZ4yfQq zjSl(3M-;jfo|0^dB}Z`{mDAG#9XpQ-RZ2(5Xi^=@S_)rg6EflMU%EVKmL{6_^`83?0xjb;HLxEqB1B= z@ce_?v0}gXt30ZJ+%oszS=rr|jii$Q9>`zfK!T;%l1mwr{%s)tLkKxXBLS83idV;! zPHvwtn}BLxc}5u@ OtPn$1Gd8F7Z2^&fA#gP#}YK7ioa zD~` jGSKADy0%1Zc@+43&Fvkn%b) z5hXOB?xPA3)h8tO2aD3_P#*m{un>VVs>Oqo>dR!ll|^D_955H-Lp2mN-?6l$0frWG zCo|ce)jqx)ybH%+_5D=niu{nRE84J)Z&7W=(@9)p1Z5U0lf(&17a=Ne`tX_%WEcmk zUm1n1Xo+NX9}Rt2xr&h!(x?W~sG}+4Vgy0mjbw_L3h9|W3Fv)>N8qnj3o0t& *O{MJ l*-Y(#7C@&A2Bcq(ueKw$b2YHOKl6bYtCw%|%y**BkZY)A}!*rNfUhhmFn zo>;({Tvcqm0ibC 9R^>OhM{Z~L00TL#9JHsNm2yDvlO)9P-0QY) zci7|7Tm`rz_UZLB_M;oW o{Y1j1>0jA=bx!Ohr=ZVHdekk&7m?q=^?w_L@P7{C z-{2wtui(kU5@diTih|LO1S6r)78Ejxr5}j?vJpS(th8&QsTI7LLC&qzAG*Dpou))2 z|AWu5I`as#G^ooeycJC-_F U^9{dZq{;ZhKMqV_y}DfW1A3!Z6CoXo4dZAM7o~UZ11;hjwm+!ijqgpq`u? z#0P=M)+Le{>g+`T&{Gquf`ApkxiQ6Rq7 w9U6%+VVSR_|tcB^k>So?#=0wP6xXO&V vKak zOE2_&|6At$pfV_sTWIh?iDpl~?_(7gvfUCz$Swo3xX+#Y&BojQ`+JR_U|NioO?8f1 z0tI1pPrvg7J_wVit@(@D-iXjubl&&5{l59WwLiFA=6=pr_tMPm3#Mu%cQLC!*_~hP zU${zxzw^*_Nx-6KW1w=XqB4nMw#?j(zF#V_b4Bf3t?+n3Egwim|AS3BgVAK+CYG zsA`CBzrM&ff^rmiya&+HkZV?d @qD5dSq-v$`qWx`r$~K z0`~_4hfV+zU*b!nPyuX7!l^WV&sp#Ton(&|+s?7#=e5Cs@jKk{`rW6mQVfvY;KXFP z)HyB@5G=m?=9;6swjwcu{MZAC(7<@Wqo4&8bqU6jCA$yJfs09;gf;}aB7WHS4n&`| zQUL)fG*CSK8RiZ7%6aVef#*Pg9gPD$$SiZ{0?&*-y3LZM84Z@)Q+HIrn1i6abi>D| zg9$|G{OB1DFk_=qC9Zj`2F!p90IBZ2ph_n9QlGb3!_->p9J;sT>eW}k`>2iw5vO+K zOI1i)L`Ktn+_W_H3a!d>M>qCru_cL}DxQa1Ar1xpT#3 & zM`9?w9gc&RoqL<$ivw)dZnjRK0b1R71I}T9I={71TWK2Nstb 6=eM;GGyQo-Em*oq6Xk!?M1jOec4Jc|~l5@TH-KT|0-y7FDdcTCKD zI#h*;Jo67A+hZvjmsy*!I#($KDgRZT&(xZnBBaLxEy3n_A+xgwYZf@V>s~f8;_=1c z3Y8|$Zoo?GJ3C|{8RW54OE#pG)?S3ZJ4yH=Hgs46%wKr*T^d}Tm_SU7^qYgk0nsuE zQ}>5Lzku%u<~795$#*%EU(p}|+z-_=d5V0^piK#wMyktJpa 2w2_o*84a(q>Z3PfjkchIytl*^`Vp50XMg=5#tc9`FLG3;)*8Dqo5gq)yiiv z^~5m7H8Hmp9f||WiBi$mV!698aXAERx<}iw&P0z#!Q~@Mu?$CLZ)7L;cM?PIl8LL_ zcWWz(;0nNL)DJs}0cdvDEJ*uM47VStVwKghYX_NKF5K@4WrRw;eFwZ}o{7<`Kf)O6 zc%lddw|bfI7O=30J;yRz2t3otk<6L6Osx1`a|w%A o2_4F>s6eFqpF^kFC zoAccGTs=V+C26+mdtL@c^Uj|GC_5wR+>pA(&sWZA-9(E%FJGTI&zP5ca+Ff~dcK?B z=5fVPPv G234sC=Vq@ MA^PwBBr=A?5IY|+muqI3llJKW?C`~& zKR5uIuTGc3V{p_F6yMES(GVz%A#IO>0g1(75!^+xE=Rvs4%O*naX5a^FbK;4g8)-l z;{Pj$N>ort;!W)5&@a7YccbXo>Eov>T=-z&szUTp44OeJDcQqm_TZQ3?y_JQ6$3KP zI|&^Fg+Kr_r>sZs{zmU^6dxr7&?aOlA*rAM&bxw-lK2@nF+gvo0k>JyAu?nqb~WhG z2@V@O|B Bpe!-2-{9bmPXx#`Y0gTU#3mIXOAS6FE8ArY7)PQ&ZD}@efMG zx2A6Jtrzj|v~?!r6My%w^Bs_I-?pfzsBjD{5r1H7YlrC7w1|-%yH3+;Oo@M>*cDvp zd6uqMZS~F1FQA=xnJt`!g@u(se1XFQ4@E^q#pX?)A}cB?y1{7|;#-A jIjgs;;EKJD{6IDo>3%Z%l~ l!Hpty4;V-8HOb zClcEeR9Kwj%p31M{>me}EoJ6(hP)BQ3VyA+7SmRB`w3WFQV|fj#E$uM8~fBADMEAU zesnL?ML+yf1yNc${CG`+Z)*Ab-``9xlKQJy 7>#S(pTqccDzPm9( zHf_C}B1?vyU4q1rOb{G^9uQYKB12bF{IDd3;=(OR73*y}32$^OaOcYBy+Ck;p(v6C znG1Y6Me6vRuLe@&Bb^L26GWJnkKWw#l?EqFObv&N&VdAv08@j3z2wHbAR#5kP_Xel zi)l0n%IX@T0>WOCndwNb*rrP=jdw6babde09UmOsN`2i8qO?3$Ebt~|w{~L~D;}po zMc=N53sG>C8b^Pz3a{w~ I%n`$+z^#f^H}E{2=1e7a`cAG zG%IBL1hw5v&a46$UvLx>E7iL0<$^04=8*$bvl@pYIoLbYV$uZab$-b*Lxa+t)2RAl zS=#i}kc{B3*K*_O)VM5nU~q1jfDkWZRArB*K8$(v(OEA(<69dRvYNo*I>deBO9lIC zCSwiRuawJ&x5Loi%ZFHF$65|$fuG&|!RxRIr|6Y3EvBJ^XOrNNu3BLTq(#(osBvSG zMVTV+RxdOWLhbo4aLpKKCRH;?MFAwLG+P0HJRj}d{tW^F)F`p8{UfKAs#_udk1l6; zN`r&`=C-}&;R3kCrYKJ|12hv51JXWp2PsC{hu+Pfs*9ewe^h_jmB*IK$ @J1h$nLjubvRCOr^XelMH)6FGTMVnjVT-D->;4%>e)Xk#KX=4(VTs>u6$h-0 zN$&65-k(dpfzH}*)n~I(greDQ{rHtG0l6bHMyD2}(M}ek?Y2l`^IZ6uhezL-GLPP9 z(IlM`)>h#2mN4d+{O2_Y*3 OB*_tV(}gBK$->s>ncHsM$us@?% &8eo*gY4s-tCuR+m@M}erD|`#^PLUKy)nim$C<^S|cI?IWFrVj_t}c$WpAE@^B3sj52QBa@Zk@rrk-ORyUWI z-SR9=J6lERj@xx-8LuVNv_0K8OP@Xwfh?vFF}czdlMR8KP@W&87} ((P7VkpTB z>>K>LWKM{fuw;gDf?!rV^#FxnX^N%`HquO&CslUWsdI$3m^Vl={rN;yVW;tx2d=#? z(=#SPqKvhc#tcnjBdofZUeP+`ZpCSLYONUA9BNuFL&*YnJFdZ$=k_t^N}CRJ*hS}o z@ra)rw#9XS86RB6@kiH3{|x{H9x}n4HeOmyE1_3feSGSaSg2+jYLjePR^ly9(MDn! zffK(u`dBPPJn(Mmr~+ejXTtvIe_`s!A7<-^Mu<1RReYLmdQBY7xmvA#87k)@ )Pa4&LI^XL_(V%Cm9Vb9Ady%SLn>-)I5IVjS<))!t$$2f ?BVEO2-U-!o}HeROM&O3eKqe1PvTL!~gLI z_brfdd`Pl`I|8s?_wt4vOIaM2r(Zdi4mUQxopBDyfOkINBYT;4AH~{dfY=L|VWYxv z@vB{9-x!Cu;XX>74Rd7Uw@Pg@ql=2%O&hyEJ^C%5Q3~$Q)XAhPZ72_082`#{DQCjz zVfJ>uy1k;MPQd{XJe7CZjV~o*)k&9vH>R0{)L$)KN3Vc`KW2;`3sNKHMi%xsqzo^N zd=kjA6Fey#)cUsof6D&n09vMMw~p;wVzt~liQ1*r;P;##osXP4ANLnT@`#Ry>5~}J zStr&*Ah*>|AEGW-<=Z-02q1iBj5zCXkc+gwu|!QluA*Wbh}$TiTbOb_JM@Mrov%-1 z@gBYGHDnudI>lmVW7hY%#xT>W4BEvZ6)wr*tEFkNxT3mHk&Cj5AK&tg@hdQJ-a&_M zv7!Bx -Bz4ZUFST7JSEzG%nC^uw zy0zCVIOVv%y;0I)eW?JBsr7a35*W{}3{~NBZA)ciKN*)>>1m7QMPrg1%jDmzKC;I^ zk`Xr3tcv$ uP@P*Kr5$=ZSpZ zM8LB!)LPjJol%79CdTYBSnRPKA|j*AoW6JZpQ@9I{iuK 8t8kPyZ6@a_ Xmb)G7_8+uMr# za1f}=7M2VCs2ChBEHx*LMI7rjatiw-XD<^B5GV+=USsFi%5X)bkU|$3MC_AXz&*># zNt@^8)W?P;VTB)__3 B;5RY3 z=%V*FV$(l*^;1df=r~GH(7LuduI` |>2@<2FX? +*h z=TMEssElF1rWFKjgEJD)6JivU)p4AGn``Cz*u@(4)@t*k8IcXt5CyP#5@6*qVirBfM5do`a7Dz&My* zV%~7C2=&z5LY6YOK2FYZR42$#gv=_7ftx-x9nM5CA?BUBqZ|m1o2Jv!Y?7~=f`pd+ zP}oeU4s!`nYyb(xlQIo%& &=_EgQ@E@zB?}@b1%M*-Y{vlfY%*aC{d4hzy`xWKZ=-006{%hcMiDm ztdJYcc;-^v#*>u0yz|%5SL$d=;M}zpBcvYJL`Y=2pvY7 EAw|jcgak`1I%h z{``=7>(mleK92QI0gDt^=` eGx?;#UioTkVY zBQ;JC8F3nhIgH`e9??G&{`(@QO;o7=*UUv<%CX*TM(_QN9g8q7O8lz=vGE{`Fz?_K zB6QPaLK7wphzrfSBnNTlH&a}3`l%`@!_X$ccX~`gPhyBwofbz1ahW0(tWcLU&Rt@n zVC<@|qWl=g7$*9~n3!ziJA0#OQht7;bWwpU61 (NDVIGpj>3+4EkNvs^WALc}<4esltCUKCot T)Ux~+_CXLWVI>F$7U0*cMtb$MHe?E>RkDF1ZgQX#Q=a zA7RXS?)J;@`LQ!0u_c3sm$K5)gldo3P%cpr+^VW=w?z>PJTR `f8}dSmeRSLd{ujfbK7$w4HBx>@M~GC*mXv< N$?i3(@?S-h^d9P%eYNOW3JkFaWyVYh{R{7L^#de(8Z;4o5Wq@Et|z`td`^ zD)Ata2K?s BUOq(ShkNBFJ9?4M<+mtq} lh50JMR@GM`wm z+Th``&1nE#jHeo@V0|lDPio*L#71uuud-n!UByK~IwRMt_zq&938#`7(be3&c=k9S z3jQ*ne5%}nB=3u;ecL`*VEumxZ3M?xRxF=D{)I%ujLG_EU_P0@X_DP~W@Bp%!=pd= zT3=US5*8X@j6dhFl0EMEMaHG?n{562`hs*;ls(Hd6V7V odlocR^|E{1BwJpcX#VdTeftM2;&}E* zxR|=?F7Z~674{LItj-|DL~pxtST>bY^A27KWkX1jiQjIz;WJ~U8)FI)C6^oty$+c^ z2YeS{&a5l0wlIssT^V7q@%o^@SMmIR3fevY-$DEBT3Swrzv+!%BL%$=g4-j-@JCHV zD*4g}`}a-`3DMeeTpYfd57jv^A=LIHhJq0Y92uN-_8KwScIx|feu5~R+LEh~7zz{+ z(Izr<8T9}1PVcBYQTaL&ph) uvkE0@skR93 zUeD}D4K0~DH&X%Dw<0;%Y#!ZS2xFF^RM|{eiP1DJ9^y`%ZJdo@FSlCw)#QYWjOtpn zTgjbWC^Nkd+Lq;Ku%ksDdD19aRBj1c)iF8KAz{!qqlH5ba^T4kfo&x_G8z^Mmn8_V zD$oTLKkz#&XNmirqX8Dy)r*@yfQu_}Ddo1s^Fb9=TDw*1KMwusR-8AF_ z$E^%Eoe4RqgCp$e-JoUUi)w*iZ?1sgOp(Bdz@R}FC<#x}vQ;rf1Zh+3^8B7}A-hrA z3a2QRq&$Dz`7qh^%Ss%2gv1cb5Iqk1na6^HXj8bn)&vl33W)Jg&1W?LB!f;=5rYGq zT+A4ua<7fSB$@4Km;EY3aOjfG>j~6+tRrAjBC!F)ki{B{{*BXGSz$n4@V5N}^tgXg zbtW*#%AZ}D64XXAWUr`E7hR#)H+DhLV(jT0{(A)fPi)obz4>gJP`% x!k>_Gj&J^+30xDyAk(dywXTb~gQ3R)Sv^m0TjKLpE7_AYHK zTYt`axqpXXX0?RxGu2Dg 9JR!)U0sgi! zMcIt};|KgKkpqZ+tSE5PRR8FclgN}nd0oJY OYA0)xbuo$|G(?L!mCb`JdR$q80575_22dy^RpM5}DA@G*gX6OoKfV2z zhfv?PrZgj|<{o#Ao#cPQXFc{3$!cvEC0fTd9hl6>C$3g(^_WyIya~M`Uv1M-INvfF z5Hyb}A~EEVKx_})qnqL(%5pZni)#-MfXM}j5^0r7s}Laxr}BDmZPsCin%9=59ARjm zl`(A!aNy`%Tjdi@u@?v12yD(EH2FTqO(x?})<-$fKhl5rd%Ut%6c7KoAmx9Rk~%1? zI!K=TUAoWP^TP7?f0b~{CkvZe;u~Ivz{F&1to3*hTuQR`E*}U9!%K3tPt7Li4z>+q zgwn|Ej<<0hFDfsq($6nUjPc||&M7pVbh#BI2p|J|$uudh#Bri2ki3lc-tYC-HH{N8 z>JND =An1tNWX0oRA0`!~O3vbQ3zf5FX8MJ`U+CCq9QQYjBXJ&nma_ zn;Az&&TCFu 3bl4Vn7&H)kqlwPW}uxS`l?C}NbY+LK`s z2Nl@55m~4raAD<;TYU?|#gOpIa*%sC@2i!7`|?;HC>h!I>pC>Vqbrk6&Q?oexHUBv zM@gFoHr7xhI?G|f^B0ItK;HfZGI|k>u{oh~vVPyJKj5hMxBrUZlUlj)*<~x~Z|q9Y zNyQ95mH!4E>|YW7 kDdc~*A@fVo6cM8-Z8vd`Z`dJlpsP=guGw*R}w?vfRSF8oD zt^K~027-$po`9f&8Zjjs$caBE`B1O=Dh_@=zG<=_xS961EUhBgz|(vAy<{6W*^eU{ z3KbeOvE+~JJN9oNWZlfGeDY!`?9>|8edn$`YxNiZ^>N}`so!CQF6$I^po1Ja< 9cDXAFjU>Aq z{P2bfsXdg&TTi-&dT8>cKL;`M#-M7h6X+-{1gvOXB~HTx%;hyG>%qgvVF$!?GB80o zGtjcX8+6!-;>K|@SF`SN8KBkf%#$2@2MxV;ls9BWiGz?O4PxxmKZ6iDBn{$!g{NxG zC#W!r6qm=&fv1;MZbgIOlYZ`@Ck?C1VDrhp!{286#}JtDJB&weuGeLp-z_9u-M)59 zhZX{Ir-%vXZpOAU#YJyLDKg>KvC-wyp3oqE=3(d4wV(fG$s_NM?Zak+?{^uI(-_1V zA5*J%8x7Hc#R?QDlUwZ;haAGACMc7dH`VPk+ s>cSaoXrG=EH 7X&Xr1Acj`>RKtjZGO%8-(bv74Puv9~YLHjrt3Q`zkfZgsBvVYG}XP!z`fN z*|GNwP5Tb(AOl4hKkDTE{n=56+y1QkbUrN%$}zokzK-c)waT@a$veI;mZR?D2}x-b zk25_{bF;bb>prw aS<5*Qy@$q*_}Qh4d*Wtd?qI=fbJQIrj`|ALQ_n<*(X7!bxq zof?H1?;av6diPj#?;Qo5ym(MK2Str$LDwkdX<{M^o)@>&{R!3nab4+5->pp$rT( zmH6OG2O7|7{0}GKmKxh$B4dp7i7G#zeqX!J*uk-AqoOwWdk!P_-)_AL3}O+CjoCG! zqAvwcpDOXedi^TXurj^1kJPGUEyasoX5o?62nbkSz%CZG)+<9!Jyfj360}A;^{7t| z{TVF;`eSbMQLiW8J@{>DbuAIx{962PUPI|RYH&A5otl{25lyX7%3d_0tpb7Pgd{wd z `!?5E`YTry>*D^ P7gQPu7_a zpJ{yDZP4y>U8}Zmd^2KOrEuloWg{;n1OwSUwFvrAfPhP0qq U3-T->b>gVvPN4*5vGbNKb|-`rRd<_j<4%nwckz&YKA5~uP>`$> z4dlL&1j=8+O5Ee)$N6ybKIhfS6&)8xM#|*gEI3-7laVo%B2J==l@%M6*S@3G{!^!! zch=2NsQU4l(=+>0F1IS9WK<`$uPz$%S|``8ru_*q+ _<0Lw3?a1zS5GLD*w;*ya{E zwpD|tA^Q8i{#tFTiUyAwZ|iLgV&sU6>%=rb-MbRo4NB4Au|;Dl%&I(YG4bS_aY!9{ zb-Bl89Ma$+yXDvExVQ^MKcPg7AMKRaAh!Y4qB+PB60|OU0o){F-z92bA7=!0h|T)f zfB4Wkd&IPXaP8mSe%v@Z?tu;JN$%|w^znI D3~?F_f8yb;plp8XGiPR)Ef?f1LNiEYKR~5FeIxuKW@N` zM%x-)3B)P1IG&F X;*BiFFC_-Jv1k$&=D` zaaSf~de*o35UOG(STWdDuJY~-j^XHa>(wW-ESVonW6N@6f?TdFkNwJMc(OT&DCDlV z?@@{L5l;@vc{oz0m q>l$8t#qvyTdky!!qrU%dQ4`z32tjg|SCNy3wwt*Yb! zgJXNeM6 VCl7U8jEfw>vi`Io&nBG# z(1;A>4JZtK!=Qy9`0=hjnkSL}Bhd?%1KjSRiNk+lm{9cSfx6+3a)@Ruqc}me@N68l z1^&w?Vm&0Ld{3EZ$Qn{BLgQgn{1h%E!HHMn6rrZ30e(2qr>CbUkYp%M5C@QT;{Yh% z3IO=;tkav76P~Vtpyv=LL5;G79xo?_e%C?CV!{!q^6QD~us@ylk>tkBARL~`J(rS( z_*^>`LlQv%fyBnZm|MXWj>yPcU?q4&)VRPQdIZ1-665Oc67?`u7y!IGqoSub2YHll zEPd_ohu!J#y?EJ29I2C>41e6u@cRO-woS*=@8a|AoLLqY7yICFYI1Tgh3Jx!4EzkY zdaot9vn7eF>>`kplb<^xhvB;p<5*ZewZp5scdDZaYg#W)^F*&g$OEtUj8`QTK7Qt! zbdzZLvRZTz72PJft6mUoSSXf@XD$^Lb?Ms{R%Q8!FSn4-$jL+hQi+Ow*d=~xw+hAM zm#6V5mIOE)@%PkT)A+*=D)D%_HadTFL%$3iChzl ;4g!gbBHNF08Pmv HT9>z#FHu$XQ$7MTL8$wdQpT; 9uw^y6JF%t4? j z%fXY3?q9enD`2@cLt2zLxl_p|j=4Z_As2 A-EJD-{94Ob`-&G|`Yt+mwR}`fTW1(Sy8C4pdplYJjJ!6%2(G5Y)OM(}NrmLyukP z>3`i35lZCf0c> 11#liU>MuET1tMdn6ff zs#Nz`)$5ouYk&kUi|e$!OlcQBTUX4i*w6l3)VMsTK6o<81);{dFj(VrPzA+$K6y++ zb=mr*I?3EhIc9pVqMeUPAKQPW72VBioc3L5``!)Wo9LRk)ZqVMPTR1VXqxKENh!;b Ktcm~sIsPxj&>g1$ literal 0 HcmV?d00001