From ef5dc3f6e975dfba60ffd2522c92ddb6f6f7dcf6 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 25 Feb 2017 12:37:01 -0800 Subject: [PATCH] Add gen2 evolutions/learnset --- PKHeX/Legality/Core.cs | 15 ++++++- PKHeX/Legality/Structures/EvolutionTree.cs | 47 ++++++++++++++++++-- PKHeX/Legality/Structures/Learnset.cs | 4 +- PKHeX/PKHeX.Core.csproj | 3 ++ PKHeX/Properties/Resources.Designer.cs | 49 +++++++++++++++++---- PKHeX/Properties/Resources.resx | 9 ++++ PKHeX/Resources/byte/evos_gsc.pkl | Bin 0 -> 621 bytes PKHeX/Resources/byte/lvlmove_c.pkl | Bin 0 -> 4682 bytes PKHeX/Resources/byte/lvlmove_gs.pkl | Bin 0 -> 4666 bytes 9 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 PKHeX/Resources/byte/evos_gsc.pkl create mode 100644 PKHeX/Resources/byte/lvlmove_c.pkl create mode 100644 PKHeX/Resources/byte/lvlmove_gs.pkl diff --git a/PKHeX/Legality/Core.cs b/PKHeX/Legality/Core.cs index 4c37fa00c..d4ccad9d6 100644 --- a/PKHeX/Legality/Core.cs +++ b/PKHeX/Legality/Core.cs @@ -11,12 +11,17 @@ public static partial class Legal public static MysteryGift[] MGDB_G6, MGDB_G7 = new MysteryGift[0]; // Gen 1 - private static readonly Learnset[] LevelUpRB = Learnset1.getArray(Resources.lvlmove_rb); - private static readonly Learnset[] LevelUpY = Learnset1.getArray(Resources.lvlmove_y); + private static readonly Learnset[] LevelUpRB = Learnset1.getArray(Resources.lvlmove_rb, MaxSpeciesID_1); + private static readonly Learnset[] LevelUpY = Learnset1.getArray(Resources.lvlmove_y, MaxSpeciesID_1); private static readonly EvolutionTree Evolves1; private static readonly EncounterArea[] SlotsRBY; private static readonly EncounterStatic[] StaticRBY; + // Gen 2 + private static readonly Learnset[] LevelUpGS = Learnset1.getArray(Resources.lvlmove_gs, MaxSpeciesID_2); + private static readonly Learnset[] LevelUpC = Learnset1.getArray(Resources.lvlmove_c, MaxSpeciesID_2); + private static readonly EvolutionTree Evolves2; + // Gen 6 private static readonly EggMoves[] EggMovesXY = EggMoves6.getArray(Data.unpackMini(Resources.eggmove_xy, "xy")); private static readonly Learnset[] LevelUpXY = Learnset6.getArray(Data.unpackMini(Resources.lvlmove_xy, "xy")); @@ -153,6 +158,10 @@ private static void MarkG7SMSlots(ref EncounterArea[] Areas) SlotsRBY[SlotsRBY.Length - 1] = FishOldGood_RBY; StaticRBY = getStaticEncounters(GameVersion.RBY); } + // Gen 2 + { + Evolves2 = new EvolutionTree(new[] { Resources.evos_gsc }, GameVersion.GSC, PersonalTable.C, MaxSpeciesID_2); + } // Gen 6 { StaticX = getStaticEncounters(GameVersion.X); @@ -439,6 +448,8 @@ private static EvolutionTree getEvolutionTable(PKM pkm) { case 1: return Evolves1; + case 2: + return Evolves2; case 6: return Evolves6; diff --git a/PKHeX/Legality/Structures/EvolutionTree.cs b/PKHeX/Legality/Structures/EvolutionTree.cs index 8a834e352..02afdbb98 100644 --- a/PKHeX/Legality/Structures/EvolutionTree.cs +++ b/PKHeX/Legality/Structures/EvolutionTree.cs @@ -20,7 +20,10 @@ public EvolutionTree(byte[][] data, GameVersion game, PersonalTable personal, in switch (game) { case GameVersion.RBY: - Entries = EvolutionSet1.getArray(data[0]); + Entries = EvolutionSet1.getArray(data[0], maxSpeciesTree); + break; + case GameVersion.GSC: + Entries = EvolutionSet2.getArray(data[0], maxSpeciesTree); break; case GameVersion.ORAS: Entries.AddRange(data.Select(d => new EvolutionSet6(d))); @@ -174,7 +177,7 @@ private static EvolutionMethod getMethod(byte[] data, ref int offset) case 1: // Level var m1 = new EvolutionMethod { - Method = 1, // Use Item + Method = 1, // Level Up Level = data[offset + 1], Species = data[offset + 2] }; @@ -202,11 +205,11 @@ private static EvolutionMethod getMethod(byte[] data, ref int offset) } return null; } - public static List getArray(byte[] data) + public static List getArray(byte[] data, int maxSpecies) { var evos = new List(); int offset = 0; - for (int i = 0; i <= Legal.MaxSpeciesID_1; i++) + for (int i = 0; i <= maxSpecies; i++) { var m = new List(); while (data[offset] != 0) @@ -217,6 +220,42 @@ public static List getArray(byte[] data) return evos; } } + public class EvolutionSet2 : EvolutionSet + { + private static EvolutionMethod getMethod(byte[] data, ref int offset) + { + int method = data[offset]; + int arg = data[offset + 1]; + int species = data[offset + 2]; + offset += 3; + + switch (method) + { + case 1: /* Level Up */ return new EvolutionMethod { Method = 1, Species = species, Level = arg }; + case 2: /* Use Item */ return new EvolutionMethod { Method = 8, Species = species, Argument = arg }; + case 3: /* Trade */ return new EvolutionMethod { Method = 5, Species = species }; + case 4: /*Friendship*/ return new EvolutionMethod { Method = 1, Species = species }; + case 5: /* Stats */ + // species is currently stat ID, we don't care about evo type as stats can be changed after evo + return new EvolutionMethod { Method = 1, Species = data[offset++], Level = arg }; // Tyrogue stats + } + return null; + } + public static List getArray(byte[] data, int maxSpecies) + { + var evos = new List(); + int offset = 0; + for (int i = 0; i <= maxSpecies; i++) + { + var m = new List(); + while (data[offset] != 0) + m.Add(getMethod(data, ref offset)); + ++offset; + evos.Add(new EvolutionSet2 { PossibleEvolutions = m.ToArray() }); + } + return evos; + } + } public class EvolutionSet6 : EvolutionSet { private const int SIZE = 6; diff --git a/PKHeX/Legality/Structures/Learnset.cs b/PKHeX/Legality/Structures/Learnset.cs index e2979151e..4a973c7f0 100644 --- a/PKHeX/Legality/Structures/Learnset.cs +++ b/PKHeX/Legality/Structures/Learnset.cs @@ -36,9 +36,9 @@ private Learnset1(byte[] data, ref int offset) Levels = levels.ToArray(); Count = Moves.Length; } - public static Learnset[] getArray(byte[] input) + public static Learnset[] getArray(byte[] input, int maxSpecies) { - var data = new Learnset[Legal.MaxSpeciesID_1 + 1]; + var data = new Learnset[maxSpecies + 1]; int offset = 0; for (int s = 0; s < data.Length; s++) diff --git a/PKHeX/PKHeX.Core.csproj b/PKHeX/PKHeX.Core.csproj index 132316f70..a1c307766 100644 --- a/PKHeX/PKHeX.Core.csproj +++ b/PKHeX/PKHeX.Core.csproj @@ -270,12 +270,15 @@ + + + diff --git a/PKHeX/Properties/Resources.Designer.cs b/PKHeX/Properties/Resources.Designer.cs index a534e828a..75ac26f36 100644 --- a/PKHeX/Properties/Resources.Designer.cs +++ b/PKHeX/Properties/Resources.Designer.cs @@ -12324,14 +12324,15 @@ public class Resources { /// Looks up a localized string similar to PKHeX - By Kaphotics ///http://projectpokemon.org/pkhex /// - ///17/02/07 - New Update: + ///17/02/25 - New Update: /// - Legality: - /// - - Added: Legality indication for exported QR images (if legality check is available for origin). - /// - - Added: Legality indication for Box/Party pkm slots (^ + opt-in via Options->Set to SAV). + /// - - Added: Legality checking for RBY Pokémon as pk1 and pk7+. /// - - Fixed: More edge cases for legality checks. - /// - Added: More Generation 7 trainer stat record labels. Thanks skywalker25 & Holla! - /// - Added: G7TID -> TID/SID generator for Generation 7 Trainer Editor. Thanks RoC! - /// - [rest of string was truncated]";. + /// - Batch Editor: + /// - - Added: Nickname clearing to batch editor (via .IsNicknamed=False). + /// - - Added: Legality filtering and bulk suggestions for Met Location, Current Moves & Relearn Moves. + /// - - - Use $suggest to use suggested result from the legality analysis. + /// - - Changed: Properties are now sort [rest of string was truncated]";. /// public static string changelog { get { @@ -12591,6 +12592,16 @@ public class Resources { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] evos_gsc { + get { + object obj = ResourceManager.GetObject("evos_gsc", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -17823,6 +17834,26 @@ public class Resources { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] lvlmove_c { + get { + object obj = ResourceManager.GetObject("lvlmove_c", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] lvlmove_gs { + get { + object obj = ResourceManager.GetObject("lvlmove_gs", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// @@ -18084,7 +18115,7 @@ public class Resources { } /// - /// Looks up a localized string similar to 20170207. + /// Looks up a localized string similar to 20170225. /// public static string ProgramVersion { get { @@ -34274,8 +34305,8 @@ public class Resources { ///小磁怪 ///三合一磁怪 ///大蔥鴨 - ///都都 - ///都都利 + ///嘟嘟 + ///嘟嘟利 ///小海獅 ///白海獅 ///臭泥 diff --git a/PKHeX/Properties/Resources.resx b/PKHeX/Properties/Resources.resx index e289d474b..77081cc35 100644 --- a/PKHeX/Properties/Resources.resx +++ b/PKHeX/Properties/Resources.resx @@ -7411,4 +7411,13 @@ ..\Resources\byte\personal_y;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\byte\evos_gsc.pkl;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\byte\lvlmove_c.pkl;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\byte\lvlmove_gs.pkl;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/PKHeX/Resources/byte/evos_gsc.pkl b/PKHeX/Resources/byte/evos_gsc.pkl new file mode 100644 index 0000000000000000000000000000000000000000..40c6e9fddc8fd2c028db7c00e6a79126689d2e4a GIT binary patch literal 621 zcmXw#O-NKx6oAjYcc!KvoY(Mt^PUZFezb8ALqbAAilQjQh!}_vDF~4$A=*R)*}{be zA#RFL3L_#KY7tQ(p%AFJ3PjpO1a694v}sd2`_8K_obP_;=U(o6VmvFRHKbIhL?aZ{_j-~yGx5Qv8vs9eVtVc+>P?F&%}{H4z`uTonyUJo5{fZM@gqUxfdbDSk-IKx1SUk9REf?4YuvjdB#cL&skV#n%MY1FliDtxRAQ?ndSd=Ij zCT+`7;)J%;)OM7F$s~?gxvh&1JMq|2t5_^)XW}Rt$981d%~Ug)4qH!0rZh>V+O(}| zG}A9VyU>bqMxNn^#qWP{_uPBW{htHsfN2#C{bsjy$U5R2q^@)hM6V|QOa}~z(7!IZ z2Lo3k1F5SUH3{6G75Rbu)m{|MAR2PS0kT3Z(Rr>R?2vY<5ONB3R(wmLJl{y~kTnbk z)&yI9V>LIBJ+6{>C}uTMhkvGx`Y?ECp9%2zqd{ z1cIhk>BqQU0pErI1fUh@UG01<)|)~Y2Ei1wCOl6Es$5ohSOpkzLV?uNOjXEc5sreW zj~d4;6V?ZvF7N$Jng2?ruHYz4!2Ngz`kKXWk9iuwS#Dl@TRD^(_?xh!!OX_za|lIX zjOO+Z92X5HBJ;Na8S_QiL=pjmU+jRWC#1tj8Dmf#JQJiNoworFo?+=E0tSLOIOgGW z03f!0U`!D$>>tQ%Q1)TEVoz1ju33Q?Mf7W2&`gf(;q+ zLPtyBWGEDkDBsIq^es9#u1~io$SI$ly_m#JsKRkbH&M_YzbGT>GhEp)WE*yjc(R?> zqF+J)S71nk9og`;#4R`s_+T~+6GP;2>W6fL8xVf0Y|}6fSE2uhTq8LkBV_RXXH98) z$vH$F_YX7O>VbDL;--~Ls~&ouaP>CbiWf^t>heGPLBX}pLS zp(Wwe`by0VEU@SdLVa^LYieMa>yo$y24T$L2Gb-ex@H43yS!V!lhog6UrC z7hLnc8Rov|hhjC0=U~QTyB8{&;IFXvi60iK_n?%3q$%eRylm*DcsY~TK@!KZ@KWY~ zbueexL&#(cwMK`y*94q=4)%cDgubOpC0ognadmt5 z(KjQz#p%z1_kv)UA-+J~N1dhr$bBd*Nn3RorvNj?8LNsze-u8yY&N>uyw>f zL=Jnh!7JRL=+c231|YmHbYz(;@xg*Bj9?-R;^oJDIZ9@!Vld1;Bvd6_Mhwz$bR9ydV4BnPqw)b6!yp!|=cAP(bgEoL>1X&#(JDJjflMeM97|&!A;R(UI_3^0j}=g0^rM!vO>&L--ehK@ zRqe9hM40H=DGOzPb=`e>58($$V+J5HR>z`ttVSlY6ctwNsRP>qj=RpRl zX6J@oo=IPYeLIE+4Y0?Yag?Y4{Ve-HY`1V-ys1Lv#xw=y+1LZpZuxpQ3Uh5jyTvx? z@%Y+9i~LWNJQu*S4kL>aLdI0JOP)i43rwAxjh^5?RhCo*2@YvOs2-b5oJgba9oS=- zCi=+|HB1k2BLWslL{K6<^yBESZBf%Vh=5&i%}{?Gs4(wx9RC}|cBAkO2;3=lR-*4F zxjc#;`UfmNo7Xkt{VV!K_AGxsNo9YogH}VCSoNB`Mz5jsUm|UZH!|CFaM+M0YNUq> z(;3bsRF(5!Oh@d8TwkXSFc0%5MBGP2a0ElYjT0xbh=UL%JS0soah(z?kE;MYKx?qT z_96syuqg3udy8j(AQgU`uSxYy=+H-7N6dZbq;ASdZx0Q}T*(0?LV-w-QL2ruaOZ^| zNEq~-@qkru%Yl#Ba?@1~;C{;*jFlBv>4B&@Z4Gvu3eb^n3Y|GMKcnlA|EAPgM95%? zmx;^dK5CXOa{Gn4;*AVkhJ8@vrgZR-zGV3a+XJo^Z{0ghf53M0my(#Y6Cmhk+E*R# zc9es5wh`Zueh`-hhvB<$#`Im{jH`t*hA;A=?72;w)zM%wne26HmaV4l@A`^Ts|4IX z11|0eX~1p$n9oa7oACZx(9)b}X_It2w^i7H!L&w=6(UG3c~?Ux1uoC(;Kx=bcuEJH zGePYL3gM4p8^yKEJ&KizkTMpmA@@|^9NQ(VWmY!fa=x#uC~EZEM9)Mp!Cs2v6ipzj zU`zbr)N?s?-O8v@gdJ==K9(xyFw*A8oH}x6{76d3<#q5+i2u%1Ztr&P>-gKwH`x~w zzryo_gLqUjEpUs{4aNKrKte;YrwTWE5t?Dr+(!z2KX*R4UB00L=+jWFk=@>l&~7YS z6Yg~22D>D%%Gwy?F>B5JS|Gr_%$^iNnG2f`+TaXPpvv5fQde=hA9uP3Mu{;5Z%Dnx zdOt>Qha9mJ!FefPTHd9YoAG5AOmBIVS|#{GjcMl!gwXcGi0p{;J+k%hAc4u%E=)1*70?> zdf`EsZVH~ObSPR+t;ly1_ZOieQ^U)rQ#W7^v4uDhq* zD}hVwtWeJ2jb|XO;EsC7bjJ#FDL$JmcO%B$TEApDYTxTQ9-QZXDwgwDtPsKymRMDw zj)&%jpXST=pm3K4ZVtxU(!?pdO#Ln}#j!lD1rek*$V`c>@&jNL-ccLiS9N%K-%)!_ zd`#h^(mvv&2=5pkb-YS_K(9nFus`|O1A=+4^J~GIv8fCOf*)b80>U>lQ@sdqcTA(U zG0*8>ol|d;2&1M^$C&RlTNgC|V@(t^#p|08D!nGQm1;t?)bvraY`x$r`XlU`GGPr( zUe+*GWFu+ByWlU(r^tK#&vVO3m)2383!lrrhhEWk6?;5}7_tuAN1XlC>EL#Ra24la z?v&j9fz#~gNzCa4O4u^${q2{?c^}$X63w%(b-=ux{FuI){H+o<;KxDy_@(BL!L!(% zKS)Z{8+4kpD`iB6sKwLj|5=;qlbk=E7zKO|L1T*UVxQd_A>0_um>^ zML5MS$1kR;xof!BmQ~xs-o5lPfALRyp7)fVM}!~gUumBrFZ#OK|45$G!T;!B8+-~Y zfK^Iqhf3fvln9Tr9K6JL7d}zoqVbTGbzcrV!k!RbZ>HxW9MWL)g!KAm%z;W*y@V$I4m#msZ!%O7RR6t={K-fqi|BRy zYRo)o-cQQ@IL9V2KkqCvf6&Sdx~eI>;RDZ#{}Jw_@;*TyY(G!ZzHMPP@$+ z`Ai4_maARsF#UWtLdJZCJnv_@LUOZ=P7s7MaK4EcI$qeg`HPA@7$%81tgS`*DehAN z4NF#!KaTl4HM3;;%DqD^=0rktsOrh(Gi2hw!)0{c&C{k=^IcArz3=7ah_{mu` za$5Q~r3w;Y;Uij()MyvxLR_;}D0{_9VjVlXp zNdKr)Is((H*bS7Z6myZ=EuNE_-9WP!V5K)4zHj z30)9E`QPJQ_|KE5`P)Q`W4|Zmf1Ihs>M2}80tCybD@jlAzspV+Kk38y6qG}>llNrv z#rOJfJ_QwBYqX8uk}VWJ?ZezcWPICNbw3~Au*QCp8CMD+LUKx1SUk9REf?6uVzF2Ni`PmNA(OIPieyP963vLsKr)D^uqaV5 zOxl*E#0hMvsqHEan`s>}a+4GtcH*(4Rbmo?vi(F5V9(EmVL{ioX|+^Qd$@e zZ3wJA-pKFjLy2kU4fE#1gyM*MuKJgl_2|>d&1zIU%(o;mPFqcdh%0Xnzu67(`Rl8uvUKsBjtaQ4L_oaTQX}G8HkCK{yVQ zo;OZdrmPP;UET+olJM1ZO~pJ+!Gm}P`l`imk9r!xI=3LbtsY7h{7u-^VCu1jEJ6tw zqq(yS$ML~K=F z=LmJuKg#s7W5V7$7*ZPoZDV_5V_B5U9g^vN``0Kx(-0=*KTzkD;Qbcl8uDbJ2`zD_ z-oFyA2n&fub5vYKft5%lv5-?y2X9W>ik=F6GrEw*-*K>9FWxeui{BurU{=w(AM$4cp(4iY$)g_qO+tAlyN zK0+besC7ETy)NS9^RN$;CiJa`L*nZhgbKno*dE@Vc}WLf$3OTZDB6mSw5!*9fW95s zE6siZydOlv9PuUc0qQ*cTkb<~S>CS0I7OH<&RI1a`mOk3cDeAy*sUM3gso%t5pvX% z30~udC6^A|Fa+TZp)12&iw);BVGPq?7_UBN%W*P86@p>*5wRlUGNO=z;~O~gNV1|J zX7H};vAyp);+>{1v6I3n^}MUFr-gmfp-aMKs)gbGdkF24ktedG$Gbbkily9B>J$?0V^cnnwNYd0My2Lf&?`p1NS|e!JPpC4}&)u=1HK1ECqS;WOL$Ymi zo$hA2o)mg!00Y_9LSj!ZqUQlRrZG3a;WmznHK^W~rocQOeMsJ`-0VeRzC-M^*rq)mUuS4Z z_<@?`B3L$HWJyNIm@0PJb0lzysd07wl<=v#pbE%vq$PxE(R%z;3WYy`eTG?LkStQ8 z^awX5Vu3^iMbbk*iQd}5o4!c|?4oOq`eC5VyvuRIKdY9@!#5%DS+Tp!znkE4D0b-| zviNLX*PQo{>6h5^!o>uY`MD0-4JBgDYw{YshVH+Qbj06C@6f?fLyD-99x6&%r=4{G?EoYg^ErkGGGR2hc^`l#|{W8jZRVLu!N~5hr=7gD!Iy#XplV=y~HI ztLRn&AF-vTryRolR$4GxQaz;)cyr1c>^c*mBi|Ccvs!lY8&LR`++9G(V0l-FtKdwTj(59CK|9-s zZAv|i%YviuT{vg@E^*G)Mj6AGg;3_gmaW=oFqusD8dYa2$p?GBs@5qH_s@WfJ4PCC zTR#?Z^2`>zy%sbyCmPx`-N|hiH(@aCys=CK$z|_a=(Nb?SRMR@l?k5F0q2ZUyMki) zqv&R7J$;{Qq!J{Jd27f$6S%*=#tG|3?p*;Frq62nEp;Ajm0$usY6+22a&_}t{r46Wd*Q8Nl!}nH zJmRi1H{-XJ{Pw*gC-xjDV`hN)d(MvF1|tQIsu)F0~1l2g8y*?I!EpTT$!smL`&zZ|RQTL`i(DAjurV%av7 z3B?)rEr%OoMLlD+l9yHJiu;$jhNRUf4Ps%wgCmV(MQsI`j;dwKzCgK{)4~b$t5xh( z5jht8uE^;WB3z*Uyrs{!&pqpBL&el{8iMoC*TmE;!wSVMDmJF9?e3a;*1a0I!q&x7 z8gD!UDHV6sx@NmpnJck+rqqiV`)d8N<+y#n=VWk!`>9mPVW~n0%UEDFfjSvl5PzDh z+=s$FnzwnF=tvP~>&bXshaZvtqsED)=Mpx;kMMOBq^B#HyT*nTNAx5mD_A%!mbvC$DgE$YfA-D$vXW4rT z%-J{!*evS(oma>OA6i%fjdP%V$h?#Mn7*F)l^QeP$6@^V<>rsT^VpR?Ov=<7bc)0F zL5+#GxLhabNnt&cSATbCz;hxznOxtR--@8=Gez{7IyS#IlY6uO-GXZfXV{h4ttzFzj<6Bl&wKRVa}pTa6&g;E=#B6ti% z!s9FjuL!;QPgJ;MJYr?tR|Ai+r^H`0Q*#N9v><;<{>4^2|8hr_c-HZ%cP&_npovEH zeq!1=;r*^wdQ}znA!Yl|Sxv}N{ zG-Nz#U2v}iPO}a1mGqr%{wOT8FyD}0*^2m>F>Br9o(`N~bK;BX5CSYydp2O|#a@Jr z`5bxC&vN+$`fU)-!Nn$E=vaO;BE~RH%ws(*(9dw6ifDq0mMJmZ$=JrY# zWZV=y&Sw2*D#C*@-tug#^3xx4IdMjQ3a7(nzKV^~zjz-DT@pjN-{4&M&l2AJ9iq)~ z(3A8($yB4YBrYKiqGjBbpr?diXJ!kZ4B&h!$|Bk=crv-ddjmM1iWEdPp^(WJJ{`cU zLS%f~T5-P^;IOWKlActHA3}H=DlH+hocv_-q+0y$ArvOn()V|kRkw{f5Z|n<=flnzPZ@@vkYX{&r=2hn{bjd5}3%dUYY