From f1028dcb310c47970aa3caad0c40e4d7dd39ea20 Mon Sep 17 00:00:00 2001 From: lcy0x1 Date: Tue, 25 Jun 2024 10:04:11 +0800 Subject: [PATCH] clean up --- build.gradle | 39 +-- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 62076 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 6 - .../l2core/events/BaseJsonReloadListener.java | 31 -- .../xkmc/l2core/events/EffectSyncEvents.java | 13 +- .../java/dev/xkmc/l2core/init/L2Core.java | 4 +- .../java/dev/xkmc/l2core/init/L2TagGen.java | 32 +++ .../init/reg/registrate/EffectEntry.java | 17 ++ .../init/reg/registrate/L2Registrate.java | 145 +++++++--- .../init/reg/registrate/NamedEntry.java | 19 +- .../init/reg/registrate/RecipeTypeEntry.java | 18 ++ .../init/reg/registrate/SimpleEntry.java | 16 ++ ...ipeWrapper.java => DataRecipeWrapper.java} | 3 +- src/test/java/organize/GUIGenerator.java | 267 ------------------ src/test/java/organize/ResourceOrganizer.java | 122 -------- .../java/organize/sub/ArmorFileOrganizer.java | 22 -- src/test/java/organize/sub/AssetMisc.java | 38 --- .../java/organize/sub/BlockFileOrganizer.java | 44 --- src/test/java/organize/sub/DataMisc.java | 32 --- src/test/java/organize/sub/GeckoMisc.java | 40 --- .../java/organize/sub/ItemFileOrganizer.java | 43 --- .../java/organize/sub/LangFileOrganizer.java | 82 ------ .../organize/sub/RecipeFileOrganizer.java | 118 -------- src/test/java/util/ScalePic.java | 65 ----- .../textures/gui/container/curios_3.png | Bin 2100 -> 0 bytes .../textures/gui/container/curios_4.png | Bin 2182 -> 0 bytes .../textures/gui/container/curios_5.png | Bin 2262 -> 0 bytes .../textures/gui/container/curios_6.png | Bin 2340 -> 0 bytes .../assets/textures/gui/coords/curios_3.json | 21 -- .../assets/textures/gui/coords/curios_4.json | 21 -- .../assets/textures/gui/coords/curios_5.json | 21 -- .../assets/textures/gui/coords/curios_6.json | 21 -- .../data/l2library/gui/coords/curios_3.json | 21 -- .../data/l2library/gui/coords/curios_4.json | 21 -- .../data/l2library/gui/coords/curios_5.json | 21 -- .../data/l2library/gui/coords/curios_6.json | 21 -- .../container/l2library/curios_3.json | 15 - .../container/l2library/curios_4.json | 15 - .../container/l2library/curios_5.json | 15 - .../container/l2library/curios_6.json | 15 - .../l2library/gui/-templates/info.json | 148 ---------- .../gui/-templates/sprites/altas/_belt.png | Bin 118 -> 0 bytes .../gui/-templates/sprites/altas/_body.png | Bin 124 -> 0 bytes .../-templates/sprites/altas/_boost_main.png | Bin 141 -> 0 bytes .../-templates/sprites/altas/_boost_sub.png | Bin 116 -> 0 bytes .../-templates/sprites/altas/_bracelet.png | Bin 134 -> 0 bytes .../-templates/sprites/altas/_disabled.png | Bin 1138 -> 0 bytes .../gui/-templates/sprites/altas/_head.png | Bin 133 -> 0 bytes .../-templates/sprites/altas/_necklace.png | Bin 128 -> 0 bytes .../sprites/altas/_stat_container.png | Bin 150 -> 0 bytes .../gui/-templates/sprites/arrow/_0.png | Bin 189 -> 0 bytes .../gui/-templates/sprites/arrow/_0r.png | Bin 191 -> 0 bytes .../gui/-templates/sprites/arrow/_1.png | Bin 189 -> 0 bytes .../gui/-templates/sprites/arrow/_2.png | Bin 206 -> 0 bytes .../gui/-templates/sprites/arrow/_3.png | Bin 188 -> 0 bytes .../gui/-templates/sprites/bottom.png | Bin 549 -> 0 bytes .../gui/-templates/sprites/bottom_screen.png | Bin 1112 -> 0 bytes .../gui/-templates/sprites/button/_1.png | Bin 150 -> 0 bytes .../gui/-templates/sprites/button/_1p.png | Bin 154 -> 0 bytes .../gui/-templates/sprites/button/_2.png | Bin 160 -> 0 bytes .../gui/-templates/sprites/button/_2p.png | Bin 160 -> 0 bytes .../gui/-templates/sprites/delete/_off.png | Bin 224 -> 0 bytes .../gui/-templates/sprites/delete/_on.png | Bin 223 -> 0 bytes .../gui/-templates/sprites/empty_slot.png | Bin 105 -> 0 bytes .../gui/-templates/sprites/exchange/_in.png | Bin 157 -> 0 bytes .../gui/-templates/sprites/exchange/_out.png | Bin 164 -> 0 bytes .../gui/-templates/sprites/fire/_0.png | Bin 166 -> 0 bytes .../gui/-templates/sprites/fire/_1.png | Bin 318 -> 0 bytes .../gui/-templates/sprites/middle.png | Bin 111 -> 0 bytes .../gui/-templates/sprites/result_slot.png | Bin 135 -> 0 bytes .../gui/-templates/sprites/slider/_bottom.png | Bin 88 -> 0 bytes .../gui/-templates/sprites/slider/_dark.png | Bin 131 -> 0 bytes .../gui/-templates/sprites/slider/_light.png | Bin 141 -> 0 bytes .../gui/-templates/sprites/slider/_middle.png | Bin 96 -> 0 bytes .../gui/-templates/sprites/slider/_top.png | Bin 93 -> 0 bytes .../l2library/gui/-templates/sprites/slot.png | Bin 123 -> 0 bytes .../gui/-templates/sprites/sort/_1.png | Bin 116 -> 0 bytes .../gui/-templates/sprites/sort/_1p.png | Bin 120 -> 0 bytes .../gui/-templates/sprites/toggle_slot/_0.png | Bin 123 -> 0 bytes .../gui/-templates/sprites/toggle_slot/_1.png | Bin 129 -> 0 bytes .../gui/-templates/sprites/toggle_slot/_2.png | Bin 129 -> 0 bytes .../l2library/gui/-templates/sprites/top.png | Bin 192 -> 0 bytes .../gui/-templates/sprites/upgrade/_off.png | Bin 184 -> 0 bytes .../gui/-templates/sprites/upgrade/_on.png | Bin 179 -> 0 bytes 85 files changed, 211 insertions(+), 1383 deletions(-) delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 src/main/java/dev/xkmc/l2core/events/BaseJsonReloadListener.java create mode 100644 src/main/java/dev/xkmc/l2core/init/L2TagGen.java create mode 100644 src/main/java/dev/xkmc/l2core/init/reg/registrate/EffectEntry.java create mode 100644 src/main/java/dev/xkmc/l2core/init/reg/registrate/RecipeTypeEntry.java create mode 100644 src/main/java/dev/xkmc/l2core/init/reg/registrate/SimpleEntry.java rename src/main/java/dev/xkmc/l2core/serial/recipe/{NBTRecipeWrapper.java => DataRecipeWrapper.java} (87%) delete mode 100644 src/test/java/organize/GUIGenerator.java delete mode 100644 src/test/java/organize/ResourceOrganizer.java delete mode 100644 src/test/java/organize/sub/ArmorFileOrganizer.java delete mode 100644 src/test/java/organize/sub/AssetMisc.java delete mode 100644 src/test/java/organize/sub/BlockFileOrganizer.java delete mode 100644 src/test/java/organize/sub/DataMisc.java delete mode 100644 src/test/java/organize/sub/GeckoMisc.java delete mode 100644 src/test/java/organize/sub/ItemFileOrganizer.java delete mode 100644 src/test/java/organize/sub/LangFileOrganizer.java delete mode 100644 src/test/java/organize/sub/RecipeFileOrganizer.java delete mode 100644 src/test/java/util/ScalePic.java delete mode 100644 src/test/resources/l2library/assets/textures/gui/container/curios_3.png delete mode 100644 src/test/resources/l2library/assets/textures/gui/container/curios_4.png delete mode 100644 src/test/resources/l2library/assets/textures/gui/container/curios_5.png delete mode 100644 src/test/resources/l2library/assets/textures/gui/container/curios_6.png delete mode 100644 src/test/resources/l2library/assets/textures/gui/coords/curios_3.json delete mode 100644 src/test/resources/l2library/assets/textures/gui/coords/curios_4.json delete mode 100644 src/test/resources/l2library/assets/textures/gui/coords/curios_5.json delete mode 100644 src/test/resources/l2library/assets/textures/gui/coords/curios_6.json delete mode 100644 src/test/resources/l2library/data/l2library/gui/coords/curios_3.json delete mode 100644 src/test/resources/l2library/data/l2library/gui/coords/curios_4.json delete mode 100644 src/test/resources/l2library/data/l2library/gui/coords/curios_5.json delete mode 100644 src/test/resources/l2library/data/l2library/gui/coords/curios_6.json delete mode 100644 src/test/resources/l2library/gui/-templates/container/l2library/curios_3.json delete mode 100644 src/test/resources/l2library/gui/-templates/container/l2library/curios_4.json delete mode 100644 src/test/resources/l2library/gui/-templates/container/l2library/curios_5.json delete mode 100644 src/test/resources/l2library/gui/-templates/container/l2library/curios_6.json delete mode 100644 src/test/resources/l2library/gui/-templates/info.json delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_belt.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_body.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_boost_main.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_boost_sub.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_bracelet.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_disabled.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_head.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_necklace.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/altas/_stat_container.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/arrow/_0.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/arrow/_0r.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/arrow/_1.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/arrow/_2.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/arrow/_3.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/bottom.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/bottom_screen.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/button/_1.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/button/_1p.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/button/_2.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/button/_2p.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/delete/_off.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/delete/_on.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/empty_slot.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/exchange/_in.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/exchange/_out.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/fire/_0.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/fire/_1.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/middle.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/result_slot.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/slider/_bottom.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/slider/_dark.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/slider/_light.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/slider/_middle.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/slider/_top.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/slot.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/sort/_1.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/sort/_1p.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/toggle_slot/_0.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/toggle_slot/_1.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/toggle_slot/_2.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/top.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/upgrade/_off.png delete mode 100644 src/test/resources/l2library/gui/-templates/sprites/upgrade/_on.png diff --git a/build.gradle b/build.gradle index 76da8b4..0973ddf 100644 --- a/build.gradle +++ b/build.gradle @@ -111,16 +111,6 @@ if (lljij.toBoolean()) { } -dependencies { - //annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" - compileOnly "com.tterrag.registrate:Registrate:${registrate_version}" - if (rootMod.toBoolean()) { - //jarJar(group: 'com.tterrag.registrate', name: 'Registrate', version: "[MC1.20,MC1.21)") - } -} - -// project specific - repositories { flatDir { dirs 'libs' @@ -148,34 +138,7 @@ repositories { } dependencies { - // base dep implementation "mezz.jei:jei-${jei_minecraft_version}:${jei_version}" - //implementation "top.theillusivec4.curios:curios-neoforge:${curios_version}" - + implementation "com.tterrag.registrate:Registrate:${registrate_version}" implementation "dev.xkmc:l2serial:${l2serial_ver}" - - //runtimeOnly fg.deobf("dev.xkmc.l2damagetracker:l2damagetracker:0.2.4") - //runtimeOnly fg.deobf("dev.xkmc.l2backpack:l2backpack:2.4.12-slim") - //runtimeOnly fg.deobf("dev.xkmc.l2complements:l2complements:2.4.18-slim") - //runtimeOnly fg.deobf('dev.xkmc.modulargolems:modulargolems:2.4.16-slim') - //runtimeOnly fg.deobf("dev.xkmc.l2archery:l2archery:2.4.9") - //runtimeOnly fg.deobf("dev.xkmc.l2weaponry:l2weaponry:2.4.18") - //runtimeOnly fg.deobf("dev.xkmc.l2artifacts:l2artifacts:2.4.8-slim") - - //runtimeOnly fg.deobf("curse.maven:create-328085:4626108") - //implementation fg.deobf("curse.maven:just-enough-effect-descriptions-jeed-532286:4599236") - - //runtimeOnly fg.deobf("curse.maven:badpackets-615134:4438956") - //runtimeOnly fg.deobf("curse.maven:wthit-forge-455982:4596739") - //runtimeOnly fg.deobf("curse.maven:attributefix-280510:4588114") - //runtimeOnly fg.deobf("curse.maven:bookshelf-228525:4581675") - //runtimeOnly fg.deobf("curse.maven:enchantment-descriptions-250419:4587429") - //runtimeOnly fg.deobf("curse.maven:appleskin-248787:4605078") - //implementation fg.deobf("curse.maven:patchouli-306770:4636277") - - //runtimeOnly fg.deobf("dev.xkmc.traderefresh:traderefresh:2.1.1-slim") - //runtimeOnly fg.deobf("dev.xkmc.lasertransport:lasertransport:2.2.0.pre5-slim") - - //runtimeOnly fg.deobf('curse.maven:max-health-fix-492246:4447240') - //runtimeOnly fg.deobf('curse.maven:the-twilight-forest-227639:4516391') } diff --git a/gradle.properties b/gradle.properties index b25a753..c1d3e7b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=l2core mod_name=L2Core mod_license=LGPL-2.1 -mod_version=3.0.0-pre0 +mod_version=3.0.0 mod_group_id=dev.xkmc mod_authors=lcy0x1 mod_description=Core Library mod for all L2 mods diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index c1962a79e29d3e0ab67b14947c167a862655af9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62076 zcmb5VV{~QRw)Y#`wrv{~+qP{x72B%VwzFc}c2cp;N~)5ZbDrJayPv(!dGEd-##*zr z)#n-$y^sH|_dchh3@8{H5D*j;5D<{i*8l5IFJ|DjL!e)upfGNX(kojugZ3I`oH1PvW`wFW_ske0j@lB9bX zO;2)`y+|!@X(fZ1<2n!Qx*)_^Ai@Cv-dF&(vnudG?0CsddG_&Wtae(n|K59ew)6St z#dj7_(Cfwzh$H$5M!$UDd8=4>IQsD3xV=lXUq($;(h*$0^yd+b{qq63f0r_de#!o_ zXDngc>zy`uor)4A^2M#U*DC~i+dc<)Tb1Tv&~Ev@oM)5iJ4Sn#8iRw16XXuV50BS7 zdBL5Mefch(&^{luE{*5qtCZk$oFr3RH=H!c3wGR=HJ(yKc_re_X9pD` zJ;uxPzUfVpgU>DSq?J;I@a+10l0ONXPcDkiYcihREt5~T5Gb}sT0+6Q;AWHl`S5dV>lv%-p9l#xNNy7ZCr%cyqHY%TZ8Q4 zbp&#ov1*$#grNG#1vgfFOLJCaNG@K|2!W&HSh@3@Y%T?3YI75bJp!VP*$*!< z;(ffNS_;@RJ`=c7yX04!u3JP*<8jeqLHVJu#WV&v6wA!OYJS4h<_}^QI&97-;=ojW zQ-1t)7wnxG*5I%U4)9$wlv5Fr;cIizft@&N+32O%B{R1POm$oap@&f| zh+5J{>U6ftv|vAeKGc|zC=kO(+l7_cLpV}-D#oUltScw})N>~JOZLU_0{Ka2e1evz z{^a*ZrLr+JUj;)K&u2CoCAXLC2=fVScI(m_p~0FmF>>&3DHziouln?;sxW`NB}cSX z8?IsJB)Z=aYRz!X=yJn$kyOWK%rCYf-YarNqKzmWu$ZvkP12b4qH zhS9Q>j<}(*frr?z<%9hl*i^#@*O2q(Z^CN)c2c z>1B~D;@YpG?G!Yk+*yn4vM4sO-_!&m6+`k|3zd;8DJnxsBYtI;W3We+FN@|tQ5EW= z!VU>jtim0Mw#iaT8t_<+qKIEB-WwE04lBd%Letbml9N!?SLrEG$nmn7&W(W`VB@5S zaY=sEw2}i@F_1P4OtEw?xj4@D6>_e=m=797#hg}f*l^`AB|Y0# z9=)o|%TZFCY$SzgSjS|8AI-%J4x}J)!IMxY3_KYze`_I=c1nmrk@E8c9?MVRu)7+Ue79|)rBX7tVB7U|w4*h(;Gi3D9le49B38`wuv zp7{4X^p+K4*$@gU(Tq3K1a#3SmYhvI42)GzG4f|u zwQFT1n_=n|jpi=70-yE9LA+d*T8u z`=VmmXJ_f6WmZveZPct$Cgu^~gFiyL>Lnpj*6ee>*0pz=t$IJ}+rE zsf@>jlcG%Wx;Cp5x)YSVvB1$yyY1l&o zvwX=D7k)Dn;ciX?Z)Pn8$flC8#m`nB&(8?RSdBvr?>T9?E$U3uIX7T?$v4dWCa46 z+&`ot8ZTEgp7G+c52oHJ8nw5}a^dwb_l%MOh(ebVj9>_koQP^$2B~eUfSbw9RY$_< z&DDWf2LW;b0ZDOaZ&2^i^g+5uTd;GwO(-bbo|P^;CNL-%?9mRmxEw~5&z=X^Rvbo^WJW=n_%*7974RY}JhFv46> zd}`2|qkd;89l}R;i~9T)V-Q%K)O=yfVKNM4Gbacc7AOd>#^&W&)Xx!Uy5!BHnp9kh z`a(7MO6+Ren#>R^D0K)1sE{Bv>}s6Rb9MT14u!(NpZOe-?4V=>qZ>}uS)!y~;jEUK z&!U7Fj&{WdgU#L0%bM}SYXRtM5z!6M+kgaMKt%3FkjWYh=#QUpt$XX1!*XkpSq-pl zhMe{muh#knk{9_V3%qdDcWDv}v)m4t9 zQhv{;} zc{}#V^N3H>9mFM8`i`0p+fN@GqX+kl|M94$BK3J-X`Hyj8r!#x6Vt(PXjn?N)qedP z=o1T^#?1^a{;bZ&x`U{f?}TMo8ToN zkHj5v|}r}wDEi7I@)Gj+S1aE-GdnLN+$hw!=DzglMaj#{qjXi_dwpr|HL(gcCXwGLEmi|{4&4#OZ4ChceA zKVd4K!D>_N=_X;{poT~4Q+!Le+ZV>=H7v1*l%w`|`Dx8{)McN@NDlQyln&N3@bFpV z_1w~O4EH3fF@IzJ9kDk@7@QctFq8FbkbaH7K$iX=bV~o#gfh?2JD6lZf(XP>~DACF)fGFt)X%-h1yY~MJU{nA5 ze2zxWMs{YdX3q5XU*9hOH0!_S24DOBA5usB+Ws$6{|AMe*joJ?RxfV}*7AKN9V*~J zK+OMcE@bTD>TG1*yc?*qGqjBN8mgg@h1cJLDv)0!WRPIkC` zZrWXrceVw;fB%3`6kq=a!pq|hFIsQ%ZSlo~)D z|64!aCnw-?>}AG|*iOl44KVf8@|joXi&|)1rB;EQWgm+iHfVbgllP$f!$Wf42%NO5b(j9Bw6L z;0dpUUK$5GX4QbMlTmLM_jJt!ur`_0~$b#BB7FL*%XFf<b__1o)Ao3rlobbN8-(T!1d-bR8D3S0@d zLI!*GMb5s~Q<&sjd}lBb8Nr0>PqE6_!3!2d(KAWFxa{hm`@u|a(%#i(#f8{BP2wbs zt+N_slWF4IF_O|{w`c~)Xvh&R{Au~CFmW#0+}MBd2~X}t9lz6*E7uAD`@EBDe$>7W zzPUkJx<`f$0VA$=>R57^(K^h86>09?>_@M(R4q($!Ck6GG@pnu-x*exAx1jOv|>KH zjNfG5pwm`E-=ydcb+3BJwuU;V&OS=6yM^4Jq{%AVqnTTLwV`AorIDD}T&jWr8pB&j28fVtk_y*JRP^t@l*($UZ z6(B^-PBNZ+z!p?+e8@$&jCv^EWLb$WO=}Scr$6SM*&~B95El~;W_0(Bvoha|uQ1T< zO$%_oLAwf1bW*rKWmlD+@CP&$ObiDy=nh1b2ejz%LO9937N{LDe7gle4i!{}I$;&Y zkexJ9Ybr+lrCmKWg&}p=`2&Gf10orS?4$VrzWidT=*6{KzOGMo?KI0>GL0{iFWc;C z+LPq%VH5g}6V@-tg2m{C!-$fapJ9y}c$U}aUmS{9#0CM*8pC|sfer!)nG7Ji>mfRh z+~6CxNb>6eWKMHBz-w2{mLLwdA7dA-qfTu^A2yG1+9s5k zcF=le_UPYG&q!t5Zd_*E_P3Cf5T6821bO`daa`;DODm8Ih8k89=RN;-asHIigj`n=ux>*f!OC5#;X5i;Q z+V!GUy0|&Y_*8k_QRUA8$lHP;GJ3UUD08P|ALknng|YY13)}!!HW@0z$q+kCH%xet zlWf@BXQ=b=4}QO5eNnN~CzWBbHGUivG=`&eWK}beuV*;?zt=P#pM*eTuy3 zP}c#}AXJ0OIaqXji78l;YrP4sQe#^pOqwZUiiN6^0RCd#D271XCbEKpk`HI0IsN^s zES7YtU#7=8gTn#lkrc~6)R9u&SX6*Jk4GFX7){E)WE?pT8a-%6P+zS6o&A#ml{$WX zABFz#i7`DDlo{34)oo?bOa4Z_lNH>n;f0nbt$JfAl~;4QY@}NH!X|A$KgMmEsd^&Y zt;pi=>AID7ROQfr;MsMtClr5b0)xo|fwhc=qk33wQ|}$@?{}qXcmECh>#kUQ-If0$ zseb{Wf4VFGLNc*Rax#P8ko*=`MwaR-DQ8L8V8r=2N{Gaips2_^cS|oC$+yScRo*uF zUO|5=?Q?{p$inDpx*t#Xyo6=s?bbN}y>NNVxj9NZCdtwRI70jxvm3!5R7yiWjREEd zDUjrsZhS|P&|Ng5r+f^kA6BNN#|Se}_GF>P6sy^e8kBrgMv3#vk%m}9PCwUWJg-AD zFnZ=}lbi*mN-AOm zCs)r=*YQAA!`e#1N>aHF=bb*z*hXH#Wl$z^o}x##ZrUc=kh%OHWhp=7;?8%Xj||@V?1c ziWoaC$^&04;A|T)!Zd9sUzE&$ODyJaBpvqsw19Uiuq{i#VK1!htkdRWBnb z`{rat=nHArT%^R>u#CjjCkw-7%g53|&7z-;X+ewb?OLWiV|#nuc8mp*LuGSi3IP<<*Wyo9GKV7l0Noa4Jr0g3p_$ z*R9{qn=?IXC#WU>48-k5V2Oc_>P;4_)J@bo1|pf=%Rcbgk=5m)CJZ`caHBTm3%!Z9 z_?7LHr_BXbKKr=JD!%?KhwdYSdu8XxPoA{n8^%_lh5cjRHuCY9Zlpz8g+$f@bw@0V z+6DRMT9c|>1^3D|$Vzc(C?M~iZurGH2pXPT%F!JSaAMdO%!5o0uc&iqHx?ImcX6fI zCApkzc~OOnfzAd_+-DcMp&AOQxE_EsMqKM{%dRMI5`5CT&%mQO?-@F6tE*xL?aEGZ z8^wH@wRl`Izx4sDmU>}Ym{ybUm@F83qqZPD6nFm?t?(7>h*?`fw)L3t*l%*iw0Qu#?$5eq!Qc zpQvqgSxrd83NsdO@lL6#{%lsYXWen~d3p4fGBb7&5xqNYJ)yn84!e1PmPo7ChVd%4 zHUsV0Mh?VpzZD=A6%)Qrd~i7 z96*RPbid;BN{Wh?adeD_p8YU``kOrGkNox3D9~!K?w>#kFz!4lzOWR}puS(DmfjJD z`x0z|qB33*^0mZdM&6$|+T>fq>M%yoy(BEjuh9L0>{P&XJ3enGpoQRx`v6$txXt#c z0#N?b5%srj(4xmPvJxrlF3H%OMB!jvfy z;wx8RzU~lb?h_}@V=bh6p8PSb-dG|-T#A?`c&H2`_!u+uenIZe`6f~A7r)`9m8atC zt(b|6Eg#!Q*DfRU=Ix`#B_dK)nnJ_+>Q<1d7W)eynaVn`FNuN~%B;uO2}vXr5^zi2 z!ifIF5@Zlo0^h~8+ixFBGqtweFc`C~JkSq}&*a3C}L?b5Mh-bW=e)({F_g4O3 zb@SFTK3VD9QuFgFnK4Ve_pXc3{S$=+Z;;4+;*{H}Rc;845rP?DLK6G5Y-xdUKkA6E3Dz&5f{F^FjJQ(NSpZ8q-_!L3LL@H* zxbDF{gd^U3uD;)a)sJwAVi}7@%pRM&?5IaUH%+m{E)DlA_$IA1=&jr{KrhD5q&lTC zAa3c)A(K!{#nOvenH6XrR-y>*4M#DpTTOGQEO5Jr6kni9pDW`rvY*fs|ItV;CVITh z=`rxcH2nEJpkQ^(;1c^hfb8vGN;{{oR=qNyKtR1;J>CByul*+=`NydWnSWJR#I2lN zTvgnR|MBx*XFsfdA&;tr^dYaqRZp*2NwkAZE6kV@1f{76e56eUmGrZ>MDId)oqSWw z7d&r3qfazg+W2?bT}F)4jD6sWaw`_fXZGY&wnGm$FRPFL$HzVTH^MYBHWGCOk-89y zA+n+Q6EVSSCpgC~%uHfvyg@ufE^#u?JH?<73A}jj5iILz4Qqk5$+^U(SX(-qv5agK znUkfpke(KDn~dU0>gdKqjTkVk`0`9^0n_wzXO7R!0Thd@S;U`y)VVP&mOd-2 z(hT(|$=>4FY;CBY9#_lB$;|Wd$aOMT5O_3}DYXEHn&Jrc3`2JiB`b6X@EUOD zVl0S{ijm65@n^19T3l%>*;F(?3r3s?zY{thc4%AD30CeL_4{8x6&cN}zN3fE+x<9; zt2j1RRVy5j22-8U8a6$pyT+<`f+x2l$fd_{qEp_bfxfzu>ORJsXaJn4>U6oNJ#|~p z`*ZC&NPXl&=vq2{Ne79AkQncuxvbOG+28*2wU$R=GOmns3W@HE%^r)Fu%Utj=r9t` zd;SVOnA(=MXgnOzI2@3SGKHz8HN~Vpx&!Ea+Df~`*n@8O=0!b4m?7cE^K*~@fqv9q zF*uk#1@6Re_<^9eElgJD!nTA@K9C732tV~;B`hzZ321Ph=^BH?zXddiu{Du5*IPg} zqDM=QxjT!Rp|#Bkp$(mL)aar)f(dOAXUiw81pX0DC|Y4;>Vz>>DMshoips^8Frdv} zlTD=cKa48M>dR<>(YlLPOW%rokJZNF2gp8fwc8b2sN+i6&-pHr?$rj|uFgktK@jg~ zIFS(%=r|QJ=$kvm_~@n=ai1lA{7Z}i+zj&yzY+!t$iGUy|9jH#&oTNJ;JW-3n>DF+ z3aCOzqn|$X-Olu_p7brzn`uk1F*N4@=b=m;S_C?#hy{&NE#3HkATrg?enaVGT^$qIjvgc61y!T$9<1B@?_ibtDZ{G zeXInVr5?OD_nS_O|CK3|RzzMmu+8!#Zb8Ik;rkIAR%6?$pN@d<0dKD2c@k2quB%s( zQL^<_EM6ow8F6^wJN1QcPOm|ehA+dP(!>IX=Euz5qqIq}Y3;ibQtJnkDmZ8c8=Cf3 zu`mJ!Q6wI7EblC5RvP*@)j?}W=WxwCvF3*5Up_`3*a~z$`wHwCy)2risye=1mSp%p zu+tD6NAK3o@)4VBsM!@);qgsjgB$kkCZhaimHg&+k69~drbvRTacWKH;YCK(!rC?8 zP#cK5JPHSw;V;{Yji=55X~S+)%(8fuz}O>*F3)hR;STU`z6T1aM#Wd+FP(M5*@T1P z^06O;I20Sk!bxW<-O;E081KRdHZrtsGJflFRRFS zdi5w9OVDGSL3 zNrC7GVsGN=b;YH9jp8Z2$^!K@h=r-xV(aEH@#JicPy;A0k1>g1g^XeR`YV2HfmqXY zYbRwaxHvf}OlCAwHoVI&QBLr5R|THf?nAevV-=~V8;gCsX>jndvNOcFA+DI+zbh~# zZ7`qNk&w+_+Yp!}j;OYxIfx_{f0-ONc?mHCiCUak=>j>~>YR4#w# zuKz~UhT!L~GfW^CPqG8Lg)&Rc6y^{%3H7iLa%^l}cw_8UuG;8nn9)kbPGXS}p3!L_ zd#9~5CrH8xtUd?{d2y^PJg+z(xIfRU;`}^=OlehGN2=?}9yH$4Rag}*+AWotyxfCJ zHx=r7ZH>j2kV?%7WTtp+-HMa0)_*DBBmC{sd$)np&GEJ__kEd`xB5a2A z*J+yx>4o#ZxwA{;NjhU*1KT~=ZK~GAA;KZHDyBNTaWQ1+;tOFFthnD)DrCn`DjBZ% zk$N5B4^$`n^jNSOr=t(zi8TN4fpaccsb`zOPD~iY=UEK$0Y70bG{idLx@IL)7^(pL z{??Bnu=lDeguDrd%qW1)H)H`9otsOL-f4bSu};o9OXybo6J!Lek`a4ff>*O)BDT_g z<6@SrI|C9klY(>_PfA^qai7A_)VNE4c^ZjFcE$Isp>`e5fLc)rg@8Q_d^Uk24$2bn z9#}6kZ2ZxS9sI(RqT7?El2@B+($>eBQrNi_k#CDJ8D9}8$mmm z4oSKO^F$i+NG)-HE$O6s1--6EzJa?C{x=QgK&c=)b(Q9OVoAXYEEH20G|q$}Hue%~ zO3B^bF=t7t48sN zWh_zA`w~|){-!^g?6Mqf6ieV zFx~aPUOJGR=4{KsW7I?<=J2|lY`NTU=lt=%JE9H1vBpkcn=uq(q~=?iBt_-r(PLBM zP-0dxljJO>4Wq-;stY)CLB4q`-r*T$!K2o}?E-w_i>3_aEbA^MB7P5piwt1dI-6o!qWCy0 ztYy!x9arGTS?kabkkyv*yxvsPQ7Vx)twkS6z2T@kZ|kb8yjm+^$|sEBmvACeqbz)RmxkkDQX-A*K!YFziuhwb|ym>C$}U|J)4y z$(z#)GH%uV6{ec%Zy~AhK|+GtG8u@c884Nq%w`O^wv2#A(&xH@c5M`Vjk*SR_tJnq z0trB#aY)!EKW_}{#L3lph5ow=@|D5LzJYUFD6 z7XnUeo_V0DVSIKMFD_T0AqAO|#VFDc7c?c-Q%#u00F%!_TW1@JVnsfvm@_9HKWflBOUD~)RL``-!P;(bCON_4eVdduMO>?IrQ__*zE@7(OX zUtfH@AX*53&xJW*Pu9zcqxGiM>xol0I~QL5B%Toog3Jlenc^WbVgeBvV8C8AX^Vj& z^I}H})B=VboO%q1;aU5ACMh{yK4J;xlMc`jCnZR^!~LDs_MP&8;dd@4LDWw~*>#OT zeZHwdQWS!tt5MJQI~cw|Ka^b4c|qyd_ly(+Ql2m&AAw^ zQeSXDOOH!!mAgzAp0z)DD>6Xo``b6QwzUV@w%h}Yo>)a|xRi$jGuHQhJVA%>)PUvK zBQ!l0hq<3VZ*RnrDODP)>&iS^wf64C;MGqDvx>|p;35%6(u+IHoNbK z;Gb;TneFo*`zUKS6kwF*&b!U8e5m4YAo03a_e^!5BP42+r)LFhEy?_7U1IR<; z^0v|DhCYMSj<-;MtY%R@Fg;9Kky^pz_t2nJfKWfh5Eu@_l{^ph%1z{jkg5jQrkvD< z#vdK!nku*RrH~TdN~`wDs;d>XY1PH?O<4^U4lmA|wUW{Crrv#r%N>7k#{Gc44Fr|t z@UZP}Y-TrAmnEZ39A*@6;ccsR>)$A)S>$-Cj!=x$rz7IvjHIPM(TB+JFf{ehuIvY$ zsDAwREg*%|=>Hw$`us~RP&3{QJg%}RjJKS^mC_!U;E5u>`X`jW$}P`Mf}?7G7FX#{ zE(9u1SO;3q@ZhDL9O({-RD+SqqPX)`0l5IQu4q)49TUTkxR(czeT}4`WV~pV*KY&i zAl3~X%D2cPVD^B43*~&f%+Op)wl<&|D{;=SZwImydWL6@_RJjxP2g)s=dH)u9Npki zs~z9A+3fj0l?yu4N0^4aC5x)Osnm0qrhz@?nwG_`h(71P znbIewljU%T*cC=~NJy|)#hT+lx#^5MuDDnkaMb*Efw9eThXo|*WOQzJ*#3dmRWm@! zfuSc@#kY{Um^gBc^_Xdxnl!n&y&}R4yAbK&RMc+P^Ti;YIUh|C+K1|=Z^{nZ}}rxH*v{xR!i%qO~o zTr`WDE@k$M9o0r4YUFFeQO7xCu_Zgy)==;fCJ94M_rLAv&~NhfvcLWCoaGg2ao~3e zBG?Ms9B+efMkp}7BhmISGWmJsKI@a8b}4lLI48oWKY|8?zuuNc$lt5Npr+p7a#sWu zh!@2nnLBVJK!$S~>r2-pN||^w|fY`CT{TFnJy`B|e5;=+_v4l8O-fkN&UQbA4NKTyntd zqK{xEKh}U{NHoQUf!M=2(&w+eef77VtYr;xs%^cPfKLObyOV_9q<(%76-J%vR>w9!us-0c-~Y?_EVS%v!* z15s2s3eTs$Osz$JayyH|5nPAIPEX=U;r&p;K14G<1)bvn@?bM5kC{am|C5%hyxv}a z(DeSKI5ZfZ1*%dl8frIX2?);R^^~LuDOpNpk-2R8U1w92HmG1m&|j&J{EK=|p$;f9 z7Rs5|jr4r8k5El&qcuM+YRlKny%t+1CgqEWO>3;BSRZi(LA3U%Jm{@{y+A+w(gzA< z7dBq6a1sEWa4cD0W7=Ld9z0H7RI^Z7vl(bfA;72j?SWCo`#5mVC$l1Q2--%V)-uN* z9ha*s-AdfbDZ8R8*fpwjzx=WvOtmSzGFjC#X)hD%Caeo^OWjS(3h|d9_*U)l%{Ab8 zfv$yoP{OuUl@$(-sEVNt{*=qi5P=lpxWVuz2?I7Dc%BRc+NGNw+323^ z5BXGfS71oP^%apUo(Y#xkxE)y?>BFzEBZ}UBbr~R4$%b7h3iZu3S(|A;&HqBR{nK& z$;GApNnz=kNO^FL&nYcfpB7Qg;hGJPsCW44CbkG1@l9pn0`~oKy5S777uH)l{irK!ru|X+;4&0D;VE*Ii|<3P zUx#xUqvZT5kVQxsF#~MwKnv7;1pR^0;PW@$@T7I?s`_rD1EGUdSA5Q(C<>5SzE!vw z;{L&kKFM-MO>hy#-8z`sdVx})^(Dc-dw;k-h*9O2_YZw}|9^y-|8RQ`BWJUJL(Cer zP5Z@fNc>pTXABbTRY-B5*MphpZv6#i802giwV&SkFCR zGMETyUm(KJbh+&$8X*RB#+{surjr;8^REEt`2&Dubw3$mx>|~B5IKZJ`s_6fw zKAZx9&PwBqW1Oz0r0A4GtnZd7XTKViX2%kPfv+^X3|_}RrQ2e3l=KG_VyY`H?I5&CS+lAX5HbA%TD9u6&s#v!G> zzW9n4J%d5ye7x0y`*{KZvqyXUfMEE^ZIffzI=Hh|3J}^yx7eL=s+TPH(Q2GT-sJ~3 zI463C{(ag7-hS1ETtU;_&+49ABt5!A7CwLwe z=SoA8mYZIQeU;9txI=zcQVbuO%q@E)JI+6Q!3lMc=Gbj(ASg-{V27u>z2e8n;Nc*pf}AqKz1D>p9G#QA+7mqqrEjGfw+85Uyh!=tTFTv3|O z+)-kFe_8FF_EkTw!YzwK^Hi^_dV5x-Ob*UWmD-})qKj9@aE8g240nUh=g|j28^?v7 zHRTBo{0KGaWBbyX2+lx$wgXW{3aUab6Bhm1G1{jTC7ota*JM6t+qy)c5<@ zpc&(jVdTJf(q3xB=JotgF$X>cxh7k*(T`-V~AR+`%e?YOeALQ2Qud( zz35YizXt(aW3qndR}fTw1p()Ol4t!D1pitGNL95{SX4ywzh0SF;=!wf=?Q?_h6!f* zh7<+GFi)q|XBsvXZ^qVCY$LUa{5?!CgwY?EG;*)0ceFe&=A;!~o`ae}Z+6me#^sv- z1F6=WNd6>M(~ z+092z>?Clrcp)lYNQl9jN-JF6n&Y0mp7|I0dpPx+4*RRK+VQI~>en0Dc;Zfl+x z_e_b7s`t1_A`RP3$H}y7F9_na%D7EM+**G_Z0l_nwE+&d_kc35n$Fxkd4r=ltRZhh zr9zER8>j(EdV&Jgh(+i}ltESBK62m0nGH6tCBr90!4)-`HeBmz54p~QP#dsu%nb~W z7sS|(Iydi>C@6ZM(Us!jyIiszMkd)^u<1D+R@~O>HqZIW&kearPWmT>63%_t2B{_G zX{&a(gOYJx!Hq=!T$RZ&<8LDnxsmx9+TBL0gTk$|vz9O5GkK_Yx+55^R=2g!K}NJ3 zW?C;XQCHZl7H`K5^BF!Q5X2^Mj93&0l_O3Ea3!Ave|ixx+~bS@Iv18v2ctpSt4zO{ zp#7pj!AtDmti$T`e9{s^jf(ku&E|83JIJO5Qo9weT6g?@vX!{7)cNwymo1+u(YQ94 zopuz-L@|5=h8A!(g-MXgLJC0MA|CgQF8qlonnu#j z;uCeq9ny9QSD|p)9sp3ebgY3rk#y0DA(SHdh$DUm^?GI<>%e1?&}w(b zdip1;P2Z=1wM+$q=TgLP$}svd!vk+BZ@h<^4R=GS2+sri7Z*2f`9 z5_?i)xj?m#pSVchk-SR!2&uNhzEi+#5t1Z$o0PoLGz*pT64%+|Wa+rd5Z}60(j?X= z{NLjtgRb|W?CUADqOS@(*MA-l|E342NxRaxLTDqsOyfWWe%N(jjBh}G zm7WPel6jXijaTiNita+z(5GCO0NM=Melxud57PP^d_U## zbA;9iVi<@wr0DGB8=T9Ab#2K_#zi=$igyK48@;V|W`fg~7;+!q8)aCOo{HA@vpSy-4`^!ze6-~8|QE||hC{ICKllG9fbg_Y7v z$jn{00!ob3!@~-Z%!rSZ0JO#@>|3k10mLK0JRKP-Cc8UYFu>z93=Ab-r^oL2 zl`-&VBh#=-?{l1TatC;VweM^=M7-DUE>m+xO7Xi6vTEsReyLs8KJ+2GZ&rxw$d4IT zPXy6pu^4#e;;ZTsgmG+ZPx>piodegkx2n0}SM77+Y*j^~ICvp#2wj^BuqRY*&cjmL zcKp78aZt>e{3YBb4!J_2|K~A`lN=u&5j!byw`1itV(+Q_?RvV7&Z5XS1HF)L2v6ji z&kOEPmv+k_lSXb{$)of~(BkO^py&7oOzpjdG>vI1kcm_oPFHy38%D4&A4h_CSo#lX z2#oqMCTEP7UvUR3mwkPxbl8AMW(e{ARi@HCYLPSHE^L<1I}OgZD{I#YH#GKnpRmW3 z2jkz~Sa(D)f?V?$gNi?6)Y;Sm{&?~2p=0&BUl_(@hYeX8YjaRO=IqO7neK0RsSNdYjD zaw$g2sG(>JR=8Iz1SK4`*kqd_3-?;_BIcaaMd^}<@MYbYisWZm2C2|Np_l|8r9yM|JkUngSo@?wci(7&O9a z%|V(4C1c9pps0xxzPbXH=}QTxc2rr7fXk$9`a6TbWKPCz&p=VsB8^W96W=BsB|7bc zf(QR8&Ktj*iz)wK&mW`#V%4XTM&jWNnDF56O+2bo<3|NyUhQ%#OZE8$Uv2a@J>D%t zMVMiHh?es!Ex19q&6eC&L=XDU_BA&uR^^w>fpz2_`U87q_?N2y;!Z!bjoeKrzfC)} z?m^PM=(z{%n9K`p|7Bz$LuC7!>tFOuN74MFELm}OD9?%jpT>38J;=1Y-VWtZAscaI z_8jUZ#GwWz{JqvGEUmL?G#l5E=*m>`cY?m*XOc*yOCNtpuIGD+Z|kn4Xww=BLrNYS zGO=wQh}Gtr|7DGXLF%|`G>J~l{k^*{;S-Zhq|&HO7rC_r;o`gTB7)uMZ|WWIn@e0( zX$MccUMv3ABg^$%_lNrgU{EVi8O^UyGHPNRt%R!1#MQJn41aD|_93NsBQhP80yP<9 zG4(&0u7AtJJXLPcqzjv`S~5;Q|5TVGccN=Uzm}K{v)?f7W!230C<``9(64}D2raRU zAW5bp%}VEo{4Rko`bD%Ehf=0voW?-4Mk#d3_pXTF!-TyIt6U+({6OXWVAa;s-`Ta5 zTqx&8msH3+DLrVmQOTBOAj=uoxKYT3DS1^zBXM?1W+7gI!aQNPYfUl{3;PzS9*F7g zWJN8x?KjBDx^V&6iCY8o_gslO16=kh(|Gp)kz8qlQ`dzxQv;)V&t+B}wwdi~uBs4? zu~G|}y!`3;8#vIMUdyC7YEx6bb^1o}G!Jky4cN?BV9ejBfN<&!4M)L&lRKiuMS#3} z_B}Nkv+zzxhy{dYCW$oGC&J(Ty&7%=5B$sD0bkuPmj7g>|962`(Q{ZZMDv%YMuT^KweiRDvYTEop3IgFv#)(w>1 zSzH>J`q!LK)c(AK>&Ib)A{g`Fdykxqd`Yq@yB}E{gnQV$K!}RsgMGWqC3DKE(=!{}ekB3+(1?g}xF>^icEJbc z5bdxAPkW90atZT+&*7qoLqL#p=>t-(-lsnl2XMpZcYeW|o|a322&)yO_8p(&Sw{|b zn(tY$xn5yS$DD)UYS%sP?c|z>1dp!QUD)l;aW#`%qMtQJjE!s2z`+bTSZmLK7SvCR z=@I4|U^sCwZLQSfd*ACw9B@`1c1|&i^W_OD(570SDLK`MD0wTiR8|$7+%{cF&){$G zU~|$^Ed?TIxyw{1$e|D$050n8AjJvvOWhLtLHbSB|HIfjMp+gu>DraHZJRrdO53(= z+o-f{+qNog+qSLB%KY;5>Av6X(>-qYk3IIEwZ5~6a+P9lMpC^ z8CJ0q>rEpjlsxCvJm=kms@tlN4+sv}He`xkr`S}bGih4t`+#VEIt{1veE z{ZLtb_pSbcfcYPf4=T1+|BtR!x5|X#x2TZEEkUB6kslKAE;x)*0x~ES0kl4Dex4e- zT2P~|lT^vUnMp{7e4OExfxak0EE$Hcw;D$ehTV4a6hqxru0$|Mo``>*a5=1Ym0u>BDJKO|=TEWJ5jZu!W}t$Kv{1!q`4Sn7 zrxRQOt>^6}Iz@%gA3&=5r;Lp=N@WKW;>O!eGIj#J;&>+3va^~GXRHCY2}*g#9ULab zitCJt-OV0*D_Q3Q`p1_+GbPxRtV_T`jyATjax<;zZ?;S+VD}a(aN7j?4<~>BkHK7bO8_Vqfdq1#W&p~2H z&w-gJB4?;Q&pG9%8P(oOGZ#`!m>qAeE)SeL*t8KL|1oe;#+uOK6w&PqSDhw^9-&Fa zuEzbi!!7|YhlWhqmiUm!muO(F8-F7|r#5lU8d0+=;<`{$mS=AnAo4Zb^{%p}*gZL! zeE!#-zg0FWsSnablw!9$<&K(#z!XOW z;*BVx2_+H#`1b@>RtY@=KqD)63brP+`Cm$L1@ArAddNS1oP8UE$p05R=bvZoYz+^6 z<)!v7pRvi!u_-V?!d}XWQR1~0q(H3{d^4JGa=W#^Z<@TvI6J*lk!A zZ*UIKj*hyO#5akL*Bx6iPKvR3_2-^2mw|Rh-3O_SGN3V9GRo52Q;JnW{iTGqb9W99 z7_+F(Op6>~3P-?Q8LTZ-lwB}xh*@J2Ni5HhUI3`ct|*W#pqb>8i*TXOLn~GlYECIj zhLaa_rBH|1jgi(S%~31Xm{NB!30*mcsF_wgOY2N0XjG_`kFB+uQuJbBm3bIM$qhUyE&$_u$gb zpK_r{99svp3N3p4yHHS=#csK@j9ql*>j0X=+cD2dj<^Wiu@i>c_v zK|ovi7}@4sVB#bzq$n3`EgI?~xDmkCW=2&^tD5RuaSNHf@Y!5C(Is$hd6cuyoK|;d zO}w2AqJPS`Zq+(mc*^%6qe>1d&(n&~()6-ZATASNPsJ|XnxelLkz8r1x@c2XS)R*H(_B=IN>JeQUR;T=i3<^~;$<+8W*eRKWGt7c#>N`@;#!`kZ!P!&{9J1>_g8Zj zXEXxmA=^{8A|3=Au+LfxIWra)4p<}1LYd_$1KI0r3o~s1N(x#QYgvL4#2{z8`=mXy zQD#iJ0itk1d@Iy*DtXw)Wz!H@G2St?QZFz zVPkM%H8Cd2EZS?teQN*Ecnu|PrC!a7F_XX}AzfZl3fXfhBtc2-)zaC2eKx*{XdM~QUo4IwcGgVdW69 z1UrSAqqMALf^2|(I}hgo38l|Ur=-SC*^Bo5ej`hb;C$@3%NFxx5{cxXUMnTyaX{>~ zjL~xm;*`d08bG_K3-E+TI>#oqIN2=An(C6aJ*MrKlxj?-;G zICL$hi>`F%{xd%V{$NhisHSL~R>f!F7AWR&7b~TgLu6!3s#~8|VKIX)KtqTH5aZ8j zY?wY)XH~1_a3&>#j7N}0az+HZ;is;Zw(Am{MX}YhDTe(t{ZZ;TG}2qWYO+hdX}vp9 z@uIRR8g#y~-^E`Qyem(31{H0&V?GLdq9LEOb2(ea#e-$_`5Q{T%E?W(6 z(XbX*Ck%TQM;9V2LL}*Tf`yzai{0@pYMwBu%(I@wTY!;kMrzcfq0w?X`+y@0ah510 zQX5SU(I!*Fag4U6a7Lw%LL;L*PQ}2v2WwYF(lHx_Uz2ceI$mnZ7*eZ?RFO8UvKI0H z9Pq-mB`mEqn6n_W9(s~Jt_D~j!Ln9HA)P;owD-l~9FYszs)oEKShF9Zzcmnb8kZ7% zQ`>}ki1kwUO3j~ zEmh140sOkA9v>j@#56ymn_RnSF`p@9cO1XkQy6_Kog?0ivZDb`QWOX@tjMd@^Qr(p z!sFN=A)QZm!sTh(#q%O{Ovl{IxkF!&+A)w2@50=?a-+VuZt6On1;d4YtUDW{YNDN_ zG@_jZi1IlW8cck{uHg^g=H58lPQ^HwnybWy@@8iw%G! zwB9qVGt_?~M*nFAKd|{cGg+8`+w{j_^;nD>IrPf-S%YjBslSEDxgKH{5p)3LNr!lD z4ii)^%d&cCXIU7UK?^ZQwmD(RCd=?OxmY(Ko#+#CsTLT;p#A%{;t5YpHFWgl+@)N1 zZ5VDyB;+TN+g@u~{UrWrv)&#u~k$S&GeW)G{M#&Di)LdYk?{($Cq zZGMKeYW)aMtjmKgvF0Tg>Mmkf9IB#2tYmH-s%D_9y3{tfFmX1BSMtbe<(yqAyWX60 zzkgSgKb3c{QPG2MalYp`7mIrYg|Y<4Jk?XvJK)?|Ecr+)oNf}XLPuTZK%W>;<|r+% zTNViRI|{sf1v7CsWHvFrkQ$F7+FbqPQ#Bj7XX=#M(a~9^80}~l-DueX#;b}Ajn3VE z{BWI}$q{XcQ3g{(p>IOzFcAMDG0xL)H%wA)<(gl3I-oVhK~u_m=hAr&oeo|4lZbf} z+pe)c34Am<=z@5!2;_lwya;l?xV5&kWe}*5uBvckm(d|7R>&(iJNa6Y05SvlZcWBlE{{%2- z`86)Y5?H!**?{QbzGG~|k2O%eA8q=gxx-3}&Csf6<9BsiXC)T;x4YmbBIkNf;0Nd5 z%whM^!K+9zH>on_<&>Ws?^v-EyNE)}4g$Fk?Z#748e+GFp)QrQQETx@u6(1fk2!(W zWiCF~MomG*y4@Zk;h#2H8S@&@xwBIs|82R*^K(i*0MTE%Rz4rgO&$R zo9Neb;}_ulaCcdn3i17MO3NxzyJ=l;LU*N9ztBJ30j=+?6>N4{9YXg$m=^9@Cl9VY zbo^{yS@gU=)EpQ#;UIQBpf&zfCA;00H-ee=1+TRw@(h%W=)7WYSb5a%$UqNS@oI@= zDrq|+Y9e&SmZrH^iA>Of8(9~Cf-G(P^5Xb%dDgMMIl8gk6zdyh`D3OGNVV4P9X|EvIhplXDld8d z^YWtYUz@tpg*38Xys2?zj$F8%ivA47cGSl;hjD23#*62w3+fwxNE7M7zVK?x_`dBSgPK zWY_~wF~OEZi9|~CSH8}Xi>#8G73!QLCAh58W+KMJJC81{60?&~BM_0t-u|VsPBxn* zW7viEKwBBTsn_A{g@1!wnJ8@&h&d>!qAe+j_$$Vk;OJq`hrjzEE8Wjtm)Z>h=*M25 zOgETOM9-8xuuZ&^@rLObtcz>%iWe%!uGV09nUZ*nxJAY%&KAYGY}U1WChFik7HIw% zZP$3Bx|TG_`~19XV7kfi2GaBEhKap&)Q<9`aPs#^!kMjtPb|+-fX66z3^E)iwyXK7 z8)_p<)O{|i&!qxtgBvWXx8*69WO$5zACl++1qa;)0zlXf`eKWl!0zV&I`8?sG)OD2Vy?reNN<{eK+_ za4M;Hh%&IszR%)&gpgRCP}yheQ+l#AS-GnY81M!kzhWxIR?PW`G3G?} z$d%J28uQIuK@QxzGMKU_;r8P0+oIjM+k)&lZ39i#(ntY)*B$fdJnQ3Hw3Lsi8z&V+ zZly2}(Uzpt2aOubRjttzqrvinBFH4jrN)f0hy)tj4__UTwN)#1fj3-&dC_Vh7}ri* zfJ=oqLMJ-_<#rwVyN}_a-rFBe2>U;;1(7UKH!$L??zTbbzP#bvyg7OQBGQklJ~DgP zd<1?RJ<}8lWwSL)`jM53iG+}y2`_yUvC!JkMpbZyb&50V3sR~u+lok zT0uFRS-yx@8q4fPRZ%KIpLp8R#;2%c&Ra4p(GWRT4)qLaPNxa&?8!LRVdOUZ)2vrh zBSx&kB%#Y4!+>~)<&c>D$O}!$o{<1AB$M7-^`h!eW;c(3J~ztoOgy6Ek8Pwu5Y`Xion zFl9fb!k2`3uHPAbd(D^IZmwR5d8D$495nN2`Ue&`W;M-nlb8T-OVKt|fHk zBpjX$a(IR6*-swdNk@#}G?k6F-~c{AE0EWoZ?H|ZpkBxqU<0NUtvubJtwJ1mHV%9v?GdDw; zAyXZiD}f0Zdt-cl9(P1la+vQ$Er0~v}gYJVwQazv zH#+Z%2CIfOf90fNMGos|{zf&N`c0@x0N`tkFv|_9af3~<0z@mnf*e;%r*Fbuwl-IW z{}B3=(mJ#iwLIPiUP`J3SoP~#)6v;aRXJ)A-pD2?_2_CZ#}SAZ<#v7&Vk6{*i(~|5 z9v^nC`T6o`CN*n%&9+bopj^r|E(|pul;|q6m7Tx+U|UMjWK8o-lBSgc3ZF=rP{|l9 zc&R$4+-UG6i}c==!;I#8aDIbAvgLuB66CQLRoTMu~jdw`fPlKy@AKYWS-xyZzPg&JRAa@m-H43*+ne!8B7)HkQY4 zIh}NL4Q79a-`x;I_^>s$Z4J4-Ngq=XNWQ>yAUCoe&SMAYowP>r_O}S=V+3=3&(O=h zNJDYNs*R3Y{WLmBHc?mFEeA4`0Y`_CN%?8qbDvG2m}kMAiqCv`_BK z_6a@n`$#w6Csr@e2YsMx8udNWtNt=kcqDZdWZ-lGA$?1PA*f4?X*)hjn{sSo8!bHz zb&lGdAgBx@iTNPK#T_wy`KvOIZvTWqSHb=gWUCKXAiB5ckQI`1KkPx{{%1R*F2)Oc z(9p@yG{fRSWE*M9cdbrO^)8vQ2U`H6M>V$gK*rz!&f%@3t*d-r3mSW>D;wYxOhUul zk~~&ip5B$mZ~-F1orsq<|1bc3Zpw6)Ws5;4)HilsN;1tx;N6)tuePw& z==OlmaN*ybM&-V`yt|;vDz(_+UZ0m&&9#{9O|?0I|4j1YCMW;fXm}YT$0%EZ5^YEI z4i9WV*JBmEU{qz5O{#bs`R1wU%W$qKx?bC|e-iS&d*Qm7S=l~bMT{~m3iZl+PIXq{ zn-c~|l)*|NWLM%ysfTV-oR0AJ3O>=uB-vpld{V|cWFhI~sx>ciV9sPkC*3i0Gg_9G!=4ar*-W?D9)?EFL1=;O+W8}WGdp8TT!Fgv z{HKD`W>t(`Cds_qliEzuE!r{ihwEv1l5o~iqlgjAyGBi)$%zNvl~fSlg@M=C{TE;V zQkH`zS8b&!ut(m)%4n2E6MB>p*4(oV>+PT51#I{OXs9j1vo>9I<4CL1kv1aurV*AFZ^w_qfVL*G2rG@D2 zrs87oV3#mf8^E5hd_b$IXfH6vHe&lm@7On~Nkcq~YtE!}ad~?5*?X*>y`o;6Q9lkk zmf%TYonZM`{vJg$`lt@MXsg%*&zZZ0uUSse8o=!=bfr&DV)9Y6$c!2$NHyYAQf*Rs zk{^?gl9E z5Im8wlAsvQ6C2?DyG@95gUXZ3?pPijug25g;#(esF_~3uCj3~94}b*L>N2GSk%Qst z=w|Z>UX$m!ZOd(xV*2xvWjN&c5BVEdVZ0wvmk)I+YxnyK%l~caR=7uNQ=+cnNTLZ@&M!I$Mj-r{!P=; z`C2)D=VmvK8@T5S9JZoRtN!S*D_oqOxyy!q6Zk|~4aT|*iRN)fL)c>-yycR>-is0X zKrko-iZw(f(!}dEa?hef5yl%p0-v-8#8CX8!W#n2KNyT--^3hq6r&`)5Y@>}e^4h- zlPiDT^zt}Ynk&x@F8R&=)k8j$=N{w9qUcIc&)Qo9u4Y(Ae@9tA`3oglxjj6c{^pN( zQH+Uds2=9WKjH#KBIwrQI%bbs`mP=7V>rs$KG4|}>dxl_k!}3ZSKeEen4Iswt96GGw`E6^5Ov)VyyY}@itlj&sao|>Sb5 zeY+#1EK(}iaYI~EaHQkh7Uh>DnzcfIKv8ygx1Dv`8N8a6m+AcTa-f;17RiEed>?RT zk=dAksmFYPMV1vIS(Qc6tUO+`1jRZ}tcDP? zt)=7B?yK2RcAd1+Y!$K5*ds=SD;EEqCMG6+OqPoj{&8Y5IqP(&@zq@=A7+X|JBRi4 zMv!czlMPz)gt-St2VZwDD=w_S>gRpc-g zUd*J3>bXeZ?Psjohe;z7k|d<*T21PA1i)AOi8iMRwTBSCd0ses{)Q`9o&p9rsKeLaiY zluBw{1r_IFKR76YCAfl&_S1*(yFW8HM^T()&p#6y%{(j7Qu56^ZJx1LnN`-RTwimdnuo*M8N1ISl+$C-%=HLG-s} zc99>IXRG#FEWqSV9@GFW$V8!{>=lSO%v@X*pz*7()xb>=yz{E$3VE;e)_Ok@A*~El zV$sYm=}uNlUxV~6e<6LtYli1!^X!Ii$L~j4e{sI$tq_A(OkGquC$+>Rw3NFObV2Z)3Rt~Jr{oYGnZaFZ^g5TDZlg;gaeIP} z!7;T{(9h7mv{s@piF{-35L=Ea%kOp;^j|b5ZC#xvD^^n#vPH=)lopYz1n?Kt;vZmJ z!FP>Gs7=W{sva+aO9S}jh0vBs+|(B6Jf7t4F^jO3su;M13I{2rd8PJjQe1JyBUJ5v zcT%>D?8^Kp-70bP8*rulxlm)SySQhG$Pz*bo@mb5bvpLAEp${?r^2!Wl*6d7+0Hs_ zGPaC~w0E!bf1qFLDM@}zso7i~(``)H)zRgcExT_2#!YOPtBVN5Hf5~Ll3f~rWZ(UsJtM?O*cA1_W0)&qz%{bDoA}{$S&-r;0iIkIjbY~ zaAqH45I&ALpP=9Vof4OapFB`+_PLDd-0hMqCQq08>6G+C;9R~}Ug_nm?hhdkK$xpI zgXl24{4jq(!gPr2bGtq+hyd3%Fg%nofK`psHMs}EFh@}sdWCd!5NMs)eZg`ZlS#O0 zru6b8#NClS(25tXqnl{|Ax@RvzEG!+esNW-VRxba(f`}hGoqci$U(g30i}2w9`&z= zb8XjQLGN!REzGx)mg~RSBaU{KCPvQx8)|TNf|Oi8KWgv{7^tu}pZq|BS&S<53fC2K4Fw6>M^s$R$}LD*sUxdy6Pf5YKDbVet;P!bw5Al-8I1Nr(`SAubX5^D9hk6$agWpF}T#Bdf{b9-F#2WVO*5N zp+5uGgADy7m!hAcFz{-sS0kM7O)qq*rC!>W@St~^OW@R1wr{ajyYZq5H!T?P0e+)a zaQ%IL@X_`hzp~vRH0yUblo`#g`LMC%9}P;TGt+I7qNcBSe&tLGL4zqZqB!Bfl%SUa z6-J_XLrnm*WA`34&mF+&e1sPCP9=deazrM=Pc4Bn(nV;X%HG^4%Afv4CI~&l!Sjzb z{rHZ3od0!Al{}oBO>F*mOFAJrz>gX-vs!7>+_G%BB(ljWh$252j1h;9p~xVA=9_`P z5KoFiz96_QsTK%B&>MSXEYh`|U5PjX1(+4b#1PufXRJ*uZ*KWdth1<0 zsAmgjT%bowLyNDv7bTUGy|g~N34I-?lqxOUtFpTLSV6?o?<7-UFy*`-BEUsrdANh} zBWkDt2SAcGHRiqz)x!iVoB~&t?$yn6b#T=SP6Ou8lW=B>=>@ik93LaBL56ub`>Uo!>0@O8?e)$t(sgy$I z6tk3nS@yFFBC#aFf?!d_3;%>wHR;A3f2SP?Na8~$r5C1N(>-ME@HOpv4B|Ty7%jAv zR}GJwsiJZ5@H+D$^Cwj#0XA_(m^COZl8y7Vv(k=iav1=%QgBOVzeAiw zaDzzdrxzj%sE^c9_uM5D;$A_7)Ln}BvBx^=)fO+${ou%B*u$(IzVr-gH3=zL6La;G zu0Kzy5CLyNGoKRtK=G0-w|tnwI)puPDOakRzG(}R9fl7#<|oQEX;E#yCWVg95 z;NzWbyF&wGg_k+_4x4=z1GUcn6JrdX4nOVGaAQ8#^Ga>aFvajQN{!+9rgO-dHP zIp@%&ebVg}IqnRWwZRTNxLds+gz2@~VU(HI=?Epw>?yiEdZ>MjajqlO>2KDxA>)cj z2|k%dhh%d8SijIo1~20*5YT1eZTDkN2rc^zWr!2`5}f<2f%M_$to*3?Ok>e9$X>AV z2jYmfAd)s|(h?|B(XYrIfl=Wa_lBvk9R1KaP{90-z{xKi+&8=dI$W0+qzX|ZovWGOotP+vvYR(o=jo?k1=oG?%;pSqxcU* zWVGVMw?z__XQ9mnP!hziHC`ChGD{k#SqEn*ph6l46PZVkm>JF^Q{p&0=MKy_6apts z`}%_y+Tl_dSP(;Ja&sih$>qBH;bG;4;75)jUoVqw^}ee=ciV;0#t09AOhB^Py7`NC z-m+ybq1>_OO+V*Z>dhk}QFKA8V?9Mc4WSpzj{6IWfFpF7l^au#r7&^BK2Ac7vCkCn{m0uuN93Ee&rXfl1NBY4NnO9lFUp zY++C1I;_{#OH#TeP2Dp?l4KOF8ub?m6zE@XOB5Aiu$E~QNBM@;r+A5mF2W1-c7>ex zHiB=WJ&|`6wDq*+xv8UNLVUy4uW1OT>ey~Xgj@MMpS@wQbHAh>ysYvdl-1YH@&+Q! z075(Qd4C!V`9Q9jI4 zSt{HJRvZec>vaL_brKhQQwbpQd4_Lmmr0@1GdUeU-QcC{{8o=@nwwf>+dIKFVzPriGNX4VjHCa zTbL9w{Y2V87c2ofX%`(48A+4~mYTiFFl!e{3K^C_k%{&QTsgOd0*95KmWN)P}m zTRr{`f7@=v#+z_&fKYkQT!mJn{*crj%ZJz#(+c?>cD&2Lo~FFAWy&UG*Op^pV`BR^I|g?T>4l5;b|5OQ@t*?_Slp`*~Y3`&RfKD^1uLezIW(cE-Dq2z%I zBi8bWsz0857`6e!ahet}1>`9cYyIa{pe53Kl?8|Qg2RGrx@AlvG3HAL-^9c^1GW;)vQt8IK+ zM>!IW*~682A~MDlyCukldMd;8P|JCZ&oNL(;HZgJ>ie1PlaInK7C@Jg{3kMKYui?e!b`(&?t6PTb5UPrW-6DVU%^@^E`*y-Fd(p|`+JH&MzfEq;kikdse ziFOiDWH(D< zyV7Rxt^D0_N{v?O53N$a2gu%1pxbeK;&ua`ZkgSic~$+zvt~|1Yb=UfKJW2F7wC^evlPf(*El+#}ZBy0d4kbVJsK- z05>;>?HZO(YBF&v5tNv_WcI@O@LKFl*VO?L(!BAd!KbkVzo;v@~3v`-816GG?P zY+H3ujC>5=Am3RIZDdT#0G5A6xe`vGCNq88ZC1aVXafJkUlcYmHE^+Z{*S->ol%-O znm9R0TYTr2w*N8Vs#s-5=^w*{Y}qp5GG)Yt1oLNsH7y~N@>Eghms|K*Sdt_u!&I}$ z+GSdFTpbz%KH+?B%Ncy;C`uW6oWI46(tk>r|5|-K6)?O0d_neghUUOa9BXHP*>vi; z={&jIGMn-92HvInCMJcyXwHTJ42FZp&Wxu+9Rx;1x(EcIQwPUQ@YEQQ`bbMy4q3hP zNFoq~Qd0=|xS-R}k1Im3;8s{BnS!iaHIMLx)aITl)+)?Yt#fov|Eh>}dv@o6R{tG>uHsy&jGmWN5+*wAik|78(b?jtysPHC#e+Bzz~V zS3eEXv7!Qn4uWi!FS3B?afdD*{fr9>B~&tc671fi--V}~E4un;Q|PzZRwk-azprM$4AesvUb5`S`(5x#5VJ~4%ET6&%GR$}muHV-5lTsCi_R|6KM(g2PCD@|yOpKluT zakH!1V7nKN)?6JmC-zJoA#ciFux8!)ajiY%K#RtEg$gm1#oKUKX_Ms^%hvKWi|B=~ zLbl-L)-=`bfhl`>m!^sRR{}cP`Oim-{7}oz4p@>Y(FF5FUEOfMwO!ft6YytF`iZRq zfFr{!&0Efqa{1k|bZ4KLox;&V@ZW$997;+Ld8Yle91he{BfjRhjFTFv&^YuBr^&Pe zswA|Bn$vtifycN8Lxr`D7!Kygd7CuQyWqf}Q_PM}cX~S1$-6xUD%-jrSi24sBTFNz(Fy{QL2AmNbaVggWOhP;UY4D>S zqKr!UggZ9Pl9Nh_H;qI`-WoH{ceXj?m8y==MGY`AOJ7l0Uu z)>M%?dtaz2rjn1SW3k+p`1vs&lwb%msw8R!5nLS;upDSxViY98IIbxnh{}mRfEp=9 zbrPl>HEJeN7J=KnB6?dwEA6YMs~chHNG?pJsEj#&iUubdf3JJwu=C(t?JpE6xMyhA3e}SRhunDC zn-~83*9=mADUsk^sCc%&&G1q5T^HR9$P#2DejaG`Ui*z1hI#h7dwpIXg)C{8s< z%^#@uQRAg-$z&fmnYc$Duw63_Zopx|n{Bv*9Xau{a)2%?H<6D>kYY7_)e>OFT<6TT z0A}MQLgXbC2uf`;67`mhlcUhtXd)Kbc$PMm=|V}h;*_%vCw4L6r>3Vi)lE5`8hkSg zNGmW-BAOO)(W((6*e_tW&I>Nt9B$xynx|sj^ux~?q?J@F$L4;rnm_xy8E*JYwO-02u9_@@W0_2@?B@1J{y~Q39N3NX^t7#`=34Wh)X~sU&uZWgS1Z09%_k|EjA4w_QqPdY`oIdv$dJZ;(!k)#U8L+|y~gCzn+6WmFt#d{OUuKHqh1-uX_p*Af8pFYkYvKPKBxyid4KHc}H` z*KcyY;=@wzXYR{`d{6RYPhapShXIV?0cg_?ahZ7do)Ot#mxgXYJYx}<%E1pX;zqHd zf!c(onm{~#!O$2`VIXezECAHVd|`vyP)Uyt^-075X@NZDBaQt<>trA3nY-Dayki4S zZ^j6CCmx1r46`4G9794j-WC0&R9(G7kskS>=y${j-2;(BuIZTLDmAyWTG~`0)Bxqk zd{NkDe9ug|ms@0A>JVmB-IDuse9h?z9nw!U6tr7t-Lri5H`?TjpV~8(gZWFq4Vru4 z!86bDB;3lpV%{rZ`3gtmcRH1hjj!loI9jN>6stN6A*ujt!~s!2Q+U1(EFQEQb(h4E z6VKuRouEH`G6+8Qv2C)K@^;ldIuMVXdDDu}-!7FS8~k^&+}e9EXgx~)4V4~o6P^52 z)a|`J-fOirL^oK}tqD@pqBZi_;7N43%{IQ{v&G9^Y^1?SesL`;Z(dt!nn9Oj5Odde%opv&t zxJ><~b#m+^KV&b?R#)fRi;eyqAJ_0(nL*61yPkJGt;gZxSHY#t>ATnEl-E%q$E16% zZdQfvhm5B((y4E3Hk6cBdwGdDy?i5CqBlCVHZr-rI$B#>Tbi4}Gcvyg_~2=6O9D-8 zY2|tKrNzbVR$h57R?Pe+gUU_il}ZaWu|Az#QO@};=|(L-RVf0AIW zq#pO+RfM7tdV`9lI6g;{qABNId`fG%U9Va^ravVT^)CklDcx)YJKeJdGpM{W1v8jg z@&N+mR?BPB=K1}kNwXk_pj44sd>&^;d!Z~P>O78emE@Qp@&8PyB^^4^2f7e)gekMv z2aZNvP@;%i{+_~>jK7*2wQc6nseT^n6St9KG#1~Y@$~zR_=AcO2hF5lCoH|M&c{vR zSp(GRVVl=T*m~dIA;HvYm8HOdCkW&&4M~UDd^H)`p__!4k+6b)yG0Zcek8OLw$C^K z3-BbLiG_%qX|ZYpXJ$(c@aa7b4-*IQkDF}=gZSV`*ljP|5mWuHSCcf$5qqhZTv&P?I$z^>}qP(q!Aku2yA5vu38d8x*q{6-1`%PrE_r0-9Qo?a#7Zbz#iGI7K<(@k^|i4QJ1H z4jx?{rZbgV!me2VT72@nBjucoT zUM9;Y%TCoDop?Q5fEQ35bCYk7!;gH*;t9t-QHLXGmUF;|vm365#X)6b2Njsyf1h9JW#x$;@x5Nx2$K$Z-O3txa%;OEbOn6xBzd4n4v)Va=sj5 z%rb#j7{_??Tjb8(Hac<^&s^V{yO-BL*uSUk2;X4xt%NC8SjO-3?;Lzld{gM5A=9AV z)DBu-Z8rRvXXwSVDH|dL-3FODWhfe1C_iF``F05e{dl(MmS|W%k-j)!7(ARkV?6r~ zF=o42y+VapxdZn;GnzZfGu<6oG-gQ7j7Zvgo7Am@jYxC2FpS@I;Jb%EyaJDBQC(q% zKlZ}TVu!>;i3t~OAgl@QYy1X|T~D{HOyaS*Bh}A}S#a9MYS{XV{R-|niEB*W%GPW! zP^NU(L<}>Uab<;)#H)rYbnqt|dOK(-DCnY==%d~y(1*{D{Eo1cqIV8*iMfx&J*%yh zx=+WHjt0q2m*pLx8=--UqfM6ZWjkev>W-*}_*$Y(bikH`#-Gn#!6_ zIA&kxn;XYI;eN9yvqztK-a113A%97in5CL5Z&#VsQ4=fyf&3MeKu70)(x^z_uw*RG zo2Pv&+81u*DjMO6>Mrr7vKE2CONqR6C0(*;@4FBM;jPIiuTuhQ-0&C)JIzo_k>TaS zN_hB;_G=JJJvGGpB?uGgSeKaix~AkNtYky4P7GDTW6{rW{}V9K)Cn^vBYKe*OmP!; zohJs=l-0sv5&phSCi&8JSrokrKP$LVa!LbtlN#T^cedgH@ijt5T-Acxd9{fQY z4qsg1O{|U5Rzh_j;9QD(g*j+*=xULyi-FY|-mUXl7-2O`TYQny<@jSQ%^ye*VW_N< z4mmvhrDYBJ;QSoPvwgi<`7g*Pwg5ANA8i%Kum;<=i|4lwEdN+`)U3f2%bcRZRK!P z70kd~`b0vX=j20UM5rBO#$V~+grM)WRhmzb15ya^Vba{SlSB4Kn}zf#EmEEhGruj| zBn0T2n9G2_GZXnyHcFkUlzdRZEZ0m&bP-MxNr zd;kl7=@l^9TVrg;Y6J(%!p#NV*Lo}xV^Nz0#B*~XRk0K2hgu5;7R9}O=t+R(r_U%j z$`CgPL|7CPH&1cK5vnBo<1$P{WFp8#YUP%W)rS*a_s8kKE@5zdiAh*cjmLiiKVoWD z!y$@Cc5=Wj^VDr$!04FI#%pu6(a9 zM_FAE+?2tp2<$Sqp5VtADB>yY*cRR+{OeZ5g2zW=`>(tA~*-T)X|ahF{xQmypWp%2X{385+=0S|Jyf`XA-c7wAx`#5n2b-s*R>m zP30qtS8aUXa1%8KT8p{=(yEvm2Gvux5z22;isLuY5kN{IIGwYE1Pj);?AS@ex~FEt zQ`Gc|)o-eOyCams!|F0_;YF$nxcMl^+z0sSs@ry01hpsy3p<|xOliR zr-dxK0`DlAydK!br?|Xi(>buASy4@C8)ccRCJ3w;v&tA1WOCaieifLl#(J% zODPi5fr~ASdz$Hln~PVE6xekE{Xb286t(UtYhDWo8JWN6sNyRVkIvC$unIl8QMe@^ z;1c<0RO5~Jv@@gtDGPDOdqnECOurq@l02NC#N98-suyq_)k(`G=O`dJU8I8LcP!4z z8fkgqViqFbR+3IkwLa)^>Z@O{qxTLU63~^lod{@${q;-l?S|4Tq0)As-Gz!D(*P)Vf6wm6B8GGWi7B)Q^~T?sseZeI+}LyBAG!LRZn_ktDlht1j2ok@ljteyuNUkG67 zipkCx-7k(FZQhYjZ%T9X7`tO99$Wj~K`9r0IkWhPul`Q_t1YnVK=YI1dMc_b!FEU4 zkv=PGf{5$P#w{|m92tfVnsnfd%%KW;1a*cLmga4bSYl^*49M4cs+Fe>P!n=$G6hL6 z>IM&0+c(Nvr0I!5CGx7WK*Z3V^w0+QcF=hU0B4=+;=tn*+XDxKa;NB-z4O~I zf}TSb^Z;L_Og>!D1`;w@zf@GCqCUNY%N?IPmEkTco^}bX~BWM_Hamu05>#B zBh%QfUeHPu`MsYVQQ3hOT;HmP_C|nOl zjluk7vaSICyQ01h`^c)DWp>cxPjGEc6D^~2L79hyK_J#<9H#8o`&XM4=aB`@< z<|1oR6Djf))P1l2C{qSwa4u-&LDG{FLz#ym_@I+vo}D}#%;vNN%& zW&9||THv_^B!1Fo+$3A6hEAed$I-{a^6FVvwMtT~e%*&RvY5mj<@(-{y^xn6ZCYqNK|#v^xbWpy15YL18z#Y&5YwOnd!A*@>k^7CaX0~4*6QB{Bgh$KJqesFc(lSQ{iQAKY%Ge}2CeuFJ{4YmgrP(gpcH zXJQjSH^cw`Z0tV^axT&RkOBP2A~#fvmMFrL&mwdDn<*l3;3A425_lzHL`+6sT9LeY zu@TH0u4tj199jQBzz*~Up5)7=4OP%Ok{rxQYNb!hphAoW-BFJn>O=%ov*$ir?dIx% z56Y`>?(1YQ8Fc(D7pq2`9swz@*RIoTAvMT%CPbt;$P%eG(P%*ZMjklLoXqTE*Jg^T zlEQbMi@_E|ll_>pTJ!(-x41R}4sY<5A2VVQ^#4eE{imHt#NEi+#p#EBC2C=9B4A|n zqe03T*czDqQ-VxZ+jPQG!}!M0SlFm^@wTW?otBZ+q~xkk29u1i7Q|kaJ(9{AiP1`p zbEe5&!>V;1wnQ1-Qpyn2B5!S(lh=38hl6IilCC6n4|yz~q94S9_5+Od*$c)%r|)f~ z;^-lf=6POs>Ur4i-F>-wm;3(v7Y_itzt)*M!b~&oK%;re(p^>zS#QZ+Rt$T#Y%q1{ zx+?@~+FjR1MkGr~N`OYBSsVr}lcBZ+ij!0SY{^w((2&U*M`AcfSV9apro+J{>F&tX zT~e zMvsv$Q)AQl_~);g8OOt4plYESr8}9?T!yO(Wb?b~1n0^xVG;gAP}d}#%^9wqN7~F5 z!jWIpqxZ28LyT|UFH!u?V>F6&Hd~H|<(3w*o{Ps>G|4=z`Ws9oX5~)V=uc?Wmg6y< zJKnB4Opz^9v>vAI)ZLf2$pJdm>ZwOzCX@Yw0;-fqB}Ow+u`wglzwznQAP(xbs`fA7 zylmol=ea)g}&;8;)q0h7>xCJA+01w+RY`x`RO% z9g1`ypy?w-lF8e5xJXS4(I^=k1zA46V)=lkCv?k-3hR9q?oZPzwJl$yOHWeMc9wFuE6;SObNsmC4L6;eWPuAcfHoxd59gD7^Xsb$lS_@xI|S-gb? z*;u@#_|4vo*IUEL2Fxci+@yQY6<&t=oNcWTVtfi1Ltveqijf``a!Do0s5e#BEhn5C zBXCHZJY-?lZAEx>nv3k1lE=AN10vz!hpeUY9gy4Xuy940j#Rq^yH`H0W2SgXtn=X1 zV6cY>fVbQhGwQIaEG!O#p)aE8&{gAS z^oVa-0M`bG`0DE;mV)ATVNrt;?j-o*?Tdl=M&+WrW12B{+5Um)qKHd_HIv@xPE+;& zPI|zXfrErYzDD2mOhtrZLAQ zP#f9e!vqBSyoKZ#{n6R1MAW$n8wH~)P3L~CSeBrk4T0dzIp&g9^(_5zY*7$@l%%nL zG$Z}u8pu^Mw}%{_KDBaDjp$NWes|DGAn~WKg{Msbp*uPiH9V|tJ_pLQROQY?T0Pmt zs4^NBZbn7B^L%o#q!-`*+cicZS9Ycu+m)rDb98CJ+m1u}e5ccKwbc0|q)ICBEnLN# zV)8P1s;r@hE3sG2wID0@`M9XIn~hm+W1(scCZr^Vs)w4PKIW_qasyjbOBC`ixG8K$ z9xu^v(xNy4HV{wu2z-B87XG#yWu~B6@|*X#BhR!_jeF*DG@n_RupAvc{DsC3VCHT# za6Z&9k#<*y?O0UoK3MLlSX6wRh`q&E>DOZTG=zRxj0pR0c3vskjPOqkh9;o>a1>!P zxD|LU0qw6S4~iN8EIM2^$k72(=a6-Tk?%1uSj@0;u$0f*LhC%|mC`m`w#%W)IK zN_UvJkmzdP84ZV7CP|@k>j^ zPa%;PDu1TLyNvLQdo!i1XA|49nN}DuTho6=z>Vfduv@}mpM({Jh289V%W@9opFELb z?R}D#CqVew1@W=XY-SoMNul(J)zX(BFP?#@9x<&R!D1X&d|-P;VS5Gmd?Nvu$eRNM zG;u~o*~9&A2k&w}IX}@x>LMHv`ith+t6`uQGZP8JyVimg>d}n$0dDw$Av{?qU=vRq zU@e2worL8vTFtK@%pdbaGdUK*BEe$XE=pYxE_q{(hUR_Gzkn=c#==}ZS^C6fKBIfG z@hc);p+atn`3yrTY^x+<y`F0>p02jUL8cgLa|&yknDj;g73m&Sm&@ju91?uG*w?^d%Yap&d2Bp3v7KlQmh z(N<38o-iRk9*UV?wFirV>|46JqxOZ_o8xv_eJ1dv} zw&zDHZOU%`U{9ckU8DS$lB6J!B`JuThCnwKphODv`3bd?_=~tjNHstM>xoA53-p#F zLCVB^E`@r_D>yHLr10Sm4NRX8FQ+&zw)wt)VsPmLK|vLwB-}}jwEIE!5fLE;(~|DA ztMr8D0w^FPKp{trPYHXI7-;UJf;2+DOpHt%*qRgdWawy1qdsj%#7|aRSfRmaT=a1> zJ8U>fcn-W$l-~R3oikH+W$kRR&a$L!*HdKD_g}2eu*3p)twz`D+NbtVCD|-IQdJlFnZ0%@=!g`nRA(f!)EnC0 zm+420FOSRm?OJ;~8D2w5HD2m8iH|diz%%gCWR|EjYI^n7vRN@vcBrsyQ;zha15{uh zJ^HJ`lo+k&C~bcjhccoiB77-5=SS%s7UC*H!clrU$4QY@aPf<9 z0JGDeI(6S%|K-f@U#%SP`{>6NKP~I#&rSHBTUUvHn#ul4*A@BcRR`#yL%yfZj*$_% zAa$P%`!8xJp+N-Zy|yRT$gj#4->h+eV)-R6l}+)9_3lq*A6)zZ)bnogF9`5o!)ub3 zxCx|7GPCqJlnRVPb&!227Ok@-5N2Y6^j#uF6ihXjTRfbf&ZOP zVc$!`$ns;pPW_=n|8Kw4*2&qx+WMb9!DQ7lC1f@DZyr|zeQcC|B6ma*0}X%BSmFJ6 zeDNWGf=Pmmw5b{1)OZ6^CMK$kw2z*fqN+oup2J8E^)mHj?>nWhBIN|hm#Km4eMyL= zXRqzro9k7(ulJi5J^<`KHJAh-(@W=5x>9+YMFcx$6A5dP-5i6u!k*o-zD z37IkyZqjlNh*%-)rAQrCjJo)u9Hf9Yb1f3-#a=nY&M%a{t0g7w6>{AybZ9IY46i4+%^u zwq}TCN@~S>i7_2T>GdvrCkf&=-OvQV9V3$RR_Gk7$t}63L}Y6d_4l{3b#f9vup-7s z3yKz5)54OVLzH~Ty=HwVC=c$Tl=cvi1L?R>*#ki4t6pgqdB$sx6O(IIvYO8Q>&kq;c3Y-T?b z*6XAc?orv>?V7#vxmD7geKjf%v~%yjbp%^`%e>dw96!JAm4ybAJLo0+4=TB% zShgMl)@@lgdotD?C1Ok^o&hFRYfMbmlbfk677k%%Qy-BG3V9txEjZmK+QY5nlL2D$Wq~04&rwN`-ujpp)wUm5YQc}&tK#zUR zW?HbbHFfSDsT{Xh&RoKiGp)7WPX4 zD^3(}^!TS|hm?YC16YV59v9ir>ypihBLmr?LAY87PIHgRv*SS>FqZwNJKgf6hy8?9 zaGTxa*_r`ZhE|U9S*pn5Mngb7&%!as3%^ifE@zDvX`GP+=oz@p)rAl2KL}ZO1!-us zY`+7ln`|c!2=?tVsO{C}=``aibcdc1N#;c^$BfJr84=5DCy+OT4AB1BUWkDw1R$=FneVh*ajD&(j2IcWH8stMShVcMe zAi6d7p)>hgPJbcb(=NMw$Bo;gQ}3=hCQsi{6{2s~=ZEOizY(j{zYY-W8RiNjycv00 z8(JpE{}=CHx0ib3(nZgo776X=wBUbfk$y2r*}aNG@A0_zOa4k3?1EeH7Z43{@IP>{^M+M`M)0w*@Go z>kg~UfgP1{vH+IU(0p(VRVlLNMHN1C&3cFnp*}4d1a*kwHJL)rjf`Fi5z)#RGTr7E zOhWfTtQyCo&8_N(zIYEugQI}_k|2X(=dMA43Nt*e93&otv`ha-i;ACB$tIK% zRDOtU^1CD5>7?&Vbh<+cz)(CBM}@a)qZ^ld?uYfp3OjiZOCP7u6~H# zMU;=U=1&DQ9Qp|7j4qpN5Dr7sH(p^&Sqy|{uH)lIv3wk?xoVuN`ILg}HUCLs1Bp2^ za8&M?ZQVWFX>Rg4_i$C$U`89i6O(RmWQ4&O=?B6@6`a8fI)Q6q0t{&o%)|n7jN)7V z{S;u+{UzXnUJN}bCE&4u5wBxaFv7De0huAjhy#o~6NH&1X{OA4Y>v0$F-G*gZqFym zhTZ7~nfaMdN8I&2ri;fk*`LhES$vkyq-dBuRF!BC)q%;lt0`Z(*=Sl>uvU`LAvbyt zL1|M@Jas<@1hK!prK}$@&fbf70o7>3&CovCKi815v$6T7R&1GOG~R4pEu2B z%bxG{n`u$7ps(}Tt(P608J@{+>X(?=-j8CkF!T79c`1@E%?vOL%TYrMe1ozi<##IsIC1YRojP!gD%|+7|z^-Vj$a85gbmtB#unyoy%gw9m1yB z|L^-wylT%}=pNpq!QYz9zoV7>zM2g2d9lm{Q zP|dx3=De3NSNGuMWRdO_ctQJUud?_96HbrHiSKmp;{MHZhX#*L+^I11#r;grJ8_21 zt6b*wmCaAw(>A`ftjlL@vi06Z7xF<&xNOrTHrDeMHk*$$+pGK0p+|}H=Kgl{=naBy zclyQsRTraO4!uo})OTSp_x`^0jj7>|H=FOGnAbKT_LuSUiSd3QuCMq>sEhB=V63Nm zZxrtB0)U@x2A#VHqo2ab=pn~tu>kJ;TVASb_&ePAgVcic@>^YM?^LYRLr^O12>~45 z-EE?-Z$xjxsN92EaBi)~D~1OzRVH`o!)kYv7IIx??(B)>R|xa&(wmlU2gdV0+N+3% z7r$w5(L<|?@46ITJZS5koAELgVV_&KHj(9KG??A);@gL`s1th*c#t5>U(*+nb0+H% zOhJG5tth59%*>S~JIi%<0VAi;k>}&(Ojg!fyH0(fza!1kA~a}Vt{|3z{`Pt@VuYyB zFUt(kR$<`X_J&UQ%;ui2zob1!H{PL8X>>wbpGn~@&h__AfBit)4`D^#->1+Qn^MH9 zYD?%)Pa)D-xQzVGm!g)N$^_z`9)(>)gyQ+(7N@k4GO?~43wcE-|77;CPwPXHQcfcJ^I&IOOah zzL|dhoR*#m5sw{b&L=@<-30s9F|{@V05;4Wf6Z_1gpZnJ*SVN}3O7)-=yYuj2)O0d zX=I9TzzTK%QG&ujvS!F*aJ8eqt4|#VE;``yKqCx7#8QC7AmVn+zW9km3L5TN=R>{5 zLcW`6NKkTz`c{`-w!X9zMG;JZP|skLGs7qBHaWj7Ew!VR=`>n30NX)7j~-RbDmQ6b zHr)zVcn^~e2xqFCBG4P$ZCcRDml-&1^5fqN=CHgBVu1yTg32_N>tZ;N%h*TwOf^1lE#w1$yF$kXaP|V$2XuZ+3wH4Ws6%U;^iP|c6`#etHogQ+E@+~PZ1zdGAty6qTmBM z>!)Wfgq~%lD)m>avXMm)ReN}s9!T_>ic6xA|m7$(&n(Z&j} zHC=}~I(^-*PS2pc7%>)6w}F1il&p*0jX1z)jSvG%S{I3d9w$A|5;TS)4w81yzq5f8 zZVfF~`74m1KXQg|`OS>;FCgZw!AL;2PV{&8%~rG!;`eD=g!luE0k40GjIgjD!JSDNf$eW zZtPMF)&EH_#?IwVLEx&Tosh9K8Ln4Pb$`j2=><6MAezsQvhP#YNnw&cL>12xf)dPz z1tk;{SH6HDcbV0x(+5=2n;A->&iYDa5Zr9$&j?2iAz-(l1;#Vc3-ULyqRV9d0*psG7QHE! z*J=*^sKK?iTO$g*+j~C?QzzIu`6Z{2N-ANrd5*?o%x& z&WMin)$Wq%G!?{EH(2}A?Wx@ zn8|q7xPad4Gu>l^&SBl|mhUxp;S+Cb125`h5aBz9pM34$7n-GHGx*=yqAphZKkds7 z$=5Jnt*6&8@y80jNXm|>2IR<$D5frk;c2f5zLS5xe*^W>kkZa5R1+Am34;mo{Gr=Z zD=z8fgTHwx%)7hzjOo9*Cogbru8GgDzrE;3y%TR+u`|zz%c0Tyd8;#EQXdr4Rgx(2LPRzVI2FwsbXwnF;DP^fg zdYOd|zU&AqgCJ;R+?oSgEgZM`ZX>7&$A-j2m|Tcz4ictXoQkz6Tr<2zhOudU16k<7 zLdk&FCL>=a^>0gV@m#9SnMd)R$5&1mh8p2McnUbk;1|C;`7pPkYjf|o>|a6`x`z1O zt>8~Q%zHX%C=D2!;_1eo3qfbB4QQK^{ON_f*7XhLk{6sr2(KIVmax}fUtF-zHZiUd zHPb9jidV`dE;lsw?1uQH!b%MvPE|lh9-8R_z4^PC8{XAf?S73(n*FvYPoMES+LfOx zcjm4ZZOmKY>M2e${QBVT+XnBQ(oC0fAYcXi7+=}_!hS9m>Y%G@zxn3z#Pb;bJ~-kI zAHNmWgQJp$e8L-uKQ|c4B;#0BTsfRB+}pl7xe=2_1U7pahx5S$TVbRnU0oi1?Wh|A zR7ebg9TK1GgKa4@ic#q_*<;c8?CkjX zMMyq`J()_&(j-FZY7q%z6CN^a0%V{UL)jmrvEg{doZd?qIjgJ^UPr(QUs`68;qkdI zzj_XBQ|#K2U!5?fmIEtXX6^rFY;h4=Vx<-C(d;W6Bi_Xsg{ZJPL*K;I?5U$=V-BNP zn9pKiMc=hZNe**GZBw1kVs#-8c2ZRjol}}^V@^}BqY7c0=!mA;v0`d|(d;R-iT|GK z>zt>Tt3oV09%Y;^RM6=p9C-ys_a``HB_D-pnyX(CeA(GiJqx7xxFE52Y`j~iMv;sP z%jPmx#8p%5`flAU(b!c9XBvV+fygn`BP-C#lyRa;9%>YyW6~A_g?@2J+oY0HAg{qO znT4%ViCgw&eE=W8yt-0{cw`tMieWOG3wyNX#3a^qPhE8TH1?QhwhR~}Ic zZ^q$TF8$p0b0=L8aw&qaTjuAYPmr-6x;U*k*vRnOaBwb_( z5+ls5b(E!(71*l)M&(7ZEgBCtB{6Kh#ArV4u0iNnK!ml!nK5=3;9e76yD9oU4xTAK zPGsGkjtFMMY3pRP5u07;#af?b0C7u) zD^=9X@DRasHaf#c>4rF5GAT!Ggj0!7!z?Q-1_X6ZP2g|+?nVutp|rp}eFlKc8}Q&_ z17$NpDQvQolMWZfj0W0|WKm`nd_KXYH_#wRRzs1aRBYqo#feM}a?joONn30Z4Z9PG zg1c!_<52-9D53Wq4z8pUzGkEFm1@Ws(kp4}CO7csZ-7+b)^)M)(xo}_IpTLl7}5BmbBCI{4>rw>4c_gBQHtRd5Z=SW&6Qp2qMOjr3W+ZRmP;S(U+h=^BHKohhRp6Zgf zwt&$zQXhMm@kh1@SB%dIE*kFDZym3Mky$NRljX?}&JGK`PIV1C;Pf!JV{hb4y;Ju- zlpfEPUd+mV5XQH<#BRFhZ}>b#IdF?a?x;rBg-v)@fZpA?+J{3WZjbl3E zv(a&1=pGYPxP@K!6Qg5Vx=-jwc=BA{xL3+QWb&9~DGS1EFkIC+>55{dvY4LV@s5$C zKJmCjigp7?m27*GN_GROz}y+y5%iIj=*JTYccaFjvD&VN%ewfSp=0P zspdFfDqj?gs!N64cEy5uR~wD>af!1PE*xo{^a^8BPIL2=U>B!m2AM0Jf<8qWLoHxi zxQfkbbwkRXgJgLW_j{ZkCxHLBU{@D6T5u90UNs5P769Zei|C$@nA5$L$4ZvxQl1i? z8vLHg17}e{zM$=&h%8Swbfz7yw~X^N|7Chp1bC(oV72l#R8&%Ne5>F=7wR(dB; zkDX!%&fxS19JBjP<6H7+!dO`nPLvB~xn{aDh#^iHKP|A5UQlCG%v%x9@q1w2fa#&% za^UwHu!~(qrv99G%9_e4OBbJ-CkB*1M_?t6UXZ#}4JFDzB|x(1Z}ckuiY}${zj`eVo})!rN8Je z%h2CVJG1$K$2deXx^h8trLs~Han^e>_-M6@0o4C7d548|#mKtm@DvdVAX5ZzA8=*! zKq5C+cM9u)qJ%YBJ1UAcG}6Ji4=$piaZ(K@>1BiD;$R9bR*QP`dH2T=)dgW#f7U)S zZ~i#VYLOnUZt^~Iu3x8QPJaHVUxtRyipQ+tbmWKl14iW1!f6JSDvT$xt8>~7-1ZlJ zU|)Ab*lhvz-JO!$a}RBH9u8$=R)*qeD@iS@(px~OVvML-qqO5&Ujnhw1>G~**Ld{W zE+7h|!{rDZ#;ipZx4^Tcr9vnO)0>WFPzpFu*MYST(`GFzCq*@Gqse6VwDH#x?-{rs z+=dqd$W0*AuAEhzM@GC&!oZa1*lRsx>>mP>DNYigdm^A~xzo}=uV$w#iadO+!&q_~ zT>AsHXOEGsNyfcJt2V$rhGxaIcTEvZr7CMVEu=>l30N~52^71U^<_uw6h@v@`BA2! z)ViU+wF#^$=5o44TpOj?#eyq*+A&c0ghrt8%}SiK)FgLk-;-^+ zXt|1}1vcKAAuR|?L*a8;04p%!M~U2~UC-OJK)DMtBQ#+ZttJgDFNA4zchA*T)cN(E zmpIMLU*c*NrCSV^qdLXD751DsO`#V#K1BVX4qI-B3Rg(zcvlg^mgY^V3Q*5RRQ4-8 z_kAlUisma2SNEx47euK5Y#eu_-gwRW0}M90hEI}eIJ9aU?t11^jSCn4>e~XLSF7Y3 z7JF)1ZbS_P<$<#y(*u@w!jF4FW_f~bxzi%cgP~B1K5N6GFYSAf=D_s5XomU0G9I%Y zPWc{&MItPR#^Le)?zsRkQMmHx^Cnn&;TrPzRVG`wyNH*U;|r3^2NY(z0lwikP}cWF z`p%R@?dy*7H~0&3ST>L9)b7#kwg+|n0#E&-FNf+Z_t7tpa711FogBPV`S3MW_FMGQ zJ@8Z}qXR4-l%p76mvcH`{Fu(^O;8H2@#LZUH#9p6!EX$AEYV$c`s zkPimL3kv>y=WQ+?KIAuim``%cAeBhA6g8}p_*FBH(#{vKi)CIz_D)DFXPql*ccC}O zRW;+Y6V@=&*d6QJUbRxPX+-_24tc-hYHEFaP-IAj*|-P5%xbWujQvu#TF>xigr_r! znuu7b(!PyYX=O#>;+0cGRx>Sy39(3y=TCf_BZ$<%m#inup$>o(3dA1Byfsip8S975-iVe7UklFm|$4&kaJ!n66_k-7-k}Z_?){LQe&wTeJ^CR{u6p+U#4_iSZZ1wjB-1gVGNQqnkk*-wFLj(eK8Ut{waU zb1jwb2I?Wg&98jSQWom8c?2>BWt*!3WQ?>fB$KguB9_sStno%x=JXPEFrT|hh~Po2 zSPzu3IL10O?9U(3{X8OLN-!l6DJVtgr$yYXeAPh~%(FECDe;$mIY7R4Miv1GEFk9x zpw`}E5M)qTr60D^;a#OCd0xP*w8y+my1^l8Qd*V`wLoj)GFFj;;esW2PMO=sbas{yX6asXIJ$|LW< zts$A+JaxoM({kv+2d@#bhl?#V#FZn_=8tTTvup?Vq!p!46W{be)EP=VlYE|UzAU}) zz})UzJVWi;9br0k&5>}sqwa_`TP*c}^$9+q)Dks#qEVg>p)71sqKF-YLP@UF{(>lp7;CHAWK;K0TZ_+?>EtZKprfU@;52a1IU8HNx-mnoZrb8| zP8FPb#T$0VE+G-l508;d{DSfC6#dbp(j|^i^I3z9?Qmkr+(dw^w??h}WTN{_ls-GuE~lF;1Urgbtq|Ud_r>wecb@?{{z? zX>X$&Ud+(I(5}5d^>&Z2m+qy=h#vR*lS084ATwUWZLg6PX1Ft+YI`0iI)ynij}{4X zrQE!Mr1m^-?kw<|VT0mG+5J{!;j;zJT`?_=P*09n+=e``CN|7rC$u~Ksg7LSMS(Q~ z51!n1htcK0q7*K-*u0?c8ZlvPXcNwXmFe0Or2}}R@?j@{ECCNZ6va1tZ>|ZOgGZ1j z9?mRkeSK%{X4O>J$@hyFsD)7s67Uldb>O93wQQiV%-FfbEY_@q>1VUstIJs|QgB`o1z**F#s z^joAYN~5{EQ_wZ~R6-nEV#HsQbNU59dT;G zovb$}pb=LdR^{W2Nh~8yWfq*vC_DvJxM=)2N`5x+N6Sl`3{Wl@$*BYol#0^idTuM` zJ=prt$REkxn6%dimg%99{(Dt6D67sTUR6l1F@9&Z9<)XgWK#x zVohUH6>_xRuw1^V**+BCZ@dZj97T*67OBO>6UUivH`<@ray~ym^E?bO=vKqFfK3Kv z`RKxs4raHacB<(XAeH`@0G*K2@ill_U@m=icT@F{k1PU3j4VBde`ThtW8%Z~A>)45ARjQCDXbH}_rS^IxHGp#utBEj3W3KSAU+$6I4s~9OWueETo!J-f~+DV8< z+VMtdcQ?M+?S}kl&uImYiIUJ-K0-te7W4sdWpS6Fqs-I!Tj{8Qp6lMn$Zm8uU)s{X z8|O}HN%8sEl4em&qv{VBq{}$@cCG{B z5~3DY$WRYSkO~z=sxRct5^G5bPZW;LF)(zY)HREgpRrkYV@H3^BTD6u+bJE~$cqr< zw@Gb3^|n*kHZ%Vnu6~B7pB4iM0C4kDuk8Q1R^<(x%>|sCOl%CTe^N)K?Tiepg?|#m z94!og0*38u|67h%*!)SJhUdvFimsktaqp#im9IpH-$fQc79gi259qPkEZ)XU?2uWW zRg?$8`vl;V%-Tk+rwpTGaxy)h%3AmF^78<#i+Q6~M4#>J4`NNEEzy~xZ&O*9q%}@7 zs9XBO#vSKSM<-OjPIDzO9JiAYFWrK14Am{uZT=S3zaCu~K%kZo&u*=k9L#xi6vyaG zQFD76MOE&=c1G;7Zivp<%%fRq+@3wgZg>k@AYQf|*Qyzy$tqc20m?F5nGbG@V#gW` z8RMb2oBxgiqa?)_G6&-;L#(HCoaJrs_ED{IUZ^$~)+e#0iZT!AJDb2V{Sen*70TO& zyI`*~#ZdLFhYP_#DTuoqQ0OS6j0o15r{}O&YoT5wCp|x_dD{#Y;Y}0P1ta?2VEh4* ztrRN5tL6UvoH@M9L z=%FKpf@iSp2P>C(*o<-Ng4qF#A?i!AxjXLG8%Gm`$rZxw;ZqSvv5@@sZ|N*~do5fb zKWR)T_>`kxaS|MHFh`-`fc`C%=i@EFk$O&)*_OVrgP4MWsZkE2RJB(WC>w}him zb3KV>1I&nHP9};o8Kw-K$wF8`(R?UMzNB22kSIn#dEe|V-CuMw8I7|#`qSB6dpYg$ zoaDHj%zV6*;`u`VVdsTBKv&g75Q`68rdQU6O>_wkMT9d!z@)q2E)R3(j$*C4jp$Fo z2pE>*ih{4Xzh}W+5!Qw)#M*^E(0X-6-!%wj@4*^)8F=N*0Y5Or+>d= zhMNs@R~>R9;KmyP@I@bpU3&w?)jj0rGrb@q)P>wLVbz1!TZY$#+H-mK6B^0{vdvt0 zaJ0~7p%I#1PpPm1DvBzh7*UsCl^I5^`@XzPzbg+v3T_WyKN?TJ9J=57v^IUO`aQN} z@>Y>WIj+gT@-sobU-tW%L5GP(qY?Eep&I;@osY}O*3i1Ar?Sv|EI6S-pK_!~*A$K| zs-hHESqd`vv;zIzgv2ho5-hsIL5Ke~siJ(v0`Qm7W_Rms2rB67=p&HGRhA-)$p-BS zvXSmgGIGgeJMBcsgp=L8U3Ep$VPBFhvJ!3M5{pocGBS~iZj0({9Jt9nbC{Z$LVb%= zGqzRBjlqkAU{#sOX56})^QjX;jQ26M`poAFIZ#H31td9sQlgBBrfIYgDC9+kO~}s{ zb1i*{#{5tPWhv4pecAZygXG>?5xKx7iPXd?nR;QaIfhlhqNBaLDy>9Yd1Sf3P!s4~ zhfHaFGsIFy&ZM=6^qc>>V>o!zk%5Lk5BtS7oU=YfjWUN;c zrh$6Cyr%KC@QNTzTZvb)QXQkV)01MEY+EzC%CJx)Q&6MM={paB}Dp=qCn^eJ}5LeXG9Gqynt0ir>DvSIZ=i?*_xR3=% zppf1w51ypF2KL6ug zCm}eCi>&>xT;Idzh^PmtDWrU(&eC2hAt(nmd#?;W)*&4lb2Z2Ykv*XLNDEm`_1n3C z`l!wZwiF9b?mN@z?s~>v%hT01C{E3md6M5_Xi3fKD6s26Tt~Z>8|~Ao9ds!cF_Y1| zRG>!=TD0k0`|T*)oX!SlSt8g4Uh@nc(QosCoen@i*ZCSyh|IliliuhEw$8?4ZL9N2 zMQ%%S=3Tj_QilhHW@cSr1UYTtDem{A-ZxyCa$K9A%(!`X_?ieJzXbfERST|JxqmbL zHe!hSqYk|!=!$8CJ5>q}Pj63@Q#PO{gpVb+0-qHFM`j5x_s#~dxvy5u62vywq8upP z_)N)3n9cn7YEf2D8L}x0#_B_~>HT8;;8JC5q+}1gEyd%XqYvY?deQzwD1Lx{ghI3; zv?f;&6CY$H&dDL$k#)hb)5lIqUZ~oU!z)hMI!B9THhw?9!}ykqpFJ|hB?JjV9uwqb z3_70pMV^C7I<3Cg&yMi8JJ3V2gYTOMV=IopfZ#1o>&+j-mB-V${Ok(f?I3{+vR~zE_RR$?9xI~^% z53~ z&bCl+6UeKkUWJ-%mnK{9K>?(3BM3C`@xi}v8)q#;YJhMr5dWvMtAL7X``!bHv~(%m zH8d#Q4N6G~lEW}aGn9ZZNT?v9bV$emf)dg#ASDV?(nu+wpu!_X;(vL<<1zBo-~X&N z>keyizVGaP&c65DbIyEwFn2%(L`P424ZI3nFBA%w{yJ?E} zlwSKF;jIhs(!TFOdMUW|(=qHjr#U-k>`>1u1_yL5Gyy;7@WTOt_)nfIp{D9kwR8f0 z;^Fq=iF(&yd|z30&+I`FBM-P6ouHQ@96TkIe@9=pDDL#_zgXos)-ri5lX-&2D~DsI z4R>xVM$c&aFLgFjwq{1I;jpODOx|n*#@e2+Wgdkm(E(Fad_)peD`1^CJ2TpglmgoC)F(Z)F7y2rzzDU^4wvO{bzw{mzSs4tF;*qabKkC?D!j!tbF z4D_6zbqFVI>n@2-Qmg1BiDdD}>E(72)aMv1Y9duOxwlG|E!L(QmQ#j5vmN@a7v{zIt3qQSP?96^$ITE=h~sLn|N|v8YqmA~-0HWgcPHZ@!3Dzm2X{Bozc{qm>J`Ehp}`FQ%Ecbw%+|H8f`pykvo-%&0a z?&ZtJF*{#AYs8Z|z(IFI8sBiZs)L!C9#1W@;hEInZZZdPz2ZnmhoSP9VHQt7mzZUZ zhM!!5IJbe4Z@zEoMjKaxH&Px8p}1<0YmtWwcG@ZPY@*oQSteU zRy+W=Rs>sJ##v^8EJJt0=5---o<@^?fOEp=N<~xXvcf?$gXD0zVHziRMMmC#Mp3o ze(eT!dvjmXp9_C%pV_>{H=nsqYO)n1J?Ihi zjy7f00`|S<;)I!ZyUO{~#+wXX)z(BWsN|$7n9s}H%ZzE8YQv#vRTHjq@D%tYyfe=3)|7jYxRT#E16nFk&1jFC6CH5d4kiJCVq+%r_$Rec7=G!GuZ-0*$5N2GqXB(dqWPS1Um4{xgi2k=;eO_LDy&GR=Q!)bjKY{f!0yoc0Rol&!E`2BkI$5y4U^*k0=GyL-m8XJL%8prM%;fwyX9M^ zs48n3Oh#a>FVWI7dsm~*l0$^J)lxnfTTw~1ceZ73yNvNurwd`;+^1XuucaFN85M8? z$fNl!D9g*O>6IE^POaoDq`86Sw0t4%jIi`&*EEZI?wwOiEvH8(qpfyDvAe`4pWf7k z3-pFgeT{qtj)B!1ZamZ5g3z6Nd40P(%^Kf@#!uzbIk~8w`9wbhWc~1E|sw6-FsOqrhb2DLDwlaq@)Y zAi$KoA=Vyn=Yxqxtf7wu*$47Ht>WZi{AdeN79#9ws~CtE;~gC$q7T>*5yKK3VT)Q=sllRR}lBIGd17+bOu| zeUeUrMgF=Gjk-{epAyUd_KNgwZK_Pz=H$+{4~E_ZRa3IJpU~IZ5U4Z3l%u3{Ls~`H z(iysmm+!HBJTC-$EpHM9yrXUM^_FZ(3sdmsyZ6=lU8bb3V(WK>P0$l~#QA&NMj@OA z*OQ>^-s_D-bda022~!G!bTh7@FR>t!1r`Js1;4$(^_*hH-_pUPf5C}K-v$%i#KBB! zU{~a7)R>ix z#LA|<6v#rwKkB1JBLWkWu#M0#8i1J0e4dFDP3jrlFfxhkDs%Q~)e6e7fR$U?e$<{x zfZb0?UMsB|E}Fk)@|^{)_^L7O%rp1GRNig@bUX(^6}6HoGi8IXoSKpI1A(GV)uA=7 zOXG&KjZYVjYn6}2YV0yfnKsnpDlF)h$Gv--|6$BsWFg|IWnp|#sk}zOAb6Bb?vb@t zs^7=4IdiKE_rUT@rG!D4Zy zcnas#XT77V&%igMXY(lQS|)lgO{pN9!P-94KeZH_+PK5jESYCSPMN)=D(JIAVeB%D zI_>_lvD;pylkZ#Ral0IzC6ei$J$4NnGw(pnVd`&aaNT5mfq-4)aPjj(v;`VvJ6Xxjm@3DX+Kju z@9-h++s7x>idTEL zd)ptYy?P2$S*_DI;eMR0ZdAuS)~fGEZEguO&+3AwW@Sw$&KvgJr6aGK*Ar;0wx`lr z7V&!+9C7`VcV^t+Wj~AweOGQL!)0)serr$8Fez7kC(VSVRdjqpQuq964RW^2euIre zh10&Tv)|dj*CoRozrW<4y_+5}3EGRok+G7ODl3-CF1r?JYDdw&NbcVT=7ljq_K+8bMeG3uRw@3=cof?j+v+WaKI`WqwByf#7aFK3 z0+R34xQ-6nxQ&9xJKl}`C9FlUe1-h^i?5fr5kjot#MA-$%k106t>*gM+yF3m2X#=1tt07`cK)37dA^A4d8%6R>@0U-UZ~wSvzMlK$tlm~aK`%e8|quXyH`aLM0#Dcu%sqEsKV%i zVn_*W-Qbnl)h?RP>)$rZ5JL!*H;Z{ zk7(FB`lo~h&zB|S6j-Na;y$QM*rn^tkO{>#DWZN@IwJps3*Nm&ox0{{;=J~hvPb-* zvAOEPImrdq()yl~`j`Q;R1Y%CdLKKw*;gtNaM~WDO95YXsTjKCOdRD2Is@aVRTYFD zpS=_EB!@Ub&c*JmNMF=F+)Bq)52|=83IEG;M5(Ol*97!W(S-5X-5w&7->`1Pw-0Ml zpA>jaofnyPQTCzoIG}OK9j^nn>F>jC#$iSnJY8y6ue4nxs@3HtfNx01XVK7NcX#Cu z34g-z=0!7ip&@wI>>6ynJYyFTEgH6DA?b>~V%2s_@NPDza5&6cno!S(|85*74}6_M z%s1c4`B{lqMu``(4~Jk#_`^=tu36TgXPv_}{lhhyi(rrSM_uoVVNuZOuxCXom9|wg zNf&BtzX=hVi*4dG&1J!^QW;O%fQ$jVH=W74B8WR)*tM1{(@cHRqiS_W6R^h8uxd@zV>KNI zR(-LNNkLqh>e=CmL|q9sRHm#15%q$o7_GQMp8FLX-HGnJ<+(;k{Q%+Sk+!^mM+2#1y9+gG2IDZGt%;Cfk{+ zT5}^x=!i2$tnH_se6eC zkn;kK>%ICpo=X&=cSsbxQ|AjJ;5Ff;AyIj>$YA8cw*?W^Nn}S|1jrbf@Bd zr82I8KlOh4#5C0sw3oVvuC0NFPKH4S0$~F$U4JM1Im$B%%oGm_5$Lnr{#Pv}eL1k& zMP(pG$MI^8&!nYffq#$zJ^3GF|cC%2d4V@qKV#fu6u2O

k)oKu82Fu=RODzQrHPEC+Mz{hW(G7VuCl8g1ou-Ot!41bp_>OC1&@A_6e*hc)1X zMuDvzEZyB*fW1^+7dL0%ofr;-xT6B@0~|VazatI{60!X=po^uOr6UB$1POKmuI_&b zOL&O+w*!>`k+y%?Z|wm4$@_1|WC|pKM(F{k8TR$-4hs?i|GBc9)qa{vYq)~5qa(2N zsR?s}0Pp^ufVGEB8oE9VCFa0K$x0HSpem!tIyR69y0rnjg8cqjmWyz7*Kx3~X> z|BZX}Y;oVB1HX@l9_-y7dI*WgruY@?rC&64`}3W`ECA>O@Y#Q@JS<4WBF(QbwJqHM zt)fE#6jTSyZ^E8y0INaIf!omWjvS=@15`O%V2CKg+}z=M9##kLKRN0uJuK250bXVU zwzT&n@30^dzKnlL^us;wClg?CKWEtiEb#zhPVx{PxFQiwEPp^C53zN21EdZAz?3D& zC6fK|_!S5Mq&0z;xWGLEv}!zjfpRg_orp7|fXMx=uP!@X`yT@5(N_Hza}p5fBk&|)J7fZ`NQ9Nz@5xT? zi?iV$q+bG!2LZUpF)>Yl!u;DEHV3!i{ipcJm_8Gj@Dac%N3|SQVGqRhrJ;WOR|CtrwzPTW^&$A6!A$E)h7xohm>hA8p{PUZ~ z_&zeg@OL3PxPtzkfsNZAqXCZ8Is7yQ+plm~8;}|~DEkv&f@?q5hB*OGQYXuwVQOp0 z?QQ`6qyp|-$47wjuV74IE_x2I17$+grwMBE^25d<5!lYhnszuh|5Yk;RB+Uk*hk=m zu73=E^7ul{40{A^?Rg^fq0ZfZO@C1HupR*_d;J>lkFv6&x&}4N;t}1T@2}~AC^<3b zA}RxFPPZe5R{_6dIN9N-GT29Oa}RzA2ekKuEVZbuMOB?Xf**`N5&m}?)TjigdY(rF z?~+a=`0);TlDa1j)1G`AfW? zRl883QPq=w zbB|bHEx%_u*$t@Yl#Vc;y*?2W^|^NJ)DmioQFr~1&>MSBL_b(YIpGWdDm3bT=Mgm1 e+h0K+-~H6qzyuy}`;+tYAZFmzUSVSYum1yJqxCBQ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2617362..0000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/src/main/java/dev/xkmc/l2core/events/BaseJsonReloadListener.java b/src/main/java/dev/xkmc/l2core/events/BaseJsonReloadListener.java deleted file mode 100644 index 7cc53da..0000000 --- a/src/main/java/dev/xkmc/l2core/events/BaseJsonReloadListener.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.xkmc.l2core.events; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; -import net.minecraft.util.profiling.ProfilerFiller; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Map; -import java.util.function.Consumer; - -@ParametersAreNonnullByDefault -public class BaseJsonReloadListener extends SimpleJsonResourceReloadListener { - - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); - - private final Consumer> consumer; - - public BaseJsonReloadListener(String path, Consumer> consumer) { - super(GSON, path); - this.consumer = consumer; - } - - @Override - protected void apply(Map map, ResourceManager manager, ProfilerFiller profiler) { - consumer.accept(map); - } -} diff --git a/src/main/java/dev/xkmc/l2core/events/EffectSyncEvents.java b/src/main/java/dev/xkmc/l2core/events/EffectSyncEvents.java index 0f2646e..2caf62b 100644 --- a/src/main/java/dev/xkmc/l2core/events/EffectSyncEvents.java +++ b/src/main/java/dev/xkmc/l2core/events/EffectSyncEvents.java @@ -2,10 +2,9 @@ package dev.xkmc.l2core.events; import dev.xkmc.l2core.base.effects.EffectToClient; import dev.xkmc.l2core.init.L2Core; +import dev.xkmc.l2core.init.L2TagGen; import net.minecraft.core.Holder; -import net.minecraft.core.registries.Registries; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.tags.TagKey; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.entity.LivingEntity; import net.neoforged.bus.api.SubscribeEvent; @@ -16,20 +15,19 @@ import net.neoforged.neoforge.event.entity.player.PlayerEvent; @EventBusSubscriber(modid = L2Core.MODID, bus = EventBusSubscriber.Bus.GAME) public class EffectSyncEvents { - public static final TagKey SYNCED = TagKey.create(Registries.MOB_EFFECT, L2Core.loc("synced")); - private static boolean isTracked(Holder eff) { - return eff.is(SYNCED); + return eff.is(L2TagGen.TRACKED_EFFECTS); } @SubscribeEvent public static void onPotionAddedEvent(MobEffectEvent.Added event) { - if (isTracked(event.getEffectInstance().getEffect())) { + var ins = event.getEffectInstance(); + if (ins == null) return; + if (isTracked(ins.getEffect())) { onEffectAppear(event.getEffectInstance().getEffect(), event.getEntity(), event.getEffectInstance().getAmplifier()); } } - @SubscribeEvent public static void onPotionRemoveEvent(MobEffectEvent.Remove event) { if (event.getEffectInstance() != null && isTracked(event.getEffectInstance().getEffect())) { @@ -37,7 +35,6 @@ public class EffectSyncEvents { } } - @SubscribeEvent public static void onPotionExpiryEvent(MobEffectEvent.Expired event) { if (event.getEffectInstance() != null && isTracked(event.getEffectInstance().getEffect())) { diff --git a/src/main/java/dev/xkmc/l2core/init/L2Core.java b/src/main/java/dev/xkmc/l2core/init/L2Core.java index ae65104..b0625ed 100644 --- a/src/main/java/dev/xkmc/l2core/init/L2Core.java +++ b/src/main/java/dev/xkmc/l2core/init/L2Core.java @@ -3,6 +3,7 @@ package dev.xkmc.l2core.init; import dev.xkmc.l2core.base.effects.EffectToClient; import dev.xkmc.l2core.capability.conditionals.TokenToClient; import dev.xkmc.l2core.capability.player.PlayerCapToClient; +import dev.xkmc.l2core.init.reg.registrate.L2Registrate; import dev.xkmc.l2serial.network.PacketHandler; import dev.xkmc.l2serial.serialization.custom_handler.Handlers; import net.minecraft.resources.ResourceLocation; @@ -24,7 +25,7 @@ public class L2Core { public static final String MODID = "l2core"; public static final Logger LOGGER = LogManager.getLogger(); - // TODO public static final L2Registrate REGISTRATE = new L2Registrate(MODID); + public static final L2Registrate REGISTRATE = new L2Registrate(MODID); public static final PacketHandler PACKET_HANDLER = new PacketHandler(MODID, 1, e -> e.create(EffectToClient.class, PLAY_TO_CLIENT), @@ -36,6 +37,7 @@ public class L2Core { Handlers.register(); L2LibReg.register(bus); + REGISTRATE.addDataGenerator(L2TagGen.EFF_TAGS, L2TagGen::onEffectTagGen); } @SubscribeEvent diff --git a/src/main/java/dev/xkmc/l2core/init/L2TagGen.java b/src/main/java/dev/xkmc/l2core/init/L2TagGen.java new file mode 100644 index 0000000..22c7add --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/init/L2TagGen.java @@ -0,0 +1,32 @@ +package dev.xkmc.l2core.init; + +import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.providers.RegistrateTagsProvider; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.effect.MobEffect; + +public class L2TagGen { + + public static final ProviderType> EFF_TAGS = + ProviderType.register("tags/mob_effect", + type -> (p, e) -> new RegistrateTagsProvider.IntrinsicImpl<>(p, type, "mob_effects", + e.getGenerator().getPackOutput(), Registries.MOB_EFFECT, e.getLookupProvider(), + ench -> ResourceKey.create(Registries.MOB_EFFECT, BuiltInRegistries.MOB_EFFECT.getKey(ench)), + e.getExistingFileHelper())); + + + public static final TagKey TRACKED_EFFECTS = effectTag(ResourceLocation.fromNamespaceAndPath(L2Core.MODID, "tracked_effects")); + + public static void onEffectTagGen(RegistrateTagsProvider.IntrinsicImpl pvd) { + pvd.addTag(TRACKED_EFFECTS); + } + + public static TagKey effectTag(ResourceLocation id) { + return TagKey.create(Registries.MOB_EFFECT, id); + } + +} diff --git a/src/main/java/dev/xkmc/l2core/init/reg/registrate/EffectEntry.java b/src/main/java/dev/xkmc/l2core/init/reg/registrate/EffectEntry.java new file mode 100644 index 0000000..28d4db2 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/init/reg/registrate/EffectEntry.java @@ -0,0 +1,17 @@ +package dev.xkmc.l2core.init.reg.registrate; + +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.effect.MobEffect; + +public record EffectEntry(RegistryEntry val) { + + ResourceKey key() { + return val.getKey(); + } + + T get() { + return val.get(); + } + +} diff --git a/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java b/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java index 68be2e1..0f5e805 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java @@ -1,92 +1,151 @@ package dev.xkmc.l2core.init.reg.registrate; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.builders.AbstractBuilder; +import com.tterrag.registrate.builders.BuilderCallback; +import com.tterrag.registrate.builders.NoConfigBuilder; +import com.tterrag.registrate.providers.RegistrateLangProvider; +import com.tterrag.registrate.util.OneTimeEventReceiver; +import com.tterrag.registrate.util.entry.RegistryEntry; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import com.tterrag.registrate.util.nullness.NonnullType; +import dev.xkmc.l2core.init.L2Core; +import dev.xkmc.l2serial.serialization.custom_handler.CodecHandler; +import dev.xkmc.l2serial.util.Wrappers; +import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffect; import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.neoforge.data.loading.DatagenModLoader; +import net.neoforged.neoforge.registries.NewRegistryEvent; +import net.neoforged.neoforge.registries.RegistryBuilder; +import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.TreeMap; +import java.util.function.Consumer; +import java.util.function.Supplier; + +@SuppressWarnings("unused") public class L2Registrate extends AbstractRegistrate { + public final NonNullSupplier doDataGen = NonNullSupplier.lazy(DatagenModLoader::isRunningDataGen); + public L2Registrate(String modid) { super(modid); - registerEventListeners(FMLJavaModLoadingContext.get().getModEventBus()); + var bus = ModLoadingContext.get().getActiveContainer().getEventBus(); + if (bus != null) registerEventListeners(bus); + else L2Core.LOGGER.error("Failed to register mod {}", modid); } - public , P extends T> GenericBuilder generic(RegistryInstance cls, String id, NonNullSupplier

sup) { + public ResourceLocation loc(String id) { + return ResourceLocation.fromNamespaceAndPath(getModid(), id); + } + + public GenericBuilder generic(RegistryInstance cls, String id, NonNullSupplier

sup) { return entry(id, cb -> new GenericBuilder<>(this, id, cb, cls.key(), sup)); } - public > RegistryEntry> recipe(String id) { - return simple(id, ForgeRegistries.Keys.RECIPE_TYPES, () -> new RecipeType<>() { - }); - } - - @Deprecated - @Override - public EnchantmentBuilder enchantment(String name, EnchantmentCategory type, EnchantmentBuilder.EnchantmentFactory factory) { - return super.enchantment(name, type, factory); - } - - public EnchantmentBuilder enchantment(String name, EnchantmentCategory type, EnchantmentBuilder.EnchantmentFactory factory, String desc) { - addRawLang("enchantment." + getModid() + "." + name + ".desc", desc); - return super.enchantment(name, type, factory); + public > RecipeTypeEntry recipe(String id) { + return new RecipeTypeEntry<>(simple(id, Registries.RECIPE_TYPE, () -> new RecipeType<>() { + @Override + public String toString() { + return getModid() + ":" + id; + } + })); } public NoConfigBuilder effect(String name, NonNullSupplier sup, String desc) { addRawLang("effect." + getModid() + "." + name + ".description", desc); - return entry(name, cb -> new NoConfigBuilder<>(this, this, name, cb, ForgeRegistries.Keys.MOB_EFFECTS, sup)); + addRawLang("effect." + getModid() + "." + name + ".desc", desc); + return entry(name, cb -> new NoConfigBuilder<>(this, this, name, cb, Registries.MOB_EFFECT, sup)); } - @SuppressWarnings({"unchecked", "unsafe"}) - public > RegistryInstance newRegistry(String id, Class cls, Consumer> cons) { - ResourceKey> key = makeRegistry(id, () -> { - var ans = new RegistryBuilder(); - ans.onCreate((r, s) -> new RLClassHandler<>((Class) cls, () -> r)); - cons.accept(ans); - return ans; - }); - return new RegistryInstance<>(Suppliers.memoize(() -> RegistryManager.ACTIVE.getRegistry(key)), key); + private SimpleEntry genPotion(String name, NonNullSupplier sup) { + RegistryEntry ans = entry(name, (cb) -> new NoConfigBuilder<>(this, this, name, cb, + Registries.POTION, sup)).register(); + if (doDataGen.get()) { + List list = List.of(Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION, Items.TIPPED_ARROW); + for (Item item : list) { + String pref = item.getDescriptionId(); + String[] prefs = pref.split("\\."); + String str = item.getDescriptionId() + ".effect." + name; + String pref_name = RegistrateLangProvider.toEnglishName(prefs[prefs.length - 1]); + if (item == Items.TIPPED_ARROW) pref_name = "Arrow"; + addRawLang(str, pref_name + " of " + RegistrateLangProvider.toEnglishName(name)); + } + } + return new SimpleEntry<>(ans); } - public > RegistryInstance newRegistry(String id, Class cls) { + @SuppressWarnings({"unsafe"}) + public RegistryInstance newRegistry(String id, Class cls, Consumer> cons) { + ResourceKey> key = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(getModid(), id)); + var ans = new RegistryBuilder<>(key); + cons.accept(ans); + var reg = ans.create(); + new CodecHandler<>(Wrappers.cast(cls), reg.byNameCodec(), ByteBufCodecs.fromCodecWithRegistries(reg.byNameCodec())); + OneTimeEventReceiver.addModListener(this, NewRegistryEvent.class, (e) -> e.register(reg)); + return new RegistryInstance<>(reg, key); + } + + public RegistryInstance newRegistry(String id, Class cls) { return newRegistry(id, cls, e -> { }); } - public synchronized RegistryEntry buildModCreativeTab(String name, String def, Consumer config) { - ResourceLocation id = new ResourceLocation(getModid(), name); + public synchronized SimpleEntry buildModCreativeTab(String name, String def, Consumer config) { + ResourceLocation id = ResourceLocation.fromNamespaceAndPath(getModid(), name); defaultCreativeTab(ResourceKey.create(Registries.CREATIVE_MODE_TAB, id)); - return buildCreativeTabImpl(name, this.addLang("itemGroup", id, def), config); + return buildCreativeTabImpl(name, addLang("itemGroup", id, def), config); } - public synchronized RegistryEntry buildL2CreativeTab(String name, String def, Consumer config) { - ResourceLocation id = new ResourceLocation(L2Library.MODID, name); + public synchronized SimpleEntry buildL2CreativeTab(String name, String def, Consumer config) { + ResourceLocation id = ResourceLocation.fromNamespaceAndPath(L2Core.MODID, name); defaultCreativeTab(ResourceKey.create(Registries.CREATIVE_MODE_TAB, id)); TabSorter sorter = new TabSorter(getModid() + ":" + name, id); - return L2Library.REGISTRATE.buildCreativeTabImpl(name, this.addLang("itemGroup", id, def), b -> { + return L2Core.REGISTRATE.buildCreativeTabImpl(name, addLang("itemGroup", id, def), b -> { config.accept(b); sorter.sort(b); }); } - private synchronized RegistryEntry buildCreativeTabImpl(String name, Component comp, Consumer config) { - return this.generic(self(), name, Registries.CREATIVE_MODE_TAB, () -> { + private synchronized SimpleEntry buildCreativeTabImpl(String name, Component comp, Consumer config) { + return new SimpleEntry<>(this.generic(self(), name, Registries.CREATIVE_MODE_TAB, () -> { var builder = CreativeModeTab.builder().title(comp) .withTabsBefore(CreativeModeTabs.SPAWN_EGGS); config.accept(builder); return builder.build(); - }).register(); + }).register()); } - public record RegistryInstance>(Supplier> supplier, - ResourceKey> key) implements Supplier> { + public record RegistryInstance( + Registry reg, + ResourceKey> key + ) implements Supplier> { @Override - public IForgeRegistry get() { - return supplier().get(); + public Registry get() { + return reg; } + } - public static class GenericBuilder, P extends T> extends AbstractBuilder> { + public static class GenericBuilder extends AbstractBuilder> { private final NonNullSupplier

sup; @@ -101,7 +160,9 @@ public class L2Registrate extends AbstractRegistrate { } public GenericBuilder defaultLang() { - return lang(NamedEntry::getDescriptionId, RegistrateLangProvider.toEnglishName(this.getName())); + var reg = getRegistryKey().location(); + String id = reg.getPath() + "." + getOwner().getModid() + "." + getName(); + return lang(e -> id, RegistrateLangProvider.toEnglishName(this.getName())); } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/registrate/NamedEntry.java b/src/main/java/dev/xkmc/l2core/init/reg/registrate/NamedEntry.java index d450f05..59d8565 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/registrate/NamedEntry.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/registrate/NamedEntry.java @@ -1,21 +1,26 @@ package dev.xkmc.l2core.init.reg.registrate; -/*TODO +import dev.xkmc.l2serial.util.Wrappers; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; + public class NamedEntry> { private final L2Registrate.RegistryInstance registry; private String desc = null; + private ResourceLocation id = null; public NamedEntry(L2Registrate.RegistryInstance registry) { this.registry = registry; } - public @NotNull String getDescriptionId() { + public String getDescriptionId() { if (desc != null) return desc; ResourceLocation rl = getRegistryName(); - ResourceLocation reg = registry.get().getRegistryName(); + ResourceLocation reg = registry.key().location(); desc = reg.getPath() + "." + rl.getNamespace() + "." + rl.getPath(); return desc; } @@ -25,7 +30,12 @@ public class NamedEntry> { } public ResourceLocation getRegistryName() { - return Objects.requireNonNull(registry.get().getKey(getThis())); + if (id != null) return id; + id = registry.get().getKey(getThis()); + if (id == null) { + throw new IllegalStateException("Entry %s is not registered".formatted(getClass().getSimpleName())); + } + return id; } public String getID() { @@ -37,4 +47,3 @@ public class NamedEntry> { } } -*/ diff --git a/src/main/java/dev/xkmc/l2core/init/reg/registrate/RecipeTypeEntry.java b/src/main/java/dev/xkmc/l2core/init/reg/registrate/RecipeTypeEntry.java new file mode 100644 index 0000000..d9a0ddd --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/init/reg/registrate/RecipeTypeEntry.java @@ -0,0 +1,18 @@ +package dev.xkmc.l2core.init.reg.registrate; + +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; + +public record RecipeTypeEntry>(RegistryEntry, RecipeType> val) { + + ResourceKey> key() { + return val.getKey(); + } + + RecipeType get() { + return val.get(); + } + +} diff --git a/src/main/java/dev/xkmc/l2core/init/reg/registrate/SimpleEntry.java b/src/main/java/dev/xkmc/l2core/init/reg/registrate/SimpleEntry.java new file mode 100644 index 0000000..d95f506 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/init/reg/registrate/SimpleEntry.java @@ -0,0 +1,16 @@ +package dev.xkmc.l2core.init.reg.registrate; + +import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraft.resources.ResourceKey; + +public record SimpleEntry(RegistryEntry val) { + + ResourceKey key() { + return val.getKey(); + } + + T get() { + return val.get(); + } + +} diff --git a/src/main/java/dev/xkmc/l2core/serial/recipe/NBTRecipeWrapper.java b/src/main/java/dev/xkmc/l2core/serial/recipe/DataRecipeWrapper.java similarity index 87% rename from src/main/java/dev/xkmc/l2core/serial/recipe/NBTRecipeWrapper.java rename to src/main/java/dev/xkmc/l2core/serial/recipe/DataRecipeWrapper.java index 9d8aeae..166e46f 100644 --- a/src/main/java/dev/xkmc/l2core/serial/recipe/NBTRecipeWrapper.java +++ b/src/main/java/dev/xkmc/l2core/serial/recipe/DataRecipeWrapper.java @@ -2,7 +2,6 @@ package dev.xkmc.l2core.serial.recipe; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.core.component.DataComponentType; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -12,7 +11,7 @@ import net.minecraft.world.item.crafting.ShapelessRecipe; import net.neoforged.neoforge.common.conditions.ICondition; import org.jetbrains.annotations.Nullable; -public record NBTRecipeWrapper(RecipeOutput pvd, ItemStack stack) implements RecipeOutput { +public record DataRecipeWrapper(RecipeOutput pvd, ItemStack stack) implements RecipeOutput { @Override public Advancement.Builder advancement() { diff --git a/src/test/java/organize/GUIGenerator.java b/src/test/java/organize/GUIGenerator.java deleted file mode 100644 index 910e5e7..0000000 --- a/src/test/java/organize/GUIGenerator.java +++ /dev/null @@ -1,267 +0,0 @@ -package organize; - -import com.google.common.io.Files; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.internal.Streams; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class GUIGenerator { - - public static void main(String[] args) throws Exception { - new GUIGenerator("l2library").gen(); - } - - private class Comp { - - private final String name; - private final Item it; - private final int x, y, rx, ry; - - private Comp(String str, JsonObject e) { - name = str; - it = ITEM_MAP.get(e.get("sprite").getAsString()); - x = e.get("x").getAsInt(); - y = e.get("y").getAsInt(); - rx = getInt(e, "rx", 1); - ry = getInt(e, "ry", 1); - } - - @Override - public String toString() { - return name; - } - - private void draw(Graphics g, int cx, int cy) throws IOException { - for (int i = 0; i < rx; i++) - for (int j = 0; j < ry; j++) - g.drawImage(it.getImg(), cx + i * it.w, cy + j * it.h, null); - } - - private int gety0() { - return y - it.h / 2; - } - - private int gety1() { - return gety0() + ry * it.h; - } - - } - - private class Item { - - private final String name, app; - private final int w, h, dx, dy; - - private BufferedImage bimg; - - private Item(String str, String appe, JsonObject e) { - ITEM_MAP.put(appe == null ? str : str + appe, this); - name = str; - app = appe; - w = e.get("w").getAsInt(); - h = e.get("h").getAsInt(); - dx = getInt(e, "dx", 0); - dy = getInt(e, "dy", 0); - } - - @Override - public String toString() { - return app == null ? name : name + app; - } - - private BufferedImage getImg() throws IOException { - if (bimg != null) - return bimg; - String path = GUI + "-templates/sprites/" + name; - if (app != null) - path += "/" + app; - path += ".png"; - return bimg = ImageIO.read(new File(path)); - } - - } - - private final String GUI, DST, CONT, CDST; - - GUIGenerator(String modid) { - GUI = "./src/test/resources/" + modid + "/gui/"; - DST = "./src/test/resources/" + modid + "/assets/textures/gui/"; - CDST = "./src/test/resources/" + modid + "/data/" + modid + "/gui/"; - CONT = GUI + "-templates/container/" + modid + "/"; - } - - private final Map ITEM_MAP = new HashMap<>(); - - void gen() throws IOException { - readSprites(); - File f = new File(CONT); - Item top = ITEM_MAP.get("top"); - Item middle = ITEM_MAP.get("middle"); - for (File fi : f.listFiles()) { - JsonObject e = readJsonFile(fi.getPath()).getAsJsonObject(); - JsonObject out = new JsonObject(); - List side = new ArrayList<>(); - List comp = new ArrayList<>(); - int height = 0; - if (e.has("height")) { - height = e.get("height").getAsInt(); - } - Item bottom = ITEM_MAP.get(e.get("isContainer").getAsBoolean() ? "bottom" : "bottom_screen"); - e.get("side").getAsJsonArray().forEach(s -> side.add(ITEM_MAP.get(s.getAsString()))); - for (Map.Entry ent : e.get("comp").getAsJsonObject().entrySet()) - comp.add(new Comp(ent.getKey(), ent.getValue().getAsJsonObject())); - int y0 = 0, y1 = 0; - for (Comp c : comp) { - y0 = Math.min(y0, c.gety0()); - y1 = Math.max(y1, c.gety1()); - } - if (top.h + y1 - y0 + bottom.h < height) { - y1 = height - bottom.h - top.h + y0; - } - out.addProperty("height", top.h + y1 - y0 + bottom.h); - BufferedImage bimg = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB); - Graphics g = bimg.getGraphics(); - g.drawImage(top.getImg(), 0, 0, null); - for (int i = 0; i < y1 - y0; i++) - g.drawImage(middle.getImg(), 0, top.h + i, null); - g.drawImage(bottom.getImg(), 0, top.h + y1 - y0, null); - JsonObject jarr = new JsonObject(); - for (Comp c : comp) { - int cx = c.x - c.it.w / 2; - int cy = c.y - c.it.h / 2 - y0 + top.h; - c.draw(g, cx, cy); - JsonObject co = new JsonObject(); - co.addProperty("x", cx + c.it.dx); - co.addProperty("y", cy + c.it.dy); - co.addProperty("w", c.it.w); - co.addProperty("h", c.it.h); - co.addProperty("rx", c.rx); - co.addProperty("ry", c.ry); - jarr.add(c.name, co); - } - out.add("comp", jarr); - int dx = 0, dy = 0; - Item pre = null; - JsonObject jside = new JsonObject(); - for (Item s : side) { - JsonObject so = new JsonObject(); - if (pre != null) { - if (pre.h == s.h && top.w + dx + pre.w + s.w < 256) { - dx += pre.w; - } else { - dx = 0; - dy += pre.h; - } - } - so.addProperty("x", top.w + dx); - so.addProperty("y", dy); - so.addProperty("w", s.w); - so.addProperty("h", s.h); - jside.add(s.toString(), so); - g.drawImage(s.getImg(), top.w + dx, dy, null); - pre = s; - } - out.add("side", jside); - g.dispose(); - File fx = new File(DST + "container/" + fi.getName().split("\\.")[0] + ".png"); - check(fx); - ImageIO.write(bimg, "PNG", fx); - write(DST + "coords/" + fi.getName(), out); - write(CDST + "coords/" + fi.getName(), out); - - } - - } - - private int getInt(JsonObject e, String key, int def) { - return e.has(key) ? e.get(key).getAsInt() : def; - } - - private void readSprites() throws IOException { - JsonElement e = readJsonFile(GUI + "-templates/info.json"); - e.getAsJsonObject().entrySet().forEach(ent -> { - String name = ent.getKey(); - JsonObject o = ent.getValue().getAsJsonObject(); - if (o.has("ids")) - o.get("ids").getAsJsonArray().forEach(ele -> new Item(name, ele.getAsString(), o)); - else - new Item(name, null, o); - }); - } - - private void write(String path, JsonObject obj) throws IOException { - File fy = new File(path); - check(fy); - JsonWriter jw = new JsonWriter(Files.newWriter(fy, Charset.defaultCharset())); - jw.setLenient(true); - jw.setIndent("\t"); - Streams.write(obj, jw); - jw.close(); - } - - public static void check(File f) throws IOException { - if (!f.getParentFile().exists()) - f.getParentFile().mkdirs(); - if (!f.exists()) - f.createNewFile(); - } - - private static void delete(File f) { - if (!f.exists()) - return; - if (f.isDirectory()) - for (File fi : f.listFiles()) - delete(fi); - f.delete(); - } - - private static Map> readJson(String path) throws IOException { - JsonElement e = readJsonFile(path); - Map> ans = new HashMap<>(); - e.getAsJsonObject().entrySet().forEach(ent0 -> ent0.getValue().getAsJsonObject().entrySet().forEach(ent1 -> { - String key = ent1.getKey(); - List list; - if (ans.containsKey(key)) - list = ans.get(key); - else - ans.put(key, list = new ArrayList<>()); - ent1.getValue().getAsJsonObject().entrySet().forEach(ent2 -> { - String group = ent2.getKey(); - ent2.getValue().getAsJsonArray().forEach(ent3 -> { - String name = ent3.isJsonObject() ? ent3.toString() : ent3.getAsString(); - if (name.startsWith("_") || name.startsWith("^")) - list.add(group + name); - else if (name.endsWith("_")) - list.add(name + group); - else - list.add(name); - }); - }); - })); - return ans; - } - - private static JsonElement readJsonFile(String path) throws IOException { - File f = new File(path); - JsonReader r = new JsonReader(Files.newReader(f, Charset.defaultCharset())); - JsonElement e = new JsonParser().parse(r); - r.close(); - return e; - } - - -} diff --git a/src/test/java/organize/ResourceOrganizer.java b/src/test/java/organize/ResourceOrganizer.java deleted file mode 100644 index cb6ba71..0000000 --- a/src/test/java/organize/ResourceOrganizer.java +++ /dev/null @@ -1,122 +0,0 @@ -package organize; - -import com.google.common.io.Files; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import organize.sub.AssetMisc; -import organize.sub.DataMisc; -import organize.sub.LangFileOrganizer; - -import java.io.File; -import java.io.PrintStream; -import java.nio.charset.StandardCharsets; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public abstract class ResourceOrganizer { - - public static final Gson GSON = new GsonBuilder().setPrettyPrinting().setLenient().create(); - - public static final Map MAP = new LinkedHashMap<>(); - public static String MODID; - public final Type type; - public final String folder; - public final String target; - - public ResourceOrganizer(Type type, String folder, String target) { - this.type = type; - this.folder = folder; - this.target = target; - MAP.put(folder, this); - } - - public static void main(String[] args) throws Exception { - new LangFileOrganizer(); - //new ItemFileOrganizer(); - //new BlockFileOrganizer(); - //new ArmorFileOrganizer(); - //new RecipeFileOrganizer(); - new AssetMisc(); - new DataMisc(); - //new ConfigFileOrganizer(); - //new GeckoMisc(); - File f = new File("./src/test/resources"); - for (File fi : f.listFiles()) { - MODID = fi.getName(); - if (!fi.isDirectory()) - continue; - for (ResourceOrganizer obj : MAP.values()) { - File fo = new File(fi.getPath() + "/" + obj.folder); - if (!fo.exists()) - continue; - obj.organize(fo); - } - } - } - - public static void delete(File f) throws Exception { - if (f.exists()) { - if (f.isDirectory()) - for (File fi : f.listFiles()) - delete(fi); - f.delete(); - } - } - - public static void check(File f) throws Exception { - if (f.exists()) { - f.delete(); - } - if (!f.getParentFile().exists()) - f.getParentFile().mkdirs(); - f.createNewFile(); - } - - public abstract void organize(File f) throws Exception; - - public final String getTargetFolder() { - return getResourceFolder(true) + type + "/" + MODID + "/" + target; - } - - public final String getResourceFolder(boolean main) { - return (main ? "./src/main/resources/" : "./src/test/resources/"); - } - - protected String readFile(String path) { - List list = null; - try { - list = Files.readLines(new File(path), StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - String str = ""; - for (String s : list) - str += s + "\n"; - return str.replaceAll("\\^m", MODID); - } - - protected void write(String name, String cont) throws Exception { - File f = new File(name); - check(f); - PrintStream ps = new PrintStream(f, StandardCharsets.UTF_8); - ps.println(cont); - ps.close(); - } - - public enum Type { - ASSETS("assets"), DATA("data"); - - public final String side; - - Type(String side) { - this.side = side; - } - - public String toString() { - return side; - } - } - -} diff --git a/src/test/java/organize/sub/ArmorFileOrganizer.java b/src/test/java/organize/sub/ArmorFileOrganizer.java deleted file mode 100644 index 279f56b..0000000 --- a/src/test/java/organize/sub/ArmorFileOrganizer.java +++ /dev/null @@ -1,22 +0,0 @@ -package organize.sub; - -import com.google.common.io.Files; -import organize.ResourceOrganizer; - -import java.io.File; - -public class ArmorFileOrganizer extends ResourceOrganizer { - - public ArmorFileOrganizer() { - super(Type.ASSETS, "armor", "textures/models/armor/"); - } - - @Override - public void organize(File f) throws Exception { - for (File fi : f.listFiles()) { - File ti = new File(getResourceFolder(true) + "assets/minecraft/" + target + fi.getName()); - check(ti); - Files.copy(fi, ti); - } - } -} diff --git a/src/test/java/organize/sub/AssetMisc.java b/src/test/java/organize/sub/AssetMisc.java deleted file mode 100644 index ae26c07..0000000 --- a/src/test/java/organize/sub/AssetMisc.java +++ /dev/null @@ -1,38 +0,0 @@ -package organize.sub; - -import com.google.common.io.Files; -import organize.ResourceOrganizer; - -import java.io.File; - -public class AssetMisc extends ResourceOrganizer { - - public AssetMisc() { - super(Type.ASSETS, "assets", ""); - } - - @Override - public void organize(File f) throws Exception { - for (File fi : f.listFiles()) - process(fi, getTargetFolder(), ""); - } - - private void process(File f, String path, String pre) throws Exception { - if (f.getName().startsWith(".")) - return; - if (f.isDirectory()) { - for (File fi : f.listFiles()) { - String next = f.getName().startsWith("-") || f.getName().startsWith("@") ? path : path + f.getName() + "/"; - String npre = f.getName().startsWith("_") ? pre + f.getName() : - f.getName().endsWith("_") ? f.getName() + pre : - f.getName().startsWith("@") ? f.getName().substring(1) - : pre; - process(fi, next, npre); - } - } else { - File t = new File(path + pre + f.getName()); - check(t); - Files.copy(f, t); - } - } -} diff --git a/src/test/java/organize/sub/BlockFileOrganizer.java b/src/test/java/organize/sub/BlockFileOrganizer.java deleted file mode 100644 index 5ce49ed..0000000 --- a/src/test/java/organize/sub/BlockFileOrganizer.java +++ /dev/null @@ -1,44 +0,0 @@ -package organize.sub; - -import com.google.common.io.Files; -import organize.ResourceOrganizer; - -import java.io.File; - -public class BlockFileOrganizer extends ResourceOrganizer { - - public String texture; - - public BlockFileOrganizer() { - super(Type.ASSETS, "blocks", ""); - } - - - @Override - public void organize(File f) throws Exception { - texture = getTargetFolder() + "textures/block/"; - process("", f); - } - - private void process(String prefix, File f) throws Exception { - String filename = f.getName(); - if (filename.startsWith("-") || filename.startsWith(".")) - return; - filename = f.isDirectory() ? filename : filename.split("\\.")[0]; - String name = filename.startsWith("_") ? prefix + filename : filename.endsWith("_") ? filename + prefix : filename; - if (f.isDirectory()) { - for (File fi : f.listFiles()) { - String file = fi.getName(); - if (file.startsWith("-") || file.startsWith(".")) - continue; - process(name, fi); - } - return; - } - String ext = f.getName().substring(filename.length()); - File ti = new File(texture + name + ext); - check(ti); - Files.copy(f, ti); - } - -} diff --git a/src/test/java/organize/sub/DataMisc.java b/src/test/java/organize/sub/DataMisc.java deleted file mode 100644 index 1de2eca..0000000 --- a/src/test/java/organize/sub/DataMisc.java +++ /dev/null @@ -1,32 +0,0 @@ -package organize.sub; - -import com.google.common.io.Files; -import organize.ResourceOrganizer; - -import java.io.File; - -public class DataMisc extends ResourceOrganizer { - - public DataMisc() { - super(Type.DATA, "data", ""); - } - - @Override - public void organize(File f) throws Exception { - for (File fi : f.listFiles()) - process(fi, getResourceFolder(true) + type + "/"); - } - - private void process(File f, String pre) throws Exception { - if (f.getName().startsWith(".")) - return; - if (f.isDirectory()) { - for (File fi : f.listFiles()) - process(fi, pre + f.getName() + "/"); - } else { - File t = new File(pre + f.getName()); - check(t); - Files.copy(f, t); - } - } -} diff --git a/src/test/java/organize/sub/GeckoMisc.java b/src/test/java/organize/sub/GeckoMisc.java deleted file mode 100644 index 216cc29..0000000 --- a/src/test/java/organize/sub/GeckoMisc.java +++ /dev/null @@ -1,40 +0,0 @@ -package organize.sub; - -import com.google.common.io.Files; -import organize.ResourceOrganizer; - -import java.io.File; - -public class GeckoMisc extends ResourceOrganizer { - - public GeckoMisc() { - super(Type.ASSETS, "gecko", ""); - } - - @Override - public void organize(File f) throws Exception { - for (File fi : f.listFiles()) - process(fi); - } - - private void process(File f) throws Exception { - if (f.getName().startsWith(".")) - return; - if (f.isDirectory()) { - for (File fi : f.listFiles()) { - process(fi); - } - } else { - String name = f.getName(); - String path = getTargetFolder(); - if (name.endsWith("animation.json")) - path += "animations/"; - else if (name.endsWith("geo.json")) - path += "geo/"; - else path += "textures/gecko/"; - File t = new File(path + f.getName()); - check(t); - Files.copy(f, t); - } - } -} diff --git a/src/test/java/organize/sub/ItemFileOrganizer.java b/src/test/java/organize/sub/ItemFileOrganizer.java deleted file mode 100644 index d64230c..0000000 --- a/src/test/java/organize/sub/ItemFileOrganizer.java +++ /dev/null @@ -1,43 +0,0 @@ -package organize.sub; - -import com.google.common.io.Files; -import organize.ResourceOrganizer; - -import java.io.File; - -public class ItemFileOrganizer extends ResourceOrganizer { - - public String texture; - - public ItemFileOrganizer() { - super(Type.ASSETS, "items", ""); - } - - - @Override - public void organize(File f) throws Exception { - texture = getTargetFolder() + "textures/item/"; - process("", f); - } - - private void process(String prefix, File f) throws Exception { - String filename = f.getName(); - if (filename.startsWith("-") || filename.startsWith(".")) - return; - filename = f.isDirectory() ? filename : filename.split("\\.")[0]; - String name = filename.startsWith("_") ? prefix + filename : filename.endsWith("_") ? filename + prefix : filename; - if (f.isDirectory()) { - for (File fi : f.listFiles()) { - String file = fi.getName(); - if (file.startsWith("-") || file.startsWith(".")) - continue; - process(name, fi); - } - return; - } - File ti = new File(texture + name + ".png"); - check(ti); - Files.copy(f, ti); - } - -} diff --git a/src/test/java/organize/sub/LangFileOrganizer.java b/src/test/java/organize/sub/LangFileOrganizer.java deleted file mode 100644 index 8998afe..0000000 --- a/src/test/java/organize/sub/LangFileOrganizer.java +++ /dev/null @@ -1,82 +0,0 @@ -package organize.sub; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.mojang.datafixers.util.Pair; -import organize.ResourceOrganizer; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class LangFileOrganizer extends ResourceOrganizer { - - public LangFileOrganizer() { - super(Type.ASSETS, "lang", "lang/"); - } - - @Override - public void organize(File f) throws Exception { - for (File fi : f.listFiles()) { - if (!fi.isDirectory()) - continue; - String name = fi.getName(); - File target = new File(getTargetFolder() + name + ".json"); - check(target); - JsonObject dst_json = new JsonObject(); - for (File fj : fi.listFiles()) { - if (!fj.getName().endsWith(".json")) continue; - JsonObject json = new JsonParser().parse(new FileReader(fj.getPath(), StandardCharsets.UTF_8)).getAsJsonObject(); - inject("", json, dst_json); - if (json.has("-cartesian")) { - JsonObject block_list = json.get("-cartesian").getAsJsonObject(); - block_list.entrySet().forEach(ent0 -> { - JsonObject block = ent0.getValue().getAsJsonObject(); - String path = block.get("path").getAsString(); - boolean reverse = block.has("reverse") && block.get("reverse").getAsBoolean(); - boolean dot = block.has("use_dot") && block.get("use_dot").getAsBoolean(); - String con = dot ? "." : "_"; - List> map = new ArrayList<>(); - for (JsonElement vector : block.get("list").getAsJsonArray()) { - if (map.isEmpty()) { - List> finalMap = map; - vector.getAsJsonObject().entrySet().forEach(ent1 -> - finalMap.add(Pair.of(ent1.getKey(), ent1.getValue().getAsString()))); - } else { - map = map.stream().flatMap(ent1 -> vector.getAsJsonObject().entrySet().stream() - .map(ent2 -> Pair.of(ent1.getFirst() + con + ent2.getKey(), - reverse ? ent2.getValue().getAsString() + ent1.getSecond() : - ent1.getSecond() + ent2.getValue().getAsString()))) - .collect(Collectors.toList()); - } - } - for (Pair pair : map) { - dst_json.addProperty(path + "." + pair.getFirst(), pair.getSecond()); - } - - }); - } - } - FileWriter w = new FileWriter(target, StandardCharsets.UTF_8); - w.write(GSON.toJson(dst_json)); - w.close(); - } - } - - private void inject(String path, JsonObject src, JsonObject dst) { - for (Map.Entry ent : src.entrySet()) { - if (ent.getKey().startsWith("-")) continue; - if (ent.getValue().isJsonObject()) { - inject(path + ent.getKey() + ".", ent.getValue().getAsJsonObject(), dst); - } else { - dst.add(path + ent.getKey(), ent.getValue()); - } - } - } -} diff --git a/src/test/java/organize/sub/RecipeFileOrganizer.java b/src/test/java/organize/sub/RecipeFileOrganizer.java deleted file mode 100644 index d12cd57..0000000 --- a/src/test/java/organize/sub/RecipeFileOrganizer.java +++ /dev/null @@ -1,118 +0,0 @@ -package organize.sub; - -import com.google.common.io.Files; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import organize.ResourceOrganizer; - -import java.io.File; -import java.io.FileReader; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class RecipeFileOrganizer extends ResourceOrganizer { - - public RecipeFileOrganizer() { - super(Type.DATA, "recipes", "recipes/"); - } - - @Override - public void organize(File f) throws Exception { - generate(new File(f.getPath() + "/-template")); - process("", "", f, (name, file) -> { - String fs = getTargetFolder() + name; - File ti = new File(fs + ".json"); - check(ti); - Files.copy(file, ti); - }, false); - } - - private void generate(File file) throws Exception { - if (!file.exists()) - return; - File info = new File(file.getPath() + "/-info.json"); - if (!info.exists()) - return; - Map map = new HashMap<>(); - process("", "", file, (name, f) -> { - map.put(name, readFile(f.getPath())); - }, false); - JsonElement elem = new JsonParser().parse(new FileReader(info)); - for (Map.Entry layer_0 : elem.getAsJsonObject().entrySet()) { - List list = new ArrayList<>(); - if (layer_0.getKey().startsWith("-")) { - JsonArray arr = layer_0.getValue().getAsJsonObject().get("-list").getAsJsonArray(); - for (JsonElement e : arr) { - list.add(new Pair(e.getAsString(), map)); - } - } else { - list.add(new Pair(layer_0.getKey(), map)); - } - for (Map.Entry layer_1 : layer_0.getValue().getAsJsonObject().entrySet()) { - String _name = layer_1.getKey(); - if (_name.startsWith("-")) - continue; - for (Pair pair : list) { - String name = _name; - if (name.endsWith("_")) - name = name + pair.name; - else if (name.startsWith("_")) - name = pair.name + name; - else name = name + "_" + pair.name; - File dst = new File(getTargetFolder() + name + ".json"); - check(dst); - String ans = pair.template; - for (Map.Entry layer_2 : layer_1.getValue().getAsJsonObject().entrySet()) { - ans = ans.replaceAll("\\^" + layer_2.getKey(), layer_2.getValue().getAsString()); - } - ans = ans.replaceAll("\\^m", MODID); - ans = ans.replaceAll("\\^n", _name); - PrintStream ps = new PrintStream(dst); - ps.println(ans); - ps.close(); - } - } - } - } - - private void process(String folder, String prefix, File f, ExcCons cons, boolean skip_dash) throws Exception { - String filename = f.getName(); - if (skip_dash && filename.startsWith("-") || filename.startsWith(".")) - return; - filename = f.isDirectory() ? filename : filename.split("\\.")[0]; - String name = filename.startsWith("_") ? prefix + filename : filename.endsWith("_") ? filename + prefix : filename; - String subfolder = skip_dash && !prefix.startsWith("-") && name.equals(filename) ? folder.length() == 0 ? prefix : folder + "/" + prefix : folder; - if (f.isDirectory()) { - for (File fi : f.listFiles()) { - String file = fi.getName(); - if (file.startsWith("-") || file.startsWith(".")) - continue; - process(subfolder, skip_dash ? name : "", fi, cons, true); - } - return; - } - cons.accept(subfolder.length() == 0 ? name : subfolder + "/" + name, f); - } - - private static class Pair { - - private final String name; - private final String template; - - private Pair(String name, Map map) { - this.name = name; - this.template = map.get(name); - } - } - - private interface ExcCons { - - void accept(String name, File file) throws Exception; - - } - -} diff --git a/src/test/java/util/ScalePic.java b/src/test/java/util/ScalePic.java deleted file mode 100644 index b811d78..0000000 --- a/src/test/java/util/ScalePic.java +++ /dev/null @@ -1,65 +0,0 @@ - -package util; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -public class ScalePic { - - public static void main(String[] args) throws IOException { - //scale(4, "logo1", "logo1"); - //scale(18, "run_bow"); - //scale(16, "sonic_shooter"); - - //resize(64, 0,0,"iron"); - scale(25, "curse_of_spell", "curse_of_spell"); - //resize(18, 1,1,"moonwalk"); - } - - private static void scale(String name) throws IOException { - scale(2, name, name); - scale(8, name, name + "_large"); - } - - private static void resize(int size, int x0, int y0, String name) throws IOException { - File in = new File("./temp/in/" + name + ".png"); - File out = new File("./temp/out/" + name + ".png"); - BufferedImage img = ImageIO.read(in); - int sx = img.getWidth(); - int sy = img.getHeight(); - BufferedImage ans = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB); - for (int x = 0; x < sx; x++) - for (int y = 0; y < sy; y++) { - int col = img.getRGB(x, y); - ans.setRGB(x0 + x, y0 + y, col); - } - if (!out.exists()) { - out.createNewFile(); - } - ImageIO.write(ans, "PNG", out); - } - - private static void scale(int scale, String name, String out_name) throws IOException { - File in = new File("./temp/in/" + name + ".png"); - File out = new File("./temp/out/" + out_name + ".png"); - BufferedImage img = ImageIO.read(in); - int sx = img.getWidth(); - int sy = img.getHeight(); - BufferedImage ans = new BufferedImage(sx * scale, sy * scale, BufferedImage.TYPE_INT_ARGB); - for (int x = 0; x < sx; x++) - for (int y = 0; y < sy; y++) { - int col = img.getRGB(x, y); - for (int i = 0; i < scale; i++) - for (int j = 0; j < scale; j++) { - ans.setRGB(x * scale + i, y * scale + j, col); - } - } - if (!out.exists()) { - out.createNewFile(); - } - ImageIO.write(ans, "PNG", out); - } - -} diff --git a/src/test/resources/l2library/assets/textures/gui/container/curios_3.png b/src/test/resources/l2library/assets/textures/gui/container/curios_3.png deleted file mode 100644 index c492f177d326a599c176fdd53a0c989e6bc9c3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2100 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFt-<~dxAr*0NZ#d@3xC^)h z-tSVsxUxb&*4s_YX49NiS_j@l7_9u>xPPXr&Z14phV_5H>f4`C{P*PT+qcJq@87@w zfAUZDPs}r%?!JCq5HJ5h`2Wd2$(di7=FfhAfB%0OM&=K5?w?Y%-+X^xZS=LbQVq|4 z{IK+5o^X_*U<#W;H{$~hUI#Je1A$TvI&2M#O&B717~C@%Hc2q_U1CTvWRO|Pcp{0x zf`EpfuNn5(Jy`yw|B?Trbk4mQpNxOKX84kP?Ei6U+Cs9kMm4}9@2Letetv#`ZGHX! zx7+(Qp1%t}_p%%qJTdGGe_PVBE9ufw#^PwQS>VLoN4{XFmDdteHPRDIv& zXS-k|D5$eN5d7rM#Ny@mfoZ--XP4NYm8C3yM?(vHq8JS=QgR4dXwCZ5gSEW1CcYnzZ^! z?8TMrQ$~V<_3Ra0bF7Qrec27HtNL6g&kw|?%MAC~)iF#etRYz=H<;6Zds0w78c~*d&+KkWd5GLd;eCv`u+QN zecHdyKMczPzW=hibDjOq5g>o#mak0lv)|v}|G%e!!RGnlqLb_2Y|p8MY67gw^IJYQp3-d#7HX+o-Q<@Og>m}eDVo3q<>zc=HFP1E*7 zm%L&;YngrS?jn#Sk>2-ot-dxqn`8Ps@8Wx4LS3W!UTkiaL-Dy;#oJ$$1C#i*N#)&s zwhIP>GwN&)1fSWNd~PntZ%=o;(E1Vln&Vgg{EKsT@BcgpEGX4b)u1jmG`vHXQ2q6l z!Qb$CpJh2X#XMfL`hovi`JKfCi1 zlmYrcg)z1=U4}W}|0BDt|2STa1}EMUh=}0)`1K>V!!-WWs{419ZvQ*sW2K$Wj6bWc p?fu4ltT?V4C-(d+~0Wc^lZJ;XZL`t^mO%eS?83{1OTiSji3Mk diff --git a/src/test/resources/l2library/assets/textures/gui/container/curios_5.png b/src/test/resources/l2library/assets/textures/gui/container/curios_5.png deleted file mode 100644 index 1e47df4cf9dffebee5bf43a03e8f50f4576dc243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2262 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJEaxt=bLAr*0NZ#d?~xbv_* zyyK<*ab<~q{AosM$>R%mOLyGcFYt7I!>uz-+-C8*&(`n%_mti8$oxHf_x`PT_51hl z`m}$Ye;AepeE(&2=Q{hJBS8MfEnk`D&whV@|Nou_2Ak*GpH7;8GyncR-PdKT4=nBK z`hplXaWJ@RGDNa8EEZ|dVLA}V12N|8Fq0`jRu!}jglkMG;R|Npn! z?k3OQh0nYE9+-+_m;?Af962;+^Rqj;zhb!@rfq$4cTq5Z#<|GicVd6_SQSo3eagGI zlHKI_8q4zTy6H?4Qgti0zqrCYtN7ZS-LCt+8Bc7QwkNve72{dU>~nV)-3KQ4Nbh^P zR$m*Q%`ttRcM)XC8rAn=bE_PR&&?{{{-PWhz}F^~cl+5cuuMO@Gy2PJU>S0$UW$69h9ygm_V$v zJrI0mXY#qZpak-C#|y0=!LK=f<;!23vpc>L5|F$Owg-f{hei^hOCbKOYFIv_`1l-a za4svn_#{09OQkX`nc-FZo#of$9Y>QO-r@u;31)mU)FVdQ&MBb@0Q{Dy AM*si- diff --git a/src/test/resources/l2library/assets/textures/gui/container/curios_6.png b/src/test/resources/l2library/assets/textures/gui/container/curios_6.png deleted file mode 100644 index 5fe91c5976d025848342efc9405db5c5ac667934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2340 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJEa*PbqpAr*0NZ#d?~xbv_* zyyK<*ab<~q{AosM$>R%mNq5}aFYtDK!>uz-+-C8*&(`n%_mti8$oxHf_x`PT_51hl z`m}$Ye;AepeE(&2=Q{hJBS8MfEnk`9XTQI{|9?*dgU$29MJLz4*`9xYTIp`44>I!h z?wSmdEDeiA8g!Tr1adiuF+R{>Rp@3Yn8Gx{mBGS`@q`kC%ue<_AlDcwm{zapFI@}C($jV%Bd8oBR3#rm_K~`_U*>^@89|N z*SZzI`**JRS1gyqv}}e~jPoL96knUO+jYM;3vVv z>TAQZIi}C^F1`n5oHeTN#pYHy6rY<_y!}NvFw0$=RNn1pyTCI2?9S*fyMehc`{Zud z<#HG1Y<_k}7i`JaCwCVG^JkokEPf~USC3WUbkwK3i!0epp0BYi@2;E9G$B>Da{G%b z%(DiAGp;k+9GzqR?9NM&-}<`OHQ8_NTk!vzRs_EbDbd%@r-rIl$cd{*zd(hcBToMTtLbcBJK=7HJ$>-*R zGQiUv8K1PZuvA~C4H>@bzYBidzhE>t@s>bD1gAv2{C$C1=+b7sO-x~30H8-&JLOKw5oUd_~?`G-S>jy!aJzf1=);T3K0RTj0##8_R diff --git a/src/test/resources/l2library/assets/textures/gui/coords/curios_3.json b/src/test/resources/l2library/assets/textures/gui/coords/curios_3.json deleted file mode 100644 index e5c1e15..0000000 --- a/src/test/resources/l2library/assets/textures/gui/coords/curios_3.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 166, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 3 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/assets/textures/gui/coords/curios_4.json b/src/test/resources/l2library/assets/textures/gui/coords/curios_4.json deleted file mode 100644 index 9909d1a..0000000 --- a/src/test/resources/l2library/assets/textures/gui/coords/curios_4.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 184, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 4 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/assets/textures/gui/coords/curios_5.json b/src/test/resources/l2library/assets/textures/gui/coords/curios_5.json deleted file mode 100644 index 4312008..0000000 --- a/src/test/resources/l2library/assets/textures/gui/coords/curios_5.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 202, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 5 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/assets/textures/gui/coords/curios_6.json b/src/test/resources/l2library/assets/textures/gui/coords/curios_6.json deleted file mode 100644 index f4d143b..0000000 --- a/src/test/resources/l2library/assets/textures/gui/coords/curios_6.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 220, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 6 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/data/l2library/gui/coords/curios_3.json b/src/test/resources/l2library/data/l2library/gui/coords/curios_3.json deleted file mode 100644 index e5c1e15..0000000 --- a/src/test/resources/l2library/data/l2library/gui/coords/curios_3.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 166, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 3 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/data/l2library/gui/coords/curios_4.json b/src/test/resources/l2library/data/l2library/gui/coords/curios_4.json deleted file mode 100644 index 9909d1a..0000000 --- a/src/test/resources/l2library/data/l2library/gui/coords/curios_4.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 184, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 4 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/data/l2library/gui/coords/curios_5.json b/src/test/resources/l2library/data/l2library/gui/coords/curios_5.json deleted file mode 100644 index 4312008..0000000 --- a/src/test/resources/l2library/data/l2library/gui/coords/curios_5.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 202, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 5 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/data/l2library/gui/coords/curios_6.json b/src/test/resources/l2library/data/l2library/gui/coords/curios_6.json deleted file mode 100644 index f4d143b..0000000 --- a/src/test/resources/l2library/data/l2library/gui/coords/curios_6.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "height": 220, - "comp": { - "grid": { - "x": 8, - "y": 17, - "w": 18, - "h": 18, - "rx": 9, - "ry": 6 - } - }, - "side": { - "slot": { - "x": 176, - "y": 0, - "w": 18, - "h": 18 - } - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/gui/-templates/container/l2library/curios_3.json b/src/test/resources/l2library/gui/-templates/container/l2library/curios_3.json deleted file mode 100644 index e617bb3..0000000 --- a/src/test/resources/l2library/gui/-templates/container/l2library/curios_3.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "side": [ - "slot" - ], - "comp": { - "grid": { - "sprite": "empty_slot", - "x": 16, - "y": 0, - "rx": 9, - "ry": 3 - } - }, - "isContainer": true -} \ No newline at end of file diff --git a/src/test/resources/l2library/gui/-templates/container/l2library/curios_4.json b/src/test/resources/l2library/gui/-templates/container/l2library/curios_4.json deleted file mode 100644 index 92ddafe..0000000 --- a/src/test/resources/l2library/gui/-templates/container/l2library/curios_4.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "side": [ - "slot" - ], - "comp": { - "grid": { - "sprite": "empty_slot", - "x": 16, - "y": 0, - "rx": 9, - "ry": 4 - } - }, - "isContainer": true -} \ No newline at end of file diff --git a/src/test/resources/l2library/gui/-templates/container/l2library/curios_5.json b/src/test/resources/l2library/gui/-templates/container/l2library/curios_5.json deleted file mode 100644 index f515bb4..0000000 --- a/src/test/resources/l2library/gui/-templates/container/l2library/curios_5.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "side": [ - "slot" - ], - "comp": { - "grid": { - "sprite": "empty_slot", - "x": 16, - "y": 0, - "rx": 9, - "ry": 5 - } - }, - "isContainer": true -} \ No newline at end of file diff --git a/src/test/resources/l2library/gui/-templates/container/l2library/curios_6.json b/src/test/resources/l2library/gui/-templates/container/l2library/curios_6.json deleted file mode 100644 index c270943..0000000 --- a/src/test/resources/l2library/gui/-templates/container/l2library/curios_6.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "side": [ - "slot" - ], - "comp": { - "grid": { - "sprite": "empty_slot", - "x": 16, - "y": 0, - "rx": 9, - "ry": 6 - } - }, - "isContainer": true -} \ No newline at end of file diff --git a/src/test/resources/l2library/gui/-templates/info.json b/src/test/resources/l2library/gui/-templates/info.json deleted file mode 100644 index 52fb6c3..0000000 --- a/src/test/resources/l2library/gui/-templates/info.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "toggle_slot": { - "ids": [ - "_0", - "_1", - "_2" - ], - "w": 18, - "h": 18, - "dx": 1, - "dy": 1 - }, - "altas": { - "ids": [ - "_boost_main", - "_boost_sub", - "_stat_container", - "_head", - "_necklace", - "_body", - "_bracelet", - "_belt", - "_disabled" - ], - "w": 16, - "h": 16 - }, - "button": { - "ids": [ - "_1", - "_1p", - "_2", - "_2p" - ], - "w": 8, - "h": 8 - }, - "sort": { - "ids": [ - "_1", - "_1p" - ], - "w": 9, - "h": 11 - }, - "delete": { - "ids": [ - "_on", - "_off" - ], - "w": 18, - "h": 18 - }, - "upgrade": { - "ids": [ - "_on", - "_off" - ], - "w": 18, - "h": 18 - }, - "slider/_top": { - "w": 14, - "h": 1, - "dx": 1, - "dy": 1 - }, - "slider/_bottom": { - "w": 14, - "h": 1, - "dx": 1, - "dy": -1 - }, - "slider/_middle": { - "w": 14, - "h": 1, - "dx": 1, - "dy": 0 - }, - "slider": { - "ids": [ - "_light", - "_dark" - ], - "w": 12, - "h": 15 - }, - "exchange": { - "ids": [ - "_in", - "_out" - ], - "w": 31, - "h": 14 - }, - "slot": { - "w": 18, - "h": 18, - "dx": 1, - "dy": 1 - }, - "empty_slot": { - "w": 18, - "h": 18, - "dx": 1, - "dy": 1 - }, - "result_slot": { - "w": 26, - "h": 26, - "dx": 5, - "dy": 5 - }, - "arrow": { - "ids": [ - "_0", - "_1", - "_2", - "_3" - ], - "w": 22, - "h": 16 - }, - "fire": { - "ids": [ - "_0", - "_1" - ], - "w": 14, - "h": 14 - }, - "top": { - "w": 176, - "h": 16 - }, - "bottom": { - "w": 176, - "h": 96 - }, - "bottom_screen": { - "w": 176, - "h": 7 - }, - "middle": { - "w": 176, - "h": 1 - } -} \ No newline at end of file diff --git a/src/test/resources/l2library/gui/-templates/sprites/altas/_belt.png b/src/test/resources/l2library/gui/-templates/sprites/altas/_belt.png deleted file mode 100644 index 3ab24bb6b3a3bdcf740720ea3b4535d48920ef9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0C5{Q2JKlQU+u(mIV0) zGdMiEkp|?*dAc};RNP8-VE$w;Arc|Mv_s;Ly`hBx<4pxY6$XZc?<^tjT>tn1RWf+G L`njxgN@xNAEpr=j diff --git a/src/test/resources/l2library/gui/-templates/sprites/altas/_body.png b/src/test/resources/l2library/gui/-templates/sprites/altas/_body.png deleted file mode 100644 index ad9755f0d9bb12b90a82bafe2a911167ecc6f3a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0C5{Q2JKlQU+u(mIV0) zGdMiEkp|?bc)B=-RNP8#V31>GQ{-n;6=yrH#>TEDuxUc#0|5txZ|nlC46*x|?`KTu Q0~y2M>FVdQ&MBb@0GG-f1^@s6 diff --git a/src/test/resources/l2library/gui/-templates/sprites/altas/_boost_main.png b/src/test/resources/l2library/gui/-templates/sprites/altas/_boost_main.png deleted file mode 100644 index c6dc5838cb633235bd93498371e44b71bfcf687c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf5DjpW2`K`$I}@uwoQ1; k6w{^YrOV?~QL!fyKp00i_>zopr02xmzTmS$7 diff --git a/src/test/resources/l2library/gui/-templates/sprites/altas/_boost_sub.png b/src/test/resources/l2library/gui/-templates/sprites/altas/_boost_sub.png deleted file mode 100644 index 4e498dcdb30f8674c7a5ce134688e07da6d9a303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD3OsG;hE;^%b*2hb1<+l zvN13NS&R%!Ktc%0W(2Y|5aR8b3@l(Z3=DQant_3N0V6`?0w%buzyf9j8>DdCsxK!Q z7?>VqhD4M^`1)8S=jZArrsOB3>Q&?xfD|y;R9FF-xv3?I3Kh9IdBs*0wn|_XRzNmL zSYJs2tfVB{Rw=?aK*2e`C{@8s&p^*W$&O1wLBXadCCw_x#SN+*$g@?-C@Cqh($_C9 zFV`zK*2^zS*Eh7ZwA42+(l;{F1**_3uFNY*tkBIXR)!b?Gsh*hIJqdZpd>RtPXT0Z zVp4u-iLH_n$Rap^xU(cP4PjGWG1OZ?59)(t^bPe4^s#A6t;oco4I~562KE=kIvbE- zR?hjk1x2aF#Xx7-8QOp?KoLVY528LOwKzYg6y%H0yv!0iBd8WMVRT*oMVYCr>N^lVQT#}Es_rTyKU4F)`{p)o6>OKhm(mSyq=3d>IJzC6$J`STxv z({BWI+3uE`Z|>-IGD0`ZmF*ZylY~Hr%bOEg!K_vr6jn$c?cw?Cwm^}Q;p~f>nQpZ# zQ34_s%~N?<<1T%-`YpxvW7DC1-#7dUU|6vF$LlWz8XpV}_+0wq$g*A~)Sx+CNchbG o<&$e!%T=~i{jS-2h)e2iys^B$F$a%PDJbiCy85}Sb4q9e0I^wCX8-^I diff --git a/src/test/resources/l2library/gui/-templates/sprites/altas/_head.png b/src/test/resources/l2library/gui/-templates/sprites/altas/_head.png deleted file mode 100644 index e8be58da2a80abb7ad1f4daa388bc64a2a00100b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0C5{Q2JKlQU+u(mIV0) zGdMiEkp|@Gdb&7wc)B=-RNP8#VED$)Bg4e=NMFLlWr2rIb7L_Rb2Jn4WM&RSGY1hSh88JS U)6^h^5TG6gPgg&ebxsLQ00vPT3;+NC diff --git a/src/test/resources/l2library/gui/-templates/sprites/altas/_stat_container.png b/src/test/resources/l2library/gui/-templates/sprites/altas/_stat_container.png deleted file mode 100644 index 8c9df8ae826bf242c072562860c8719f6ef49523..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf{h}UWU_cgy5eO8w-r$$(!{|LIn^KK1$Q#9*6LcdYg+bNwOdilu6F008jpmX$&lK! lNb>_9?_n{iCVvfvnm?;-R{fgdHXCR^gQu&X%Q~loCIB6HLs|d; diff --git a/src/test/resources/l2library/gui/-templates/sprites/arrow/_0r.png b/src/test/resources/l2library/gui/-templates/sprites/arrow/_0r.png deleted file mode 100644 index 119e81165e913d2616d19cda13e930ac3528e263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gw!3HFS-u9~jDVAa<&kznEsNqQI0P@Q`T^vI! zdbeKLDCnTb!F=I?R^LNCzUO*r-02rziT`KeKDedGf0lxZde4`8fnFQu^?Ryc5f=Tn zNK2+MuR!EivvMGVz$9ZS)`l-ktPLi|Dww!W-i&fS7b&~rZ^XW5kvn!*ZoT&UZC`=O mK2v?J@O)R6yf}0HeGJohZENall^y|Iz~JfX=d#Wzp$P!>??A@@ diff --git a/src/test/resources/l2library/gui/-templates/sprites/arrow/_1.png b/src/test/resources/l2library/gui/-templates/sprites/arrow/_1.png deleted file mode 100644 index 25a3f8a0e16dea7fe494bd44a0b31c212862eb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gw!3HFS-u9~jDVAa<&kznEsNqQI0P;&bT^vI! zdbeIW$jP9{!*by3j%7J&`N0!qXKpH5&n);@x$`$K&*@1<#{w*ZvRgZ5d_UfN?uY1) zmi9z$|HkqPsXdQeLu2C$yE^VPHa^k(XJG7=efH{(?|F+{TBdh6y)Dz2U~#l(*+K1D lOz$rk+k7y-#%i5Yl&ikl{5`$%BNqN|O#U#zu;S9^O?kd0 z;haU`oh-NcxD3`k>fLlOehTZlg@+5cWt*xs816i(G@UY8@y!mPgBUzr{an^LB{Ts5 D6x2(} diff --git a/src/test/resources/l2library/gui/-templates/sprites/arrow/_3.png b/src/test/resources/l2library/gui/-templates/sprites/arrow/_3.png deleted file mode 100644 index a1dea1cb494f9f77eaaa97e08bcf12298d8e5c1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gw!3HFS-u9~jDVAa<&kznEsNqQI0P>4HT^vI! zdbeKQ$lGAR<8o2{h|rozteeb%o|g{0yqlvr$?|^M z1+o9E-#($_;#jb=`T6;uZ%1bn@{t?u;*H2HLugYu5)bpDIIMyt3J^Vn9 kx6%EDQO-i|4ed;O?w{25Qur<13bdZV)78&qol`;+0NI*D5C8xG diff --git a/src/test/resources/l2library/gui/-templates/sprites/bottom.png b/src/test/resources/l2library/gui/-templates/sprites/bottom.png deleted file mode 100644 index 50b4f84395a1cd688fa0db5b6952f58b45bfb8a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^8-O^0gAGXT?fg*)q*#ibJVQ8upoSx*gMoqZj;D)b zNX4ADcP?f!1&X*{{M{6qDSf%apf=)!k8ISnC)o}>l>(|i`qq4veE8zH8&5@U=+@lZ zVWFYhZ?8=#nSOfds#VicSFShTFILgn(5aTNh;v2;liDmS%=UZD&p-cssy<`c%4?-t zlb^qwd->&;*N^Wud~Xat^Eu}Au3H;FfAM=CJ;}~V!1sWQu)#$Z9}`Ale9T?<+2<`= z`K+?;r{|j+KlRsI*{^@4bod;Hb-%decL@7~wVu(B2<$FG7kviQ`@z~)&*%-${>Ms( z{l4^d^Vm(p;uUm_KyU9nvBCI{pZ|9yX19|1i4T=oAg*8g+kejL6l>)-HgT%=i>KzK z|BwwoS)+sBTQGlv)z6g+KY65Z>Y3vLpa7Zj_wnI(0ikQRZi`)iU7r8Yi*Mx*%53EB v|8jbu4~&OZS#KY{zbzfdZL>Huw3gYkaQ6Ava#LmiDLsS+C#C9DzC zHb_`sNdc^+B->Ug!Z$#{Ilm}X!A#FU&p^qJOF==wrYI%ND#*nRsvXF)RmvzSDX`Ml zFE20GD>v55FG|-pw6wI;H!#vSGSUUA&@HaaD@m--%_~-h7y>iLCAB!YD6^m>Ge1uO zWNuEQYQ=AS1sd9~ebNnaQ4cC8$t;k+tpYMDQgb3)GILY&Aigv= zv(d*YgRav#KPSH^xF9h(7365J79=5b)nI!f5%!oP+kzwx)n}s*N(D%%0+QswqQEp~ z$7Q1rPrr6tH#E;n0F!j1r;B4q1n1ishC&AvI9U39;-0G4cKkn(E}7KUCbBJDrd1>0 z&YGUZQVpVFd^3vk);qGy;QVrL`yN9!y|jgw)R@$nvK|O4K3&PVqH*PR_eWZdd+bvF z^mVrCmb?3=P29t=LFk0=ji~H3QcJyA>R9fv$IOU4S#w`db;VK+0ihdve>1okh~(Y* SqW21v!8~34T-G@yGywq6E=P9& diff --git a/src/test/resources/l2library/gui/-templates/sprites/button/_1.png b/src/test/resources/l2library/gui/-templates/sprites/button/_1.png deleted file mode 100644 index bc148182033dae793a79050280a89a2fd9c56693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#VfQf2FzKOUBc5&Wd u;O=Q$bGhfO<}#)dPKy`s-u>(6XJF91Z!}?ISM^h%!3>_RelF{r5}E+1^)N;N diff --git a/src/test/resources/l2library/gui/-templates/sprites/button/_1p.png b/src/test/resources/l2library/gui/-templates/sprites/button/_1p.png deleted file mode 100644 index 39abeae0aab2db2d47102c767a32e0864043a666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf`?^1Wvv=kE=tbX&dNG^_n7(C5ALa*x>?hW_2wdJ|k?AGWMobmZU+-sEj6 zQzOa@OE#)3iRk*qPZ)^TW)=2?ZUw4b2)|KHgTe~DWM4f`2{ks diff --git a/src/test/resources/l2library/gui/-templates/sprites/button/_2.png b/src/test/resources/l2library/gui/-templates/sprites/button/_2.png deleted file mode 100644 index 569b121d5477e5e4fcd9b77f115a84c084606aa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#VffsgwX+p>Eoo`&Y;0_NxO0_O^OLu?H6|JG z>KHhtxSm*M_;8cFGvk?vlGigXyggD7TweaYzJ`IJ#mlCYEk5!W&6&5CJ)pjKLgbllH6={t8TS8R1-`r(z>A(Lq4T&>Q; zBe?0N;5x^sXK}agKkELkz2>&Gc>c3q?yX_rSJji4x+~Q^H=1AX1zN%2>FVdQ&MBb@ E0HBsJf&c&j diff --git a/src/test/resources/l2library/gui/-templates/sprites/delete/_off.png b/src/test/resources/l2library/gui/-templates/sprites/delete/_off.png deleted file mode 100644 index 8535ffedf7e2b0463e62bf885a0afac3cc7e9138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@~3;cIEGmC zF1>t^_pkv+>qGmnX)hRN>K?w4{pDF|(K!a$=6On{d=decx1LS@%F^AzQ6HAwEBavX zdxn~Ax~zN72{+Wqh`d#5jtMya1NX6WC1-r*&{;&S;-8;i`c& zzwoJPoRx{~3k)Zp$gok+j^H;AKf)ayJCWm2qH6OQgJM@Bi335|Q}0zvY`_2GY|X*(EKXm0kfO54$=Yox?%z!u^m@aD#~hen! zq3$xv0kb~E2fNoXoH^|@Nl)oSMVo=MHFv_~H!f`QMuawCQ9wvtP<;=;@^5%Wf z7*_oqLTnA&nnjzJ$i;NNH{E8s`T374F^qYIUm2Lsut?gTnKuocggL`W#cTPSlo;q{ELMJ@N>$x2W-3wR$4s&V^=0!ZOM`f6fUA z5EkxD`7Ja5;gMzXT}`sHRhOv5bUl{2X%tka)S%xT9$+asNpI->HhQZU- K&t;ucLK6VN0X60T diff --git a/src/test/resources/l2library/gui/-templates/sprites/fire/_0.png b/src/test/resources/l2library/gui/-templates/sprites/fire/_0.png deleted file mode 100644 index 33ba616254b3d6bb8d2d6a0f2ed9e577449e7910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@?$++978lF zuAS)3$DqjJ?7r^m=fhi%iFUeixuq`sRJqj5`1k&10s9rN!kVvp28IhW>Rfrj_dw9_ zmSJ$AdrDv0d*O@X>4wi%UU?P2+$}9&%5>SziyJP5s#%trN?&7?-eh1>z$_ LtDnm{r-UW|`T#a% diff --git a/src/test/resources/l2library/gui/-templates/sprites/fire/_1.png b/src/test/resources/l2library/gui/-templates/sprites/fire/_1.png deleted file mode 100644 index ab4d6ee806efeaaa4dc0cb117f83c5cfea147a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmV-E0m1%>P)Nklz1r@oY$RepjL&MQ90mljqkb*l> zQN)=cRAvE=4WO{4Sb+m|@|V7zY)8hJ*KohZW3$7*2=b;=US*8vtN6(o=n&B#B1tN7I~sQV_cV_Un!vg;i7}IOj;amp6^z z_3V0ajc&X}dtCOWSx@4Eb-r0*v0S9GxHB80%_h?5-mfzw-mRFfH5x3+MJn0sIaeyR znHR(72oRZq&zOR`uV&GYqBtmma3vCi@K(=vDHaN^^GcC1<`w=JM*Da62I3ZQ7k0N` QAOHXW07*qoM6N<$f}O~Oi~s-t diff --git a/src/test/resources/l2library/gui/-templates/sprites/middle.png b/src/test/resources/l2library/gui/-templates/sprites/middle.png deleted file mode 100644 index 53c6ef8ad2b7c3dcba5eb4e42478077e56c33113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^8-SRRgAGX5DXR1VDVAa<&kznEsNqQI0P@v5T^vI+ zCcZsr$jD&8!Mx$j|3-lph1Hu6I)0j|3B}LEFdIw=m1ml1)(WZrWhDpyuzkpkacl|>teCqC=)otNH^)lyLbQm`573# W-N?@PnD_@|4TGnvpUXO@geCyvuPLSg diff --git a/src/test/resources/l2library/gui/-templates/sprites/slider/_bottom.png b/src/test/resources/l2library/gui/-templates/sprites/slider/_bottom.png deleted file mode 100644 index 76f36aba328db406d42b50eae4190455f9617833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^|!3HGX$<1d0QY^(zo*^7SP{WbZ0p#<0x;Tb# i%uIgq?%h9spz7BxX1O~qzkCXmV(@hJb6Mw<&;$VM(-uJh diff --git a/src/test/resources/l2library/gui/-templates/sprites/slider/_dark.png b/src/test/resources/l2library/gui/-templates/sprites/slider/_dark.png deleted file mode 100644 index 61dd4b47a3b515118f39f7e70facdae7cb723e27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9QY^(zo*^7SP{WbZ0pweGx;Tbt zOicds|NsAbHYG=Ye|~1}9!DOF(pMrb%stKgGiJ^-G%zqwFgd`&(HJQ0*28OSYs=#6 b&c;x7M|qXc#4Rs?rZ9NA`njxgN@xNApYtMU diff --git a/src/test/resources/l2library/gui/-templates/sprites/slider/_light.png b/src/test/resources/l2library/gui/-templates/sprites/slider/_light.png deleted file mode 100644 index ede330c463e779cc5a659eb33c4894d2035041a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9QY^(zo*^7SP{WbZ0pz=Qx;Tbt zOnlqBk@J89&k>OmVR0X?8MQ^9inmdWePkC{>2c@c-LnFoa~MKRxpLk!C>YB>?O@o^ moL%v_{>PbSm7M;R2G(s~RJOid9JmK)9)qW=pUXO@geCxkKrXTX diff --git a/src/test/resources/l2library/gui/-templates/sprites/slider/_middle.png b/src/test/resources/l2library/gui/-templates/sprites/slider/_middle.png deleted file mode 100644 index e718f5394087bb65b8c0c80916e21b1b34e152c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^|!3HGX$<1d0QY^(zo*^7SP{WbZ0pyE&x;Tb# q%uF^hH~%j$By`AuOG8sLk%6J_2lGGiFEvg;B@CXfelF{r5}E)qB^25K diff --git a/src/test/resources/l2library/gui/-templates/sprites/slider/_top.png b/src/test/resources/l2library/gui/-templates/sprites/slider/_top.png deleted file mode 100644 index 0524056f4674a84cdba673e597e7e90964169372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^|!3HGX$<1d0QY^(zo*^7SP{WbZ0pyE#x;Tb# o%uF^hH~)X$L5YKtGm(KIdI{5_+s`Mg1Ijaay85}Sb4q9e00V*)tN;K2 diff --git a/src/test/resources/l2library/gui/-templates/sprites/slot.png b/src/test/resources/l2library/gui/-templates/sprites/slot.png deleted file mode 100644 index 95d25daaade8ce227e734a65615db9e8841f71ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@{K%Q978O6 zlTFOc|DShIlY&ofsH4?NslZZ}g}DsExtX L)z4*}Q$iB}jXNF2 diff --git a/src/test/resources/l2library/gui/-templates/sprites/sort/_1p.png b/src/test/resources/l2library/gui/-templates/sprites/sort/_1p.png deleted file mode 100644 index 0bc6ff4e4cd5bd1968742f6e34645b0e871fd479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRY!3HGPMlP2IQY^(zo*^7SP{WbZ0p#m@x;TbN zOiljt|NsAbHk$>@m$x^v9y`E#ZB69i11;x8BqTzQ9JqA(^5G3>XQlRZF?y1CYAsI diff --git a/src/test/resources/l2library/gui/-templates/sprites/toggle_slot/_0.png b/src/test/resources/l2library/gui/-templates/sprites/toggle_slot/_0.png deleted file mode 100644 index 95d25daaade8ce227e734a65615db9e8841f71ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@{K%Q978O6 zlTFOc|DShItW?szJD`k>(!Nas;;qKkP?M)dN Y0&Bf(92!NVfo3pxy85}Sb4q9e0Dapd5dZ)H diff --git a/src/test/resources/l2library/gui/-templates/sprites/toggle_slot/_2.png b/src/test/resources/l2library/gui/-templates/sprites/toggle_slot/_2.png deleted file mode 100644 index a51e75eec3a2cc140a6ad0ea317dcfefb949aefe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@+~}F978O6 zlTFOc|DShItW?szJD`k>(!Nas;;qKkP?M;C; Xob%SZ=$=srG=ss@)z4*}Q$iB}m&+t0 diff --git a/src/test/resources/l2library/gui/-templates/sprites/top.png b/src/test/resources/l2library/gui/-templates/sprites/top.png deleted file mode 100644 index 962d4900ff8c8e5df156314f967e4479adb4e30f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^8-Q4VgAGV-Tm2QpVJUX<4B-HR8jh3>Aivzx#W5tK z@$I#ZoCgeeTrN)j&d&SD_RYpA$0j^bdpW21zgA=DiXW}c+l3w|ep|Teg}9uOQ`B2C zLH#p5hD*LCbL29fw>%%iS~F$lq$T%u-}>BG@o?GR^$h=A4{UJ5jmj90zm(X&#w%?Z P&P7NpFU;e*B*E*!-}-OzkFT1K)Rde&85b0>OBx!#4Gdg8 zH|nk88P-e(mf1~f-1yU)_O#73ZwPyrc(vttTxg|Qf!yVjx2kg&%YSjb@WDOm-hCbg eh9hTQ_UhF>lt06m`>_>hHG`+CpUXO@geCy+4nh(D diff --git a/src/test/resources/l2library/gui/-templates/sprites/upgrade/_on.png b/src/test/resources/l2library/gui/-templates/sprites/upgrade/_on.png deleted file mode 100644 index 2c972b88b2462a1326714284e3b7bbfad4f0c392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK^0Pc$978O6 zlTFOc|DShImdKI;Vst0B3?Yu>b%7