From 586cc30bd1894bcbec2b3340df40949b7469889b Mon Sep 17 00:00:00 2001 From: Cade Ayres Date: Mon, 24 Nov 2025 09:51:25 +0000 Subject: [PATCH 01/41] Added KeyWe support --- public/images/game_selection/keywe.webp | Bin 0 -> 27602 bytes src/assets/data/ecosystem.json | 329 ++++++++++++++++++++---- 2 files changed, 273 insertions(+), 56 deletions(-) create mode 100644 public/images/game_selection/keywe.webp diff --git a/public/images/game_selection/keywe.webp b/public/images/game_selection/keywe.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf822326a1df6c18ff83d20eede25e82811f71b0 GIT binary patch literal 27602 zcmV(vKYXAUOMM6+kP&il$0000G0001I0RZ3u06|PpNF4wG009p${}B;_ zXu!h%PwVm!(f{=QzyJ6D{@;JbC<_2qP&golYXATct^u6^Drf=W0Y05Tnn@@prz9;E z+~}|qiD+&7jU-Tvw73H_)2_on}|U-|F- ze!<_ipa1=&zx#Va|91b=>6QQgv#*|BCVbz=M^V3E+5h(}>Ds5>FG>4U{|~`_0e@(97(y2X}{+B2GYeh8EtN!eY zP|~emKMqK{04!EcK8r)Fi5Q|GA9Io}Jt|;4rUmN_lYUD{W7ki&Oy@&T{WUBr4~PD! zw@GU^F;(HsMW%j;nyC3zDDP%cK59Sw8E4fdz;ntlZ6`yG?MleOciD<5h`rV`!hKQv zD*bI3JPppTw-l#8P`;!@d=@mn@?2UUq6bit3FeV;$8>Lu#hT-ce%PwPJ89f z3CZFqrcxOe4Q^8h;SV=peFM_HgE?2PX|vJ<9^*$6+exo7^U-*FUInY=*1Mf>tn4R9Kb#2U0Ml7 zL9obNs4{6ndcmte92Y5)`^}8mFxnaw7`G>6dsfO4&5;-OT+;O6gi*AQIhq9x>fNC- zTG~t1@8@xHxi>^}CE&RBaB$TvH5T(fErnt^b&Wz zlrUO4?ijSV5dBff$cRpG_wIhQu0ee7*ce@b%+819d@X69DLWdfDiraerCQlvi}%^X zDdQl_Cm9V!p>f{7bye&>eY2>_yav%)bTHu<{+xMBjiek)+Y2-U^~c0e4rAEFU;;;bI8nn0aQNuY;n*vhWA zW=ln%A{EM}^}OvhgWmsux_Nlz?SUYI;}x`;E^z*c307-#RVPnfpPoEt7iw{d*b|%&v~FaT8c)CAfP3gJIS0!a1@iLHq%iWMvicsnWyC)I=km! zs0pgUr9LB@LFXnmrUoeE07TJ_uIxG?e)@g-uIV-!XneH@@0oU!)2#>ERLgrT`)78w zGX?8R%$19&I^h$oeT8V$Kndj56`6FAd<{dH&h`4k*w|eYcnpytL z`u|x{$D35+@YU>&HN0M`U_bQIMmQ-V_2u#r-u?rTQ z{v+G-*ug@zBMfWRz-;ep2CTFEO+FN2UOZ-{Dj{Z~~?Z#RKVbmE)wJh0|pk#z=V8OKZtq0ZB@0_IlrLS6Vk6O&jrLmGk4 zkpW1LgEJD@eF&oHR->ZI@R)KU3;`PU4 zL@S!#H(*Sx1gH9Ue`)Ci8)TchHUS!-i?&D*5@pD{pH1=IkH{ly$_s;c;JID?GW{an z*f9^9G(#vZ%&nCf*? zuvMXYU~L;-=at~po+F6HC64(na_zoAfyggE#n8ZH#pj))S>T#6bWR7$~Go%D?}6yB#PPEK)pb^+fFn{2%(y zwt;U}vUoX{1KB4Uk&1%l>RmXpkvYB|K$iB($n7@YPdA!HM2#^_^7Emi0qlOm%Wr-S zTk;c>=er0;61ICz&`%0eFn03o&)hFhXNs3~d6lLm>O_gZi@)E^>q^REn=yAoLm)r zf4IG!il^jXF^SLc)v?M zmKwMXs;gdppFPS&WmeT5FPLC?_VC+*uqlJj2CFCk_~zZD>h`8c^rl_a8O@;FqdbcL zd4}$aU}!&llCN%zl?7e&1vwoS&HEUhY=gASkWBu32+HslH6PfKp_3gsmGPY9ylAA# zi+aJ&ei-3lv6rnM?oAN`(oZMfiB)s57<*&lGg&AJme89^iv zF9MsN$@Oz+WPCgCUtlDg0TgzEn}S@dv~;w0!GE^Jn5lVA`&_vk}LG0vX%^vHYuCQg{rCjLJzT~;8d zUqZs&LM@nm1Uyu9hU9E1T*T>oZ}|))Oa}w_PrmwHtqaQ0zA1YCzIcwda6`1Od zKy(Ag${jz?p|W^;0Av^TghrM@+Q3ZN-y=C-!aj+%sR`P1Q&W|gq(xCM*aG^tFG0dgxhHHDwbvWo-rmeuKC)vht(t_?{A)v3b^{Ste|l}t4IwfG zmVXG14!BgdCCM(Cd(3s^mLjStV-!%$o**j8V2OdOa`XBYB?AKoKs9<#x+z5qJUhD` z+~g`E1SkDR@D-;{Q)lzL+Cd?~l~T@KCx{hrY4(wz=*}*y!l9chQ}rA1oUxza+zgaF z;aMs*w~+s2fWS&ymUyOL>`i&)t&{s;@;sCRv~2TtG1lHs0sQ=zB{(9O2a?3d2#m(* zR9`n?IF1atZa^p#Zj|Fj-BbC7)BXQfuN+-|Z#oMen~f1osv+`;6Z2UL@kv{GBsh=OCvYdQ;`<{$1iCaMPX3ykI9 zwg9%<>3ZX>!=2Oqq)0fy3&RiSA$SK+DdK8i<|X-7v!h*Jm|>u>j(IKLc3F7ofdEzW z6tO5NH=Gy}b4=riw;tEX9LiwLlQawft{V3F`cS+U+=E#zU>kwF8G@Y@N%8qQ1a% z%=uuy%+PtU-IHsM(ONFxe|aeV*!_QRWP(^l3s|Pa{kb!i#8u5Vv_2^>ZW-YG!Erih z8>$`qVrGE)`>LG3E`~JQCoN01xYpxjkB7CS8sohnAfqr#LLpv^wKzQ+Y2j0o zz>hWK!)F4kl`dX`aB^D^d=BFAXTY~8N z6Ob+9YxEt>`6Qt8tua%Z7H*OVX>03fOoG)7Gg;-9_lSCW+D?BPb>Lx6i-Nx75~#|! zHvs9`>W=e-OQPb17F_7(dLSHgk8j(Xrh?SMy(HylqL79nBo+@^sc9UJ7ZtDbQW%cw zkO6Cv-LokkY-R&Q`8Y4x?x0@YB)7sK8d>Q*2-n_=E`DNP=KB7bf90t-s?#}IvyZ~&J z2Mc~HWay;ZToZiGPZ1gxM%`cFX$B32qgYyItE5lEkTr5CVG#E6FKo&+VI+Yi^QK}C zZRt36IcLsxs0T2I*QjFWacPZ>Cq#gCy>I#TO>ICe;ukvQJ;O6ZL&}2d#Y2e?5+1+< z>(Pte1;4=dQ*$dMa%WXa@lT|7S98_3kY!$XQPC}$7BW=&OFFT&0)y!M!q39Cf9|{f ze3e4BpVaX4|2Vxxcrn5WCj7Aq?+^e~NO;94^j^2XjJ;G=U`3I>5l%a;*IV14ZS50; z=}!*xo0?`_N&rlTT$31#ZDm0)Hi4uYLlU_+n&5azEWQepB~>zs$`Sg&01*hcfFKvK zr%9Q!T&of!l0VF|c}Ae#QC75h?da^Q!b*#Z`J^y*dz*KknGgg~Mc-Uj5=@ZGC6J5R z?)}H|U5>vBccob?$~DnywZSqIj-V(J8X|NrdqBi_BftUZvqGXd1|p3sn+AXuf+Ye% zC*rbYg2aFa-vZzh{f$em(;r5VB1fB+5Irx~wEGfkk52wmv)wzKr^OEo?Q8hC?1|Tm z4)S!SB3et_P{;d1QWXq@rXn_ZtNC@Rlzzza^$UFK0jO-B6iWyc`9 zj+R05as0ie40d)v4Z*?VNe9GLO?LlGI%aL_FGNmy=K03RV}g*5!`HfL7>3gsI&m3c zhyB+`^N2mLl~N9E$5KJ`dNBV#^(v3q(HvE7kFh~-!0qsAC?%$wTBLg zpFUlx((;@}nd?9pOB%d53g$GhG|(Nm%$u@=dV{f&QB!o5o^}C=s`v9_x^D@KV$$G# zhezl)Q)C!X4LgPlSg(c25_B$?3m$MfX8p>T@#Wg>I^eS3;Ae0ys9E%4?SYh`wLnPP zZhSuC5eOf>f$g3GdH8mgu?D%>w@mRGIiZ!< z3~yZTep5qg195=mht>8Mpe7oo!BINp9aUkVVkEr`?RP?@kEw1Ov(Q4y0xPt*R~F&du`HdcWV`C;g`Us6O#(ex0Qh>=N_oFJ#S$ ztH)g@)tB6rEUMgDcWI6hKzTIE-iG4LM-KQP0W3oBhY!Rp9iWNE0q249=|!~*IUO0W z6AfbOIT9z#aU&!^7}_u{5EQ16+Dj^h^JR(j)%v^etO<&NA-h9<(ST-8eB|5&tcd6x zo6=8S9T4`}ZrR6Up99&#sKv9~D|5F-7k_9yg1wpNGLO}E8W9bgo;8*ou+Yq@*cBs| zka+Ua0XHybU)A@8eZ5Zr!!{b2r?T}SSDbn}>=_8e3JK#X) zt#`0(CN_2o5}uQpwKP3TaRB;6Imq9lFz1IZ1cDpbeLFc9Wrp{(p;{ND^l~ApPd6q` z*(M>C+B|DSOJ9&Skc4L=iC;7PU zmk(Li15+-dd`?W$fy`sr8SBip18$w+ zJDTH0tTblb72o>K_6lYPvHyLE_C0m}UmR#h+SzrY$r<39KlEAcGmKLGiuKXSYk8LI zVn0VxJ=`w&w2xwKzQaqD%9uW)cJMHcp-KZR2`p$LguG~*R#Ailv6L|GHsd$H4y*C; znjH)}$9aG~po*)m8pD?*{)r!!K43E>bLlsgznk^H1FCj^9O~!P|}k`O7-8m8kde4 z)T{BFTIqot#C_|y+I1f&JU5{zJ1hbr4eHOXvj^(h4Cgg&&X@wtF~g`(B`9E(?*X%; zEBY3k+_tWZ(jQ~>IYULnVY?m z9QGB|iFK?hX>You)f%ZL{I`kM;GDlZN1?f?+7rOD%>gA9c#!2!p$`^L+|t+3;~c0@ z!lu*lJ%~K9#va_t9OJ|EQtyu>Dqk?U0|1iFeB=@UI|!ba=8K_G9-^=O2{Ju*BUgtkZ z>>XSbVb-<%4u&JEqG)*6bR6>2-mDb z^o@9z8ogucw7XIpN&D4-{jGr6m%t6uNEm+y(lq8B2+@uaEs7?6bl_<`u3lC2VjGks zFtto*InExE1H2UL%ibG44@nfR*qgJ0DLl^v zU@(3PJDz5U>4{+};F1jLR(Kk2_&kPQ7E!N1Z^$(6wEr9Y?DL@A9T=?_!1z-?6Y8dq zJtOOeqsiMk9Yd=g@ zGoG;cLY=`+Eio;0f~DA4pf+-B%Pg zJk(!H)dbS)2+L$~YQ4Np3S8JsgF#8~mV&?OdafWeTHWO|@LF-7F1<2>|I%TA{Q_$azsxkMElg$`n$z6x+*P`jMqa7zDNUdO@s| zm_)6yB8q|#L~=!H`0Min0dE|Ys#iaRL)Jl(M4k-+o`o4z9u{lq*6gb$;qhIonQ+JG z3P;|eK+Z+L=A1#!jT@HDJ5$zPL!5MCR)dYd>sbW|tn>}o;|T5~v`aQ{OeY`HpAfL% z$mqCTx$jIhKX=bk|NAGw=U7cv_&C?ERGuU3&;v(iLF1AVg|G5}nG9WsNh!aOV@V?~7PYFO+klG~nq~*A768$MP@HIE%cFQu zd;rVL+J>}5kwH|?^iYGwu*da?Jm|VK3Z8fkr}tAz!u`oP4EI}^OgHtJ;mN|Pv)`4H zp^*n*(vYIB>sUHV^(dVw`YxGd+he+Dumb`ri;v5ap#8~}8tiuHtww7MK(py#_H@yc zD3v$x$IqqdRq0utG(Yd$v32f!nib!p{}!KtCDmSxN2{O)A<{1rHogE4#aQe5C5do% zAAL92q||Iihccy{p*fz0G#jdYiwgjK3Sa0Imj`B zZ%Y9$D@+WRoum`z4B}5>i-=`s{ZSqd<$oQMrD6joF7y|z$5|0#yf9kY7laL7roELB5o388hEyizCBD}WlY;3MThg|h z9ukGz8z7H`iTeT=Q#i(8k{+b4yHhwRyr+h{}T9e0sM2CP(;A--atCs*h zCujUIl3k!Sea_p9UkNU;4|B+h(>?gYZ@c^Tmv;>VxC>>yGoCu+La*6Iwn4ixvBHc^ zH}ckgEr;^lqa|T>4cnkqoch1dxQ-93#^}PTPiOph>BO~_S5@cZtx;Z9^C6no*0bNN zd&1|7zh2z2Q5>^b+1RdCG8! zEj3aR47UT`=_c}h*QX)HHw=;4MEpiqMOQgWvI_h33H85v5ab?(&Rw#UwI*F+bDM9! zI;RtOQFiV^iq>Kn7*iFP&~2`8lk!rIOV=If7awQj6r6lzoJlOhe@?;{ihPUzx>v_abYrjx$nk2y$}?)ct^lD z$3IZ#7I{ay}?xm$tf0=bT1V1nsEt6KKDMg$J>(OkqTjdN%HKgD+a0|g%O`SUH|_)rXz@4y zh98o!fB2h?0KoU8_Fk-xMn#ktHX|CjtoDEEi8O*u|NrNi^Qsp7Fo>zXm_{UJdhk~Ql zyST|gJ2ILk`I7R&X#x$*zJROZDl2MNP05-IHD;Ucul5$7fF03*&u(ndB; zCu@@c?;P&(Y~wVCSydfbz$;ck%mrU`)L+O1t{-&Lwa8Yh1^EUwO=+N1I$^7&5pfpbF_Vh7wvWssa> zp?ugUjb1CW^v;z7Q&A80YSZNy$ePF-6=fDz5jN}WKpF;Yh_S|Pc zc}E`Vek9=J-%cQlQLz5;<{t}9zkgEhp6@=-AW56qWztn>f{hx?Jc`b4lmq9M-)SS$ zT7k4CsJTsYF_II3T);Wk&vQFIUQB2er*clKIHa2gOPzl0X6364k`UwCu6?}bpB!6c z7Gr+?3K}qRyRQcUf+UUXsf>qfaF z%U~(-^@`?X&np%oPQHgj300N5{Nleg_&@}KjYdJvNGgZ;r--t@>Y}gtmL}?3>p&ol z_BZeeQ>?UgrVMN(jYM=N;LjT^4M_CKA3gN_Tzy(}=lDL|qOr~=g}m@DfRO>or*(D> z>uS-&Gq{=bURWZX1CRPP4ApBsK*+5K9sA(hoe)sqVTt{;s+;(JLpii`$%~1=_fDsr z*dmuJuQpWAa1g-17!Xg-TWafJCE5P75tNThAxDR?dBYI{^fN~(v@qh{3@ZWQ6R=HW zQGxbMJU3ZAv6`R2uVgLm!Rwn-m*pH6-s1Qq(7%f>Y)HP~a+QSzK3%?76vZ`-oj23j zs`j{R5}U+|NR>|o17A9FwzHU#$EdIS_rewcK*xe5(;F#4P@zBbV*F5QQ8@_BO(@O3BmaAoDQH^3Z19`{xHqPqA2}#M(*9m;3v8<`AWY9rA8p)Hw>GlQx z>{9HC8mi)od%DEgCPu+Hr9=Zj2~)AAtc;q*bJbx5WAClFtNxIrmV7Z}ec4W`B9=09 zLwr8SEdM+6Z#C;SlJZd$zo=vcLGUdZQ65VOyYIBj&|D>arbTW%YIe=#E05LE`ZCSL z?T;a=$Ima2pW&LWjqvei%dZZ2o<#S`#k}0kRRY04u}1#U3?)|&xpbA-HA4J%oRcPj z!OwEENfRDfPu&k6_>jm5oKH07SUZ5R^@A-mQg8mg8#!&833th#WZO0l8e~|%-8ZYTDyc<9IT4K`x@X zex#Z>KFx$Anq|JsK7s#o6{L);#2jj^6xr-FLPKN;o$+t~3BK7W(%fi&J!U|doX?0Y zVZF#2Uv0)veoeb@?YQgmykOuEL}|KO20otkOZ{JZ&MW!J^ELj91l1!X#mw-U6MTh$ zu#}5tko}`a@0{QnaC6aCQm&>d1FR&_k@dC@1!HI}Q!`8Ou;w zEP~`nFlQll{59M4!>rpU(Td7wa-Sh#DP>RXPa&>5Z9FsCm$g?_ZZ+?^rv!yqY~3- zS+jN*)!UE27LXD&aj(jEM3w%NT}HWD&9fGJJDhiDEP%rVrw)!#R(5Y*1Vo5UMeIg+ zMWQh%i(?+Q5D=2E2L(}HsIKE5D@MO8cXcB&l3vi@=vC31Ha%VCsL5BptLR6Uf03gqM-lf%MV zTMA3N(NfmbZk!$zl&``df_ts9f&5|qzUNjN3Jq9V zE}J+N;=Z+k3c$2M(Lz(4dPP`CrDGSP{-(kNp2R$AAO;5#bz*tal2^6Vy)}UPQomzF3hROcS}D1{pNq` z$&JCA@Lz1ub>yyW>Fb#^2mQ;|9+^yL@!;a18H49b2LhK@&XRiM_?Hfz&O<5S2YrVH zzoRPI+AMLg=-7X=`!hMe*mk;xDzVXPNP69a%r@GGz+mF8(6%EfO!!N%8__h`YoY;s zp~p+*u*&Kkn8vgE)KsXlT)t1HzW;$!5^Ov3C0Nc(O5fLMXpAeG9q$ou69bo^z_ws3s172chG(Ou1k9weVWqUTThWMXNq+F z(bokojPo`N{U1{<5D*WV%!YnMLdM#u*>?~=mjmHQ6)r7m%PS1-(k8tk^KdgqHU+PL z@u_Cgoc-swn!7T=wTC+e9Ek#=U0r}h1~w-pKnq69BI>>4NU!&S0$1nm^=+#Fl2E^M zCOo|S_dAtrpmobF-q{>F06Zx{l^*Y8uy=i}+t`r5*s&2tx|9d`JF_8`KhkMHVyanD z2}eib+#88Q@G?U2n{!*3CBugS^kO}$Cf&HYNVjIyx%q!ga>eIYjley{>;GEILIo$d zByA@}#6!9cIyg?*8d$+*mXx0%D)xsT@G@~R2KeeH_6^Ou+w(AHQyC*v84W%| zw2O<_V@tlkr(ujU@DZ)*t&NXLWn-h;o|^+%NIbIeja|!b)%-Gjd+*d<6q+INd0JEQ z6~}yY`T!N0t-?G7Pe@)1y8s(xNZ9X`eT-hI{NvzFk^sNgUG9Qzan2?cL651J8vmIL zqgFQz_<>Ev-w#N!CYihjNwp!sO5W-PjNIfisZQB+lz|@Xe=Pf-ROyP*@djElc5+j* zi#mtVbS-yuLvu4FTiMc?uO9;A8!=#OgI&qqq*w1Xt+Pt50Fft z$i6OC<*H^@^Gf)EqO>B~OQpeY(z)k{R!tG=*M-m#Mo1#WjI{_|#-LPhB#Y+aIpGG$ zPBeYTqy_}5cxpUqFahr8#`f!XIL6PS$-a$jsj&%2K!T2|5(WbmrqDXhW$!YxQdO(d znb8!1)f?jughAxXZ6P*j5vZ^X>yPp-eJ0{ur;#k4+_O zBl@yt0M@^?wHuH6vhy(ROgF7yKh%xuco3%hE}3#+D%F3uawYZWh(QCSB6#zXZ=zuH zX0hUdi@Hgkb4I$r_}5P;QryF>!!iXuE!QS|Ia3C;++HN!xq8&-8O(m-$Rf4)%EV}? zPR)38OB_n;R)!jnKiO^*m2EwQI^tTvMk2X0{MYnG3T`Z@egMWtu0-Y-#f&qvz zDSSB}t2Qhv+qQWHjlqHnEf8Ib$L?zCIVK~34NI+=FUKdBnogXLSDsrO!8)94n_o)L zai8i4@%SjJPU^9u_H{yT6`rRk(~pVz0knqjOHiY8NV2Gt5O#GITuWK5Li-9?q5B5q z@S-2CDWHK5)%M_p{2$sbv0F<(qYS&`Z{4C$S}m=`9&z?`e)iAr-d3GZ4Tb+ABr_*; z`K#9!qJ|Mx35Mg>uQ;u)!Tlptd2BdPKU<?gi{cO*L^dFB)=jK}+YW z!BTZfA63&A82S>bKhWDm&a7d;r_1HQr~*A1975Hg(ak$AM?hTYTwH8Ft9(wA$ZnrR z{%&I!W_2ZE{Khcs`m3qesC9x4CweQv>{F;sVkTab85Wt=V~ED@OeZ}xJDN|U@>Zk@ zVH^(vo7+<_>V}bGvXlabeS;SezT&c0Z;=R?l{5Vw@pn5(OFw!8Z{HR4W!@mnC}0$_ zO#SB5v`AI0TD!`FHO%4CvDuMr;jK*SdBDmuq%>DBQETaL<)$N|oRZrR06j&hqzmZc z!d|&|$oaFe%)a*X4R%$%yRfN>fLHg;w3&J_PqFG3+Bjplan;kN>6JBgg{5@$zVHhT zR*cU6g6>2B@`3B5TKw_XP8YtT(APNwzSA6vbZ)Xk-k zG^IoTkgf~WoDoVUWY;pHoN`|ZNCo%DBOWL^de9iQ#aqwwOcgx{69ayvNwAMs6vOLq z&@zXL{}1GF<5@4;X34YH<&@g5DAeez0!X%P6#rGH?TnU<>7wzUmGk5LNuigA`c!lk z+GaoYdnRn(Un>t;$|YP|scH9ywZx18uRH*3f+pUcHp7VRt^bjrO<1oY>X^hYyRon&L1DK;7_N20U`LP%N|e*aqNr!N6F1 z3Z?=yd_|zUFn1vNsS5ls23Nc-LwH-!_TzV2*IOjlW$rc)YZyW-P|aE^qGD9L)ro@R!3}B9Qqn6 z?-o_&giPUus7RDs7^q8kwCOSW+{vjb11^H8Vm1t7tKN33#OhO~U1{fLom^_XxS9JR zNi+#pbbB(YVZ~!fBMUr7O?%aCU*&(1>|q_?Du=2&eWCxVqk=X+#+(wk5UU>2X@N+` zC{I|{ADCQBkT`lqtHOA5Nxfk6MQNK1;Y2+As6AtK4FKs}`LMK`&q>8Z9#{FB-4B1$lv1uMHb|u%LF>6cw4?|Y5aJCYY7)${f8>IVQ*;+U`huWy~`$z@G2J*YB_-xgTU)~GEwnnpmBJrAS&0Ntn_VbcG ztSeGMv{X@DOZ1rCkzZ4&p1$x5X1_Y1!Vu>JY<89(NtzQsRwqr*7rtN*h0(4Ya7Vy@ zSf8;%xii?;#fl?8cn^umO-B@fEn6&>k*cD6(?vlzHJa`h2rxo`$C%+bG$#8qCyS&^ zrM?ec>aI~eYp8slnBp6YGI}8{C!a~Z_pY+o^*x{vn`vDG#xMOBJ52XX7_)5yQS1Id zEGKOU=zu5@c|KA7!hmNy#t)Hmm;F(xOqoq@*d{#i;^T@}S*_DiTx@eYj?iWo(FG}U zZdVE5dHliToy0Xg-i^kA_nhG({;i!el_D!CV`igSbF*H4p!^lzq|9k|>6khv)QO{O zzF1gO;Yf6N*9zeJe&?w0mc(ibnw9vS_qr|s)_vo_Z-op`cxBJf_4-<#n0|Uhqu{R1 zkYM5EZnZ8MxuJRi z>YB-*ooKHOOGO8h`84H*Vj&gE0DfkeWE#e@0qz92vF!l3FnRgFU65U^ybMrW{Qm!f z1ZIhmUI!G!k3Sbv2-q>-Mg;B58=~|-;R|yUi6MZ@|2ns-)pl!q0hfX<)b`itXMjov ztaBZb+wE{y`hEcR%afUEaD zq~fED)wiH|z$zxSX}h3DxKnD8+lXvVQ2e*!HxZJ?Y$0hbxA`;^n_Ftooo#2$NdA~V z@?Omgfq%!;hzBQ?QTLbiRK)7;waI*~xtEWU({STfc_4>q3CAYba{XIOk?=>oU~zq$ zMjXivl;+w*nMn0($#h%gMu1r;DV~j$dfD_B(WQ(SOp16eNVD5Otr%`jxmK&1;bR)Y zP}k2E=&d6!6%kpiTKuC<%odlw<=NbYz3+8kmw$u{}=JAOt)X} zZ*4>@-I6{KZ)I6Q3oKzuDoC#k0XtxfgTFl?YZ-`gBHFc!abl%w@~Fsem@&G?GK-2H zcUPp}$wl?NSc;~_kZFca|H9(+M*_hk9>qqDLsJNXhG7u9iM`XT@>5*y)eqo+rnfew zR~{cZ$9+V{_qEfz;$kAbg4)r{9FpHGEyb57U2QYvnC)sGfw9J&?&a%8MH(Ur%>ud7 zMCUlA0h39tq~Fd+le3SwR~xFR!EZfFI5O(+ugliXH7V0Di1zp0Sr~#;JIT=+iCRz* zX-4#j_s_0Yqrl|yXQJ40Gvi*tIowPt<3?L+b*@yo`S2`eQjKDD-=w+St|BM0MZu{Z z^9wO&31*FAm}D3Yl~uUlJswpZfK}6V7f-4<)@m(Ua95Fe>9Tzw)1v;rMnd5x`eyV7 zsC;XMa`Cd$$rSHpyTjd>THDE*AJ;NJt!a*IFWw2SFW#X-IS3B17QKY(0?94*OsbRE zluUXOD=X&BaVGdEjNMCKRcP`TIrrl{J{8({kRu2WC`y(&TKC>snoPJsRde)_;9hfP z-zMESNx>#SmtP2`4OuW;te`-aExXr#@EOAbkg{A$On9DEIK2nJ_=^9w+ZhJk6My}t z<84?N(#$0P*S(ZLDh(eoAG7|+Q}kd_x`TJ(@PF@nDfD>x$0da9WWh9VB8p@OGph5o z(Lvgv-9wd}1Bdsz05uzSN(_l*|BcV=*A?&sGRZXSYlohPDTi)(u|yRIb09nH8WYqH zA&~A+bIt!sGmgXwjE2C>*ZV!-n)j6sr@sM?qioov>X6ZlHi-3doO71OnE)^Aj$j~G%VyWWD=g%1V7^z1BoR)>7gf!qV1 zpl4ZNX99|;8z?U-VHlzTS_yfIY!rEt0J5FlQWHGi3!dz7pOASxdDi%8*H|inpZn#C!PyW#GRZf{UP zO>VO?H@nhG=nGeeUHCWW z$>>T1`$TXoa@vbVY{-Gaq-UU-Z$e_sPFa!ZLc3|S*M?028$OIexm>cCN)maY(2(vk z4{+p4VR5FvGm9iDFG;__%*q`nA@Zty`4L5pA#R)MPS}uLUUA5Jv*F%o$d%W!w;HH+i8lGtafC=t(wCY7Qv~|Bf_S&`-!FMqC3y~`^ zSXCrbEbAi!Fd>P!EXew^Xw?f9E$4bYhBAMO>_r9R?W`1S<~5I@nD$NCf5$5fCR#~v zt#t1-(pj1ZO7$Z52*`?@A<@geTfd_2vUn&RTtcZg`;4T#c-OKV{Wg%88#wWIF!&`_ zJ*%{)H<0@tf(R&WT1i_lS$>(a8sL`)>hnC!261vQIv&aD@1G;o@AQFG>H`OXIO1nw z_?P|vXp;Wzw=ayls-FQbDff8|L2nidPvCNk-A{aQ=MaH4)YJa5zWoz%NBMBnnViOq zlVVxX2o{^8nK$JmlC+11(x|JJ@26y&-=4>fa!3JUqC@I}1k4W`a(EI%{E$*D`-8bLY4%S)^eFet^7}(Q zKzE!L`ukJE=(_yBW_6HomP1!p*1gBUzCYMEU)N`vA;lzE>-K|KN|0t96)FJ}&+FS7 z(7Qi?uemV&WVbUA&G?w{JFl0s?kQ*4qQ)7XWoEfYCW9bT_KP!YvJJRdFsnLPc-~$g z!Th)%w@xu>#pr>7i@1I1035}?&!rhWDuHa@s?jMrK~)6T$W9rb8*N_>bg-P z3|;FtH6iUO9Oo%RO^HalxYPR7%WPI+HTrrv%(qm_4sLjOE*v}8KW0e?)H~(Fiy>C( zP_S8s6vr|>l(y&>91)71gR4J3a{UboLy^*(fc^OO0CL0Pm^P-qiOD6Asqd81snxX> zZF953ZkP3^cT1mvP$XwC3|ejiM0?WfD)yD_@>&8T3VmS<(b?6{Qj~qrb54r+wsBdQ zsp(H|vH7gOg04ec>;ThTJzLN+F<&9fE1vs@kQ8~pt%kMFq$|qAU=H3i! z4|X(@D^wroi3RhcXx6Bunyvmc4V$(DyFnO+3Rcl90lh0i)RBS}HD5hY2oi2Or#;pn zJ-W_fWr>X^>e#i^Zm6b{&5JY8Lk)XH(}wJ*z+Qh4=7|ySdBLm5&~`*d*Xw9LiLMi!9wl8rwF!z_+oc$Co9##aCz>bCDG*+QCU!VR}Bma~O!sF(1rlg-J zq%)M~gQo045Eia-?eGA2E?YU0LG{!6D@D+N$WD++q6zE=yL(r!&31sCxW{+0E37@_ z*Jay9Zubcm&?>(_p9wZgMnDCq^@v6ZnfngY)A?n_eHMGEx-;t4!@|rnAIz4De4#=_ zJjDFswC|m^vS$B`GJ2n@Rtk?-ds8Q*Ct@$bx~3%$s0mJbAD>=~k>7yGf-U*i`$IQE zB<9!ur!149F9rca`vY8=jDs?4vI=5?m9*(?B)USl&1$Z4#sUA51XL*Oay}$ z!qOG9hJg)C@W~d&VPyezk#FM_8?o3vQX1S^p#Ce8{`fksqW^pd`nG?RL|JO#z}$&V zJR$P=5h9KZa zubSI_i2I|1!v5ylo6@Ds-!=^afb!}%(-b}nsGlXxlyHxLiNowC$FIs@(s_I#o^{I3 z^>LkvpFHQcB*4Y$3kHKY?%kd?%J&P1h-lbC!Q5Eb>`i`giy`nej;RpXLIZmsSEUfo z51sKK=3fXGR&<)mAQs%S+8&fi+}D91k$@2XP9bS18bKB8Vyl-+12~ZaqmP^qB*34t zz+RzuBiL7kk(^`>g2n}r$o)!M+F0vnUT(g1BA`yVM~$JB$W-h?Z*iOQ`jQkdUCcS~ zskoBXoAmNN{{*F1_VU7GGTP}TVInGR7_ZqXBO$|u{36gwj)MlS;wG_F-bG*MV4G{yG<)KpFQ2LC>< z3WqDlsNfY(7hb}4Fha#F_8wkS`n1RStPusM1Kbdh z+fiPH&i(!gho1deeg#6h^}?E?P~aHUg)#buqU71HP(%GkC~!A2jc)BDw3{u3=sd@a zEs!w!;#VlQo7)S0ejQ47vop+8$`>|+trhbdu&G@fx1QGm3XxGB&{t&J)j)M^xScx$ z#2E0(-a$nF|1L7JC1;A;_-XyUEVNY53Y5e|x`j4`JoWqAQ!u+Rwa!JE*v0;k|1ztJ zFzm@_5jl%xh$VT%V_4MUtU@eYWOamx%;HBYl;uF-VNUM&-`eC4H#;O$1(=zG-{zjP zOJMJ8<-_VBAdjBr-RcBsNdFl8)iqy&R-1BqafL^l+Ba&AF;&#g6rleWJeDF1tc=Yk zZYgFs*`LYKPL|pGRC7g0cL57H^LO!5_p*e`d;Kcbep0`jX0P23;YfA99j-Cu7dL^< zh|`{>3Nb7kP5iDTFA4Az1$Ir8#bGZ6WiCF5X5sNy#LFuCre}}l^J0*^GPg>U&aFTr z{+)It2=`8LxLN|BK4x5fEJ*ups1DS zqW2wlj^gvC6)m=R0rBdu=KxY67hf=PZ1u}+l(}2SjvHc&|T^u$$KC6{x@y zRWcYDrsMsYa@zXMmab6}C4W<<=aZ+#0hW$hy8l-_#^Hxtp33;I#$IY>z1Nc4uI_ik zC=tbGwkf{7bjP=gJ^Cj?+Lo`$Nb}A?hDLs%ZqDHi27w#Fs4AT2#GzF&QG)AjDb-Bb z%eH}|Vcl#X;L%#ylt}FeAeZ1PghTNarFiv`JR#hH$ppQTS*?G4egYNZUR4p!b#b@m zvy5KSfb>Q|8)@F}?RN5*GHRer-e$qf6L{ZJ7vMV|hMt=qhe=P>P^f3{`E$QD=(3re z#M!D#y6thdwz|mL$68s+9)Y8YyQud-y2Po)6Zd6tT~Q&yE~dWv1^6^Vb7{{#KE4(W&%t^+QN>?Oq-)>?L^poX=5 zC7O3o#5fpMMY~GW{?5L$WqPz`b>qVMMcm<+JwtZMtAip&sRP@{C$mr1>I#L?XqMdl zMPVoB>?bX-FbO3B8yTvyFDS0uOKk%iL!E=&@J^Hc8#bs;X(L+Yn4k2948te;4(ERWh|6)PRgc9Ed4!@%y=G1CaF;x- z9^z`L$-0SOgPazx|Npm4--9AUU$9O_8U+w(#ne~~ivl!YBoySBht7)WOfTbm;{z{^_y%}qR6t^*g2Ys|?A@U< z8_+XGnC+u(Q8h2o7I@q07UQK8I$@9%9ku6>wp%f~|F7F%4}KraMw19&%V$0ajm05E^a9XcH6!RGkH8X>LD+AtB0tgw%EQ z7z4g_rjij^1eWetd`M_%x>A*1jPR$HCfh&TceO4*9j}l*-T^9ypX%qaXxylG1Z1!{ zmnxgHBdXfZ;FW&b--!Y3(}=E|;gPiJ-meRDMt;?ci$&$9_DmE4(K|t94A|f~6BI-7K+W_@#lD6BGh3Wij6vb48=^|4wgBRnLhItz9gPjPG{eT`b7 zp-?l;32|I;F(r=Y=^2dTq}Y-%4l>j=+dAscB1zLf*#at6&kzK-Ms2nMHJ-Qjl`J4& zNd+%L1%G0*JaQ-v!AHfM@d02{c^T0PQi`;&t`$oV7PdP}3re*ay`u-AJAZ z2H@MKZ|i3jmZiQX8tnl$Gx$OIEgf!gWL&urbn$*bqwKYf3pJ?qLD-WXkEhUdE2_S} zYA9wmUy{QfBUD5Jcr78HKdH5EJszZ0g!LN9Vi{%t1A5|A8zeb#KPRjIc6YW6ZOC*3 zA@hu+!k4 zo6=velk=~wxekv*1A1LP?Q*;|Q?x*LJSEapM4!QwxD2-^f__y-@hWf7U8<^1Y%5u0 zyp=@xZA=~7AwWE2&^SUIV;8WddWvpQhi?~kxx`D;G3qx`%iz`+VRS5kX|m5x{9c0! zG0?FAXU|g&@y6}CU@$OH^p!f|n-6wV8>d##zzb&B^zO-T@T}dnEpAiX6-9UTs~auH zDbj~=d>e14&#>%91?+|29o--8klzFN(FFy_gFU}UHgJ35x)TTD-}5!E;G=LB(h^ZK(F?f0fm1r!NrOrQiDvC z?T|In((e#UOt6s@SW<0_v5x(KmDxx5h_`THkELUcHklwOqTv?2=TffT)UV35$Ks__ zaH6l^9R&)t6P2?c4a8+~b(oNeZOnphf%rx(RaP)Tx(`Ufg_;@UE{O$co)+Cgu0BrM zw6!l+g_x0kNNp^B;{=aWSkP~F_{F`J0wRUkbp47la6*f6M76ZZyy)H;uwV(CGO!5g z1*~wQfYr_DKZqOD;^65oG1EojH2OR^H z%o2?Q&>v;+u>5bqc0c7*)Kjf|5{0bHZxqjxkAY?0n^6GkE;)+SfPEe^8a6BtM(5T`eirpa!dz zMLquF@y=HX^+e+G72tw4vbK>QCK=o@EbU0af}!$ypjY6uotW4;*+Ljg79;-$(L?2{ zA6o5Um&C1atlNi3nzh5HC{#V(GM{z13lGEYko2gcUfU9v4DT~{%0Vh-NT zRE7ekyR8ecTLV`eK8Eas2nE?7793&+6k+_f7vROL2Q3xA$oro`T_QfBQAp}4@&ohB z8)y*m`3JOao_}BHbC&CZ+-F`YE5BFzJb+UC_Uyo6Xl_OC)yhSFD3`>oDg@`6q5bgD zEw_0G!orfb>|mC6b^viHWIVt>NMbs9dajQ7xf}nZF2(t3yv@E*OFo z<)hYFIuVBvNQXq(_*{I)Y$a#RNyDT6Z_HT`6zAS_Jh^TOrL0fYTSqAF8#y*Lt9VMi z0%cY%`^Q55!KeKp`9dIj^N^XuJn z4KqATKNmAvk%E!WZuFV0QXib5_@WH$1mesaVhFa)Y;=0} zOxVXVT;(1L*Oo5d)v|71A7k(}rD(6#g3N z^f3?5uD}KQ>m?CwW732TUX8Ej8=ut1Jo1Wq*F9>$OvnZ12Y+|n=kyWN*?o1$W1Wes zns8%XHB!HjWD`K~BdXbb240Iab_+zmV4xd{mX2cZ5Jn z7@Uwz#k2`3+P^`jsl4=nN)Mxr^#e>4c_=r`Ft64Yr-?(1EX+kBgSlCgAGH&;OI5u8{ z7q?1aUj_O+-q~Qwg~^Wy7<5$-JQ4rnl6TpkAnN2STJz6%Ee(SFF5`2nT%9)3+wSA zwSSSda6)&8811WQ%1QQ{tAXOY5r|c0$le&dkKbW=%Y3az@_Tn??^ZV9q8R_aKXpxB z-mCLcy!qfpL_(`WVj?=te2 zzZqonwM3RyM)hubfu%VQh8s*3YBP{%0nb3DT)8@uzW&cDJC2>={Qbl+(*=}sNlpJC zzwc%x;YDW3gR#x@>D#WA$u*Pxh$wyCM*1r^BUy{yH#mzOQ8f~YG#DEJs zL{;svRI%`ug&lawebyVfdA_DpXwpuMns0ApoUb>FMeE-gU=+42rTt>@^)}4@k)&}W z#i&PLsL2Y_#hVbbPlRU#kd%Ja${6g1Ons^5tnci7?^lyb_2ZMMYd#~FGy3TyA{chV zTLX(@XE#g*NRa&d{EMIhffErjNs=y@+~f@>D5(oA(J4c&(IlI=b<0+A&?%v7Y9gkE z32=5bW>j249`Fz<7X@xEG%JWmyK8(o$;m>*9O>zqwqvx2G9B>IJjmcF`t9|0puBP8 z=8rfE@MQ?g?7j_J;;FAPoa8)LpsZ&)Dd^phOu1MN&NwYtD0|XiWQE%|GDg?5-RK)* z`@ntU!!D+3xm&hZCsOtO-Fn zq;ayJl|@`%6KevJ_D_Orx<0ZB49E9dT$OtwGbFFogiZ&T0@Ej$kzHbRIf{Pm4iX1j zacf4tVnC0~z(Xki!~gPmsVGgPDi~tJ$G1xw(zXC8OdW1t=wPU@0k(g%#RR$WkQdaH zA}HnuwgGjgoOA6~#Himb^zY5w@2~}w{P@7zB{9liE)6+1oLYRFd=QOmh8K3REJ}sQ z(}45Wo&(_XLzrb3CwFHQG_*&bMC26?)P+tcb(|6el&dpuZH#BLs`Ppm+xBS_la9rj z%Xi4)#d^&7<%e=cOaskg7wP|oQvf#pDwCK)vJ-RghJEkXZGf4); zR%*ZGq7}!A#HZILE7_=fREDb2e@9#=mdO ztckdCjq%cK9Y~(VD;y5VM-jme>`(8@c!329O4FhG(mh3@Zp5ldYcAgiR;XU%i8U;T z&c7TV93raTrB#skWDT&jJFXy#r6ao_-u5?N65>BFA!~kD8?Jq-B4N5z4#HC?4kJv< z0?a=RD9H6<^_Vn4)XHf^ zOM5onp?E~<@&*2EuNcr>-u?gnI=NP2E)WLQaNCKueSpY9tIquy3R44cxh||5FU**% zwl_VT`s~VRZ=Y&wv5|c{eDqU4n}EkOS6y8hoxW%+Lra$~1eAH%^dP*8(ytE#X>Xv4XLC;R;;ml`$!>5hi*u#VQT zOizaSNuQc8Zg3>*Mr6?6E17>5CCC#&c?fR|!7+zP^MRjjP;*={xk_B3sdzvQTpc$~ znY@j|mYr$NxyBu;tY(n+1kOTicA=IW-#6aPmJxT@#M6bYpvp;{);ozb+O{9A5S7l3 zEczuCqX$)z___ye3t!o?=55t(*hymZsw?lc|GBp{1ACrm34q8cV7YL$`vJUuv#C=V z_my2m)e_QeN@wf)QMS41*5Ts%OiA(CFjsSavnCu0?o~lOha8b3TU&UqkHiKbQ3@6P zEk7$|7lf`Ztl#VdlC>u_2;oqwKJWjGLUy9%oc_N}I>Td6Lb4&ke+`|AsJk8 z&OkXGeFZVYK?w*F#u=rAW^8inR>6PYdxwT)uvJWs~NF*}*i01u0!)3XYlLXkprYL-G43CE@&K?zN`q zf4IOGDpVPC9WT2q`hAmX$t^)0VK?Tx!sXuXHT98Pj{H-Vg2r+`osc#{*@1AkdGhQ( zm#cBc^qphx<32JQQ^xJ5WM6sstFY};Ep;!)!ccQ(QIBY7lLDy846#pxBFtvqpf2U#q zD$osq*MD4v$&WTf@u;_glWN4!pbM^=z0+HPy7kPv{E^kBKL`4eA?wrD&74;B>1 zyQsm+AS6lo`AJ3OU7qJfAh_E6RBN?mnDGr0ScrvEb*UB%*DPjzL&(CQnlsMo;U{ng z)$p=*pXAfup&bY7)_jLmR#ytAzvEeOl<(!MDYeL|_F_P0QR6)|{3(J9Nb*AH|Fe1cVa8H$D&cASZ4z%s0Jk+b9 zFOm%_>y^l#ybDC|l!7E#l}cYgp3u}xiitEH&&8W)J6u-@i$v)^XOnv@)cjMG{`0D^ zr=-wi48_4f$(Y)eYG?3OlS2>hlP9f82acF>evwWq8a9MIa>Ux9aKP^*4?98{D#Cl1 zpXFHSQA0+uy87{b?!;@D1&6=}33uskE&g=v=V zU(yO1Bmb|=0&jKRBIAc>k5!u*J2e8oja*7czSFPe_>(S_p+)CRdsYw`b zMtx)W;tXiw!0;+YmbY`$YZRnQ;qD?__A4n}Q_hGV3m$9rNT3^}BcXgKj_K|o{4CJL z*X0LKBx`;V2Ia}&2)qfcix`)qb(f_riLhnWm|Emc1#+~bABpmFqOaeYV#=%Y_-tA6 zoBkchgHoi$=m&K;&ik%sC((1ykegsrgPoMIUY!AzffZR2BoJx?fY8Dssz>8@RSSV$7~DehRr$u*b)M;LlpH2Yz;vjxW1&DAilp6qYU*ke z*)onEAr!c|c{hmW#P0OOm!#OZxOahbsSNX;cwy>hw_)I06!e}~c~A6uY9v3$=i1a& zUTlp3)RqQnhGR^iLEF_^4(}iAl^-AH%2Ds~g_CRGwPQj)Y8h8!q~m_ugv^}GC#06>_Oz0%a)>+y!Rx~cVpvT!$Nfdjzm2;6_Mi#}0^sJ1@*G2V(C zfHrY5Dw`Z5k__S6*&AGM7Pun(6wG`ReuN3RT)$W(>V4?r4k)U75k$DPWtUjDY|FlW z1r1Pz@8st9+HT4YrKSwN!B4He0n+8f650bcb5bMcQwB`-oQAR#g~9Mwd;4%YJ5H|C zdPr;IF=s33uc`6E&FxtDeP_cj^`*(x*_WR#0T!w)Rh|8j!7vmB4hC?)DVvbDd&SyM zaPJ#ju*&~atbs_hf5}^&o*k6BU$nhSH=h3-a=iHMqW>d65p{rF zYCh)+teKObSUU|ZEn)06bhU``3K-uo(@1$B9o+)=a11Shw3h@z>Wde$I^m@X7kXsF zY3So$sm;`*M>h>1@`wj^w8PB{ij#6IDfjOWWi@atDGXD%^z3P}{=~7=yR}d;D};qw zrs;EX2EW;smouYL!gTj{#}pRDn+;CeaDM7UsxC~y5Yqtp!OWK<9D0I1&s+AB{9rs@ zCVSdy|1u99SdX@koP&g7u=2+SWS;%9^GUxboiur40&af9d%tthVRc8Y6iqlat;h<2 z60J+Z46kMN!yS!B&;B5sD+aPq9)1rC|6o5XZT#MMh`yZ5Zcq~B*H{;8YA@HhF#<^a zZ|H{Y#d1<&Ptpk|q%V%Q@fQnDR#fjqrDYe{2DjA7t96L23rYQTEDtb|#xsihCUZpq@tQ}J9^B7>9f>N|ZWR(F z?;-r?eJ)5-lCx%naD%=woRHt?6t(c>+cA{ydx=rax&yHB5hiD_znWXZq|tljB4&5l zUflegyqk`3q6OK=!_IDJP(>9yvb+?$ROA)qb;nEi6-+qnV$2h+mbp+jEqY${P-`X_ z`|sc-ZQ7riDEH_H8;^ne$(7%flHH_LWxTf!%fB|%ianJ>L%s@>!bpDQLb$$|&hqFr zj-9m|!u5ieYd}t2ejbA7U+&z^6eyZSXUmgAGfixnV#6Zrnbk#4N3j> zHeUey{luPzWbojf`|@TZkg)k&lIsM*tHlV+<;S~S>Zj}SG~ETezjRF~IjPduIdi_T zu?o=~ZB#+OC@Am^4$w8-4(jAN2^@0r+{llGvw_XUVjFT2=yYrE#LVhvx=ch(kB$3F z-GmHeu9nT80#0O@O=1_hg{azWr3;(Rf+wfkxJm(*PKa>!4<~QG06Q36f69R|#uI3c z|JC9@gp{tdtK-SRnxBVHLz|tje7V_lJc$k5z%TnZ4O_Dl(7!Edl7F*ZX$qBoif1ro z)Ax*0bK40~lQs?4+7p(yvdt2Ce(u3Ush}#}53M1~>?n@>mzppPpQ^CT-G;2QKMBjP zCeNXtn$;`14<`N|mp>3r|Ak#*MdK=ZXX-hzfzOliN35r#GE{olA+DQ>S2(dzVG@g% z{&L5;*6qGx2DTOQeqQ+}U!M853KE=JLfca5>h3Poxywej@?(<%V{3qcZraD5B!_eX z@(GMW9|JrBlV|jFK~Mea-W2HLC^$c)82xWd7qGUfenOAG&M&A%q@8{c4=<5~So(gU zf|@sv@T3iKELRN=Q5AF zEIGVADC+{9bBG8w-}N`EI8jg94u5b|NdA;peTKDjCI3M6oh0;+{7{ZXE;~vf15gEO zt~j5V5H9i?r^s8?3JP!8ZTGYm5wGR+gsLhJp0(k;#^E;KqncLP)F5rCEg@KkZ1U@gm(82@TiQ=0h-7W};u_as+7 z;eAL)@Blp6WcsY+5*)$1?(!X2j8SdKJXD9KeWpK^(clXKXC!ia-0l?R@;5*a#95@Y&vUAsq-4+W{b@4c8+?_4)u<)OKmkcot=6 z{fPr|Ebo`?8R^}l=SG~m&y1OZ1_BW|82+c_AS6#Yi|D8BuHfHREKkY}_;ZaXuHc-z zaYp1OJ6rIh9r2t|dYwfdiPolIN;EY)_#8wtT6%VfJwfAL)MPyfrink%b%55zCNsjy z5l4tXFDo(w*DjnavU`$>a zSYRyyQ2)+V)Tsi+9DSAQVR;+cW@lFBm%?Teg-dhV(-ncdjUX~=qQYkW&~eNXKW8P- z*Gy-6-B?1=W#k!0n?Q(xYt#YU3qoxMJRMlsh^$;BAq+fo04UWyvn%edz(Ep7hlve8 zs*ka~gs!kkl=@Eo=sk zN>&VPA2k^AQOU@j2|U`Kt|B1QIp(=X=9~QZpJP6pr?t1^4$mWSN+kWhV_{ghZeeLS@nBkIc_DW0t zekc-`Tn^XDg7@W229x=72N{6q-ZK&C06IHKs>17*!0AyP>W@m7sk7Q~Wuzf$2zFb% ztWA2KH*%{Yr(wvzL0V!De2_(SaWYvP)D`?tC8&1M0X4i@!`J{3>W{;r$#(KZ&$i-j zyUkdFEXaT6SAbNyBz(I#$zZurGwE?fY^);J6-9E}jxpsltR(4)XozXD&Rv{KteBwC z`d5@yYc{c;%W;kz7w+9hz9teV9s}t)2H%sGFG1XgsG=J?KCCbF8Y;=wtrAsN>9P|a4JUY#&esQFospZc}H zx(*V5k3&-K9UdT+(j`8J-FX{ALLww~&Bsy=n*|E2Pnx5ONG`V3zb!Z4j*z;)R;D}q zp^Hur?D`f=q_YLI$N0|X4_Gw5OeyT(&>&r@MJL`V3w4OIKp=FNU<~`6A-QMb6BE@` zdw;e__c-#3lk7i!0vz1$h?asziqA zM^QE&*1A4vHbt4q-C1k@EJr%fY-jLC3QL>m_`u3~9+yi~hk73{)t*{s625`gmAvrX zL_5EkOt^R}8Ec^aFEq}vo~4Gw1)OqntZ|~lf@C38k>#(4)};ujnf5WWlh)+tqhr5g1)=9R_lY~k z><#W8(K1wR8n@S^ctdt4e0+SdNkg>%pp~``_M0%2om{d3WemdBW-X6c&pN2Kfk1q_ zY~2O>=Ey6Wku-bWB;|#Qh_72DoLH;b|;JMX6S;JOx)1Gy-Sg(HC<-fBKp>fZT+5yl&2O?Q#~uCtoAY{UFqhV<@h` zRh;vRvi_ZN$SpY!rs@`GcQ7h(WZ)256xRb5mwNs1fd%Hy>$=rAGoYIr6%=F5nC2r@ z#`My<(N?exAhu|i*^wukKkc~w87o+thq#*|DbRx&wxn$so_f~ytB0e13=<*Ga(RUm z0kgfu4=w`w3@Ooy(>R)-XB`mRu*O4*AP-Ig1(;Ru_?|jkiE1wZJ~J&x2pxQ7O-(T) zYylqk9bjs}eqRW4S*my?#QC{^HeNC`MbAIycXN0=X1;fEQ|!W?*KVYT>cX){coP*b z{l0EBf`4GXXXvm(uglNROC$>|@I*XFRf9tfiS6aq8bL{ji>I4w>>rP5P^QDUM%qLG z2fCJf$~62m5!de!ZME;AfCsCN1wdw`t7-famviTW7#frC00J5SBb~$6mmVokkRa-H zRY@fLbxjb>CyN$mKXG(B;_P4wsG*~RWaow!BV$MW@Mhbi16GrqV=)i_=#-QIBENNw zzyVSVcQ_tbR9@&FJT@5s{V>ez)uvD7G}IeVP{x9s36DJ|ez|%|td#@Z%SQ371_m#! zM+(gS0elCmGIXR|Z7n1PSVHtDI441(IIc~Q`6mrpM Date: Mon, 24 Nov 2025 12:25:57 +0000 Subject: [PATCH 02/41] Switched corepack and node setup to use mise action --- .github/workflows/build.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5bae40664..bcb6ee9e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,17 +23,11 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Enable Corepack - run: | - npm install -g corepack@latest --force - corepack enable - - - name: Set up Node - uses: actions/setup-node@v4 + - uses: jdx/mise-action@v3 with: - # The talk on the street says this might be a good version for building. - node-version: 20.19.0 - cache: yarn + install: true + cache: true + log_level: debug - name: Install Yarn dependencies run: yarn install --frozen-lockfile From f4a7a548ade6fc57d84e568570b4139961cdc374 Mon Sep 17 00:00:00 2001 From: Cade Ayres Date: Mon, 24 Nov 2025 12:32:55 +0000 Subject: [PATCH 03/41] Updated workflows and made yarn version static --- .github/workflows/release.yml | 14 ++++---------- .github/workflows/test.yml | 14 ++++---------- mise.toml | 2 +- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d47a13380..71f85a59e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,17 +20,11 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Enable Corepack - run: | - npm install -g corepack@latest --force - corepack enable - - - name: Set up Node - uses: actions/setup-node@v4 + - uses: jdx/mise-action@v3 with: - # The talk on the street says this might be a good version for building. - node-version: 20.19.0 - cache: yarn + install: true + cache: true + log_level: debug - name: Install Yarn dependencies run: yarn install --frozen-lockfile diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 372ed7fbc..cb043dad3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,17 +23,11 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Enable Corepack - run: | - npm install -g corepack@latest --force - corepack enable - - - name: Set up Node - uses: actions/setup-node@v4 + - uses: jdx/mise-action@v3 with: - # The talk on the street says this might be a good version for building. - node-version: 20.19.0 - cache: yarn + install: true + cache: true + log_level: debug - name: Install Yarn dependencies run: yarn install --frozen-lockfile diff --git a/mise.toml b/mise.toml index 26536a8fe..8dcf8c938 100644 --- a/mise.toml +++ b/mise.toml @@ -1,3 +1,3 @@ [tools] node = '22' -yarn = "latest" +yarn = "4.11.0" From 87accd64c631c78f2d4ebef5670c843e249e82a3 Mon Sep 17 00:00:00 2001 From: Cade Ayres Date: Mon, 24 Nov 2025 15:20:29 +0000 Subject: [PATCH 04/41] Switched from --frozen-lockfile to --immutable --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bcb6ee9e7..c696de851 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,7 +30,7 @@ jobs: log_level: debug - name: Install Yarn dependencies - run: yarn install --frozen-lockfile + run: yarn install --immutable - if: matrix.platform == 'linux' name: Install bsdtar # Required by electron-builder when targeting pacman. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 71f85a59e..d44a5b0cc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: log_level: debug - name: Install Yarn dependencies - run: yarn install --frozen-lockfile + run: yarn install --immutable - if: matrix.platform == 'linux' name: Install bsdtar # Required by electron-builder when targeting pacman. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cb043dad3..9165c4332 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,7 +30,7 @@ jobs: log_level: debug - name: Install Yarn dependencies - run: yarn install --frozen-lockfile + run: yarn install --immutable - name: Prepare Quasar files run: npx @quasar/cli prepare From 29e8a75b2096a998583d5897d7e701d52e54953d Mon Sep 17 00:00:00 2001 From: Cade Ayres Date: Fri, 28 Nov 2025 09:54:17 +0000 Subject: [PATCH 05/41] Removed extra getModList calls after saving the same data to disk --- package.json | 2 ++ src/r2mm/mods/ProfileModList.ts | 19 +++++++++---------- yarn.lock | 20 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index e6d99c1ae..6884a1493 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "github-markdown-css": "^5.7.0", "glob-parent": "^6.0.2", "highlight.js": "^10.4.1", + "js-yaml": "^4.1.1", "lodash.debounce": "^4.0.8", "modern-normalize": "^3.0.1", "moment": "^2.29.1", @@ -70,6 +71,7 @@ "@types/async-lock": "^1.1.2", "@types/chai": "^4.2.11", "@types/fs-extra": "^8.0.1", + "@types/js-yaml": "^4", "@types/jsdom": "^21.1.7", "@types/lodash.debounce": "^4.0.7", "@types/node": "^20.19.1", diff --git a/src/r2mm/mods/ProfileModList.ts b/src/r2mm/mods/ProfileModList.ts index 307ae9eea..768a81768 100644 --- a/src/r2mm/mods/ProfileModList.ts +++ b/src/r2mm/mods/ProfileModList.ts @@ -1,4 +1,4 @@ -import * as yaml from 'yaml'; +import { load as parseYaml, dump as stringifyYaml } from "js-yaml"; import { ImmutableProfile } from '../../model/Profile'; import FsProvider from '../../providers/generic/file/FsProvider'; import FileNotFoundError from '../../model/errors/FileNotFoundError'; @@ -42,7 +42,7 @@ export default class ProfileModList { try { try { const fileContent = (await fs.readFile(profile.joinToProfilePath('mods.yml'))).toString(); - const parsedYaml = yaml.parse(fileContent) || []; + const parsedYaml: any = parseYaml(fileContent) || []; for(let modIndex in parsedYaml){ const mod = new ManifestV2().fromJsObject(parsedYaml[modIndex]); await this.setIconPath(mod, profile); @@ -71,7 +71,7 @@ export default class ProfileModList { public static async saveModList(profile: ImmutableProfile, modList: ManifestV2[]): Promise { const fs = FsProvider.instance; try { - const yamlModList: string = yaml.stringify(modList); + const yamlModList: string = stringifyYaml(modList); try { await fs.writeFile( profile.joinToProfilePath('mods.yml'), @@ -118,7 +118,7 @@ export default class ProfileModList { if (saveError !== null) { return saveError; } - return this.getModList(profile); + return currentModList; } public static async removeMod(mod: ManifestV2, profile: ImmutableProfile): Promise { @@ -131,16 +131,15 @@ export default class ProfileModList { if (saveError !== null) { return saveError; } - // Return mod list, or R2 error. We don't care at this point. - return this.getModList(profile); + return newModList; } - public static async updateMods(mods: ManifestV2[], profile: ImmutableProfile, apply: (mod: ManifestV2) => void): Promise { + public static async updateMods(modsToUpdate: ManifestV2[], profile: ImmutableProfile, apply: (mod: ManifestV2) => void): Promise { const list: ManifestV2[] | R2Error = await this.getModList(profile); if (list instanceof R2Error) { return list; } - for (let mod of mods) { + for (let mod of modsToUpdate) { list.filter((filteringMod: ManifestV2) => filteringMod.getName() === mod.getName()) .forEach((filteringMod: ManifestV2) => { apply(filteringMod); @@ -150,7 +149,7 @@ export default class ProfileModList { if (saveErr instanceof R2Error) { return saveErr; } - return this.getModList(profile); + return list; } public static async updateMod(mod: ManifestV2, profile: ImmutableProfile, apply: (mod: ManifestV2) => Promise): Promise { @@ -176,7 +175,7 @@ export default class ProfileModList { const exportModList: ExportMod[] = list.map((manifestMod: ManifestV2) => ExportMod.fromManifest(manifestMod)); const exportFormat = new ExportFormat(profile.getProfileName(), exportModList); const builder = ZipProvider.instance.zipBuilder(); - await builder.addBuffer("export.r2x", Buffer.from(yaml.stringify(exportFormat))); + await builder.addBuffer("export.r2x", Buffer.from(stringifyYaml(exportFormat))); if (await FsProvider.instance.exists(profile.joinToProfilePath("BepInEx", "config"))) { await builder.addFolder("config", profile.joinToProfilePath('BepInEx', 'config')); } diff --git a/yarn.lock b/yarn.lock index b70a0ecef..2baf9a6d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1979,6 +1979,13 @@ __metadata: languageName: node linkType: hard +"@types/js-yaml@npm:^4": + version: 4.0.9 + resolution: "@types/js-yaml@npm:4.0.9" + checksum: 10c0/24de857aa8d61526bbfbbaa383aa538283ad17363fcd5bb5148e2c7f604547db36646440e739d78241ed008702a8920665d1add5618687b6743858fae00da211 + languageName: node + linkType: hard + "@types/jsdom@npm:^21.1.7": version: 21.1.7 resolution: "@types/jsdom@npm:21.1.7" @@ -6978,6 +6985,17 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^4.1.1": + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 + languageName: node + linkType: hard + "jsesc@npm:^3.0.2": version: 3.0.2 resolution: "jsesc@npm:3.0.2" @@ -8744,6 +8762,7 @@ __metadata: "@types/async-lock": "npm:^1.1.2" "@types/chai": "npm:^4.2.11" "@types/fs-extra": "npm:^8.0.1" + "@types/js-yaml": "npm:^4" "@types/jsdom": "npm:^21.1.7" "@types/lodash.debounce": "npm:^4.0.7" "@types/node": "npm:^20.19.1" @@ -8783,6 +8802,7 @@ __metadata: glob-parent: "npm:^6.0.2" highlight.js: "npm:^10.4.1" identity-obj-proxy: "npm:^3.0.0" + js-yaml: "npm:^4.1.1" lodash.debounce: "npm:^4.0.8" mock-require: "npm:^3.0.3" modern-normalize: "npm:^3.0.1" From bb4462c5092fc75b41443c99935e191ae543dc4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4ki?= Date: Mon, 1 Dec 2025 11:50:23 +0200 Subject: [PATCH 06/41] Add Smushi Come Home --- .../game_selection/smushi-come-home.webp | Bin 0 -> 22010 bytes src/assets/data/ecosystem.json | 249 ++++++++++++++++++ 2 files changed, 249 insertions(+) create mode 100644 public/images/game_selection/smushi-come-home.webp diff --git a/public/images/game_selection/smushi-come-home.webp b/public/images/game_selection/smushi-come-home.webp new file mode 100644 index 0000000000000000000000000000000000000000..dab331782823458e46ae491090b916e4906a98f6 GIT binary patch literal 22010 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