From d6e0114126f778c298763d05fa59ee62c28f595a Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:13:35 +0300 Subject: [PATCH] randomize iconSmoothing (#28158) * randomize iconSmoothing * Revert "randomize iconSmoothing" This reverts commit 094356f975737c0af24ce39d849aec7852b9af6e. * try 2 * trying work with client-server communication * still dont work * Tayrtahn good suggestion * remove outdated code * Fix! * move data to Appearance * Update RandomIconSmoothComponent.cs --- .../ClientRandomIconSmoothSystem.cs | 29 ++++++++ .../IconSmoothing/IconSmoothComponent.cs | 2 +- .../IconSmoothing/IconSmoothSystem.cs | 35 +++++++--- .../IconSmoothing/RandomIconSmoothSystem.cs | 26 +++++++ .../RandomIconSmoothComponent.cs | 16 +++++ .../SharedRandomIconSmoothSystem.cs | 12 ++++ .../Entities/Structures/Walls/walls.yml | 5 ++ .../Structures/Walls/mining.rsi/meta.json | 66 +++++++++++++----- .../Structures/Walls/mining.rsi/miningB0.png | Bin 0 -> 1192 bytes .../Structures/Walls/mining.rsi/miningB1.png | Bin 0 -> 1470 bytes .../Structures/Walls/mining.rsi/miningB2.png | Bin 0 -> 1192 bytes .../Structures/Walls/mining.rsi/miningB3.png | Bin 0 -> 1470 bytes .../Structures/Walls/mining.rsi/miningB4.png | Bin 0 -> 1446 bytes .../Structures/Walls/mining.rsi/miningB5.png | Bin 0 -> 1451 bytes .../Structures/Walls/mining.rsi/miningB6.png | Bin 0 -> 1446 bytes .../Structures/Walls/mining.rsi/miningB7.png | Bin 0 -> 962 bytes 16 files changed, 165 insertions(+), 26 deletions(-) create mode 100644 Content.Client/IconSmoothing/ClientRandomIconSmoothSystem.cs create mode 100644 Content.Server/IconSmoothing/RandomIconSmoothSystem.cs create mode 100644 Content.Shared/IconSmoothing/RandomIconSmoothComponent.cs create mode 100644 Content.Shared/IconSmoothing/SharedRandomIconSmoothSystem.cs create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB0.png create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB1.png create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB2.png create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB3.png create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB4.png create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB5.png create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB6.png create mode 100644 Resources/Textures/Structures/Walls/mining.rsi/miningB7.png diff --git a/Content.Client/IconSmoothing/ClientRandomIconSmoothSystem.cs b/Content.Client/IconSmoothing/ClientRandomIconSmoothSystem.cs new file mode 100644 index 0000000000..73db9e1ab9 --- /dev/null +++ b/Content.Client/IconSmoothing/ClientRandomIconSmoothSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.IconSmoothing; +using Robust.Client.GameObjects; + +namespace Content.Client.IconSmoothing; + +public sealed class ClientRandomIconSmoothSystem : SharedRandomIconSmoothSystem +{ + [Dependency] private readonly IconSmoothSystem _iconSmooth = default!; + [Dependency] private readonly AppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChange); + } + + private void OnAppearanceChange(Entity ent, ref AppearanceChangeEvent args) + { + if (!TryComp(ent, out var smooth)) + return; + + if (!_appearance.TryGetData(ent, RandomIconSmoothState.State, out var state, args.Component)) + return; + + smooth.StateBase = state; + _iconSmooth.SetStateBase(ent, smooth, state); + } +} diff --git a/Content.Client/IconSmoothing/IconSmoothComponent.cs b/Content.Client/IconSmoothing/IconSmoothComponent.cs index 88b1f613cb..040198529c 100644 --- a/Content.Client/IconSmoothing/IconSmoothComponent.cs +++ b/Content.Client/IconSmoothing/IconSmoothComponent.cs @@ -30,7 +30,7 @@ namespace Content.Client.IconSmoothing /// Prepended to the RSI state. /// [ViewVariables(VVAccess.ReadWrite), DataField("base")] - public string StateBase { get; private set; } = string.Empty; + public string StateBase { get; set; } = string.Empty; [DataField("shader", customTypeSerializer:typeof(PrototypeIdSerializer))] public string? Shader; diff --git a/Content.Client/IconSmoothing/IconSmoothSystem.cs b/Content.Client/IconSmoothing/IconSmoothSystem.cs index 4b02560846..11ca75bc82 100644 --- a/Content.Client/IconSmoothing/IconSmoothSystem.cs +++ b/Content.Client/IconSmoothing/IconSmoothSystem.cs @@ -55,6 +55,33 @@ namespace Content.Client.IconSmoothing if (component.Mode != IconSmoothingMode.Corners || !TryComp(uid, out SpriteComponent? sprite)) return; + SetCornerLayers(sprite, component); + + if (component.Shader != null) + { + sprite.LayerSetShader(CornerLayers.SE, component.Shader); + sprite.LayerSetShader(CornerLayers.NE, component.Shader); + sprite.LayerSetShader(CornerLayers.NW, component.Shader); + sprite.LayerSetShader(CornerLayers.SW, component.Shader); + } + } + + public void SetStateBase(EntityUid uid, IconSmoothComponent component, string newState) + { + if (!TryComp(uid, out var sprite)) + return; + + component.StateBase = newState; + SetCornerLayers(sprite, component); + } + + private void SetCornerLayers(SpriteComponent sprite, IconSmoothComponent component) + { + sprite.LayerMapRemove(CornerLayers.SE); + sprite.LayerMapRemove(CornerLayers.NE); + sprite.LayerMapRemove(CornerLayers.NW); + sprite.LayerMapRemove(CornerLayers.SW); + var state0 = $"{component.StateBase}0"; sprite.LayerMapSet(CornerLayers.SE, sprite.AddLayerState(state0)); sprite.LayerSetDirOffset(CornerLayers.SE, DirectionOffset.None); @@ -64,14 +91,6 @@ namespace Content.Client.IconSmoothing sprite.LayerSetDirOffset(CornerLayers.NW, DirectionOffset.Flip); sprite.LayerMapSet(CornerLayers.SW, sprite.AddLayerState(state0)); sprite.LayerSetDirOffset(CornerLayers.SW, DirectionOffset.Clockwise); - - if (component.Shader != null) - { - sprite.LayerSetShader(CornerLayers.SE, component.Shader); - sprite.LayerSetShader(CornerLayers.NE, component.Shader); - sprite.LayerSetShader(CornerLayers.NW, component.Shader); - sprite.LayerSetShader(CornerLayers.SW, component.Shader); - } } private void OnShutdown(EntityUid uid, IconSmoothComponent component, ComponentShutdown args) diff --git a/Content.Server/IconSmoothing/RandomIconSmoothSystem.cs b/Content.Server/IconSmoothing/RandomIconSmoothSystem.cs new file mode 100644 index 0000000000..4ddfb17ac8 --- /dev/null +++ b/Content.Server/IconSmoothing/RandomIconSmoothSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.IconSmoothing; +using Robust.Shared.Random; + +namespace Content.Server.IconSmoothing; + +public sealed partial class RandomIconSmoothSystem : SharedRandomIconSmoothSystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + if (ent.Comp.RandomStates.Count == 0) + return; + + var state = _random.Pick(ent.Comp.RandomStates); + _appearance.SetData(ent, RandomIconSmoothState.State, state); + } +} diff --git a/Content.Shared/IconSmoothing/RandomIconSmoothComponent.cs b/Content.Shared/IconSmoothing/RandomIconSmoothComponent.cs new file mode 100644 index 0000000000..6cdf167b29 --- /dev/null +++ b/Content.Shared/IconSmoothing/RandomIconSmoothComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.IconSmoothing; + +/// +/// Allow randomize StateBase of IconSmoothComponent for random visual variation +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class RandomIconSmoothComponent : Component +{ + /// + /// StateBase will be randomly selected from this list. Allows to randomize the visual. + /// + [DataField(required: true)] + public List RandomStates = new(); +} diff --git a/Content.Shared/IconSmoothing/SharedRandomIconSmoothSystem.cs b/Content.Shared/IconSmoothing/SharedRandomIconSmoothSystem.cs new file mode 100644 index 0000000000..5cb5299858 --- /dev/null +++ b/Content.Shared/IconSmoothing/SharedRandomIconSmoothSystem.cs @@ -0,0 +1,12 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.IconSmoothing; + +public abstract class SharedRandomIconSmoothSystem : EntitySystem +{ +} +[Serializable, NetSerializable] +public enum RandomIconSmoothState : byte +{ + State +} diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 7af9981255..1ab770812a 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -1109,6 +1109,11 @@ - type: IconSmooth key: walls base: mining + - type: RandomIconSmooth + randomStates: + - mining + - miningB + - type: Appearance - type: entity parent: WallShuttleDiagonal diff --git a/Resources/Textures/Structures/Walls/mining.rsi/meta.json b/Resources/Textures/Structures/Walls/mining.rsi/meta.json index 4ce4691c51..77f4322998 100644 --- a/Resources/Textures/Structures/Walls/mining.rsi/meta.json +++ b/Resources/Textures/Structures/Walls/mining.rsi/meta.json @@ -7,40 +7,72 @@ "y": 32 }, "states": [ - { + { "name": "full" }, - { + { "name": "mining0", - "directions": 4 + "directions": 4 }, - { + { "name": "mining1", - "directions": 4 + "directions": 4 }, - { + { "name": "mining2", - "directions": 4 + "directions": 4 }, - { + { "name": "mining3", - "directions": 4 + "directions": 4 }, - { + { "name": "mining4", - "directions": 4 + "directions": 4 }, - { + { "name": "mining5", - "directions": 4 + "directions": 4 }, - { + { "name": "mining6", - "directions": 4 + "directions": 4 }, - { + { "name": "mining7", - "directions": 4 + "directions": 4 + }, + { + "name": "miningB0", + "directions": 4 + }, + { + "name": "miningB1", + "directions": 4 + }, + { + "name": "miningB2", + "directions": 4 + }, + { + "name": "miningB3", + "directions": 4 + }, + { + "name": "miningB4", + "directions": 4 + }, + { + "name": "miningB5", + "directions": 4 + }, + { + "name": "miningB6", + "directions": 4 + }, + { + "name": "miningB7", + "directions": 4 } ] } diff --git a/Resources/Textures/Structures/Walls/mining.rsi/miningB0.png b/Resources/Textures/Structures/Walls/mining.rsi/miningB0.png new file mode 100644 index 0000000000000000000000000000000000000000..f65f066b65aa26487dec4d03b79e560239294cff GIT binary patch literal 1192 zcmV;Z1XufsP)Px(Vo5|nRCt`-TTN=*Fckh$x|&^(jAj$M8cd<|08@jHP>L^CdWRfB;P?Qg5X7uX zH+C(P-E5}|^=V{{JxMFI7XBbiMwa8~`RTpy{pbb@W3$!d*BC z!dKcZV$TFG|f7^z#N*UnHe{#&seq& zFW`ba0)6KBTa;yquIua^Aq1q9Q0g)GdC3UCRc|tM08o}C?(gqMTcYnflw}F6^*S_Q ziue$^u0@{jFbq#tC^Wtr9^m?ar4A^H0!kf5a~QiFu|+esLLOi+9UizEa5}Aw3DOqG z^BwB?!R~n>wv+R>+iesLNWuoVZ#K)sNd2Xhzr8?f$As8IO1T~;2$=mm4E-N}h7zG* z0T7k_n|~e%kLN=XWeaf5QB~Efn&$ZqN&!Vtpzn#$>}HwX|3t6=7|T$WCBA+8IvVf$ zpD4?6#Mb)0yKrSoBiIWJLyxv?C$Eu47~lQ@N*yi|9ZMrv0E}h0adz?i8#a^X7~fKe zq5&?Z7@P6!^@z`>q6twnz$Ysd)BEET(_iEM{~N(Za2R@rteivEckkXqO8I+^(Fm9D zq=G13K&i*8u{q`QT%@uEqG-T=zXt$IVW+}ZADr_jR5ldBEbQ*?jSbzVl9uOdCei68 zKVwkYP(-1^A3uIV-*+Po05H-5r4ARx4W%9z7eEvnKn#x-=2m(LsaSm<(RsjgNKFt? zcz_SLyhXqJRzDS&7{vyJ+`qI9NG2t=6r$t2>|B>5)pDOJrSYQ5G^SR5EZ_esqL?n3g6wmInf(`jtWzdL|6qC z9){l5>k0mMiWXg@Vhf_!0M7Yr^~TK;xLqEpgu_uZpsK2iw0K=VpsFe;^_X-t>@Llz+-1}CEc0000Px)cu7P-RCt`-ThD9bMil#?ycD7+LJ$O?lx_wOm`o<{{dS2AmHRA&XKV)F zZzD;P&Eo-lwpaa@En#DLKqf43QNZQC<+hEn0MGNJXR~7FW%K9oJWq=S)b0ccaq-#q z89v;%@%&ka(+dlLjiZx!Ve*GJZNOGBF8XJ(ITmns`RGPK6xYLjyYK-=Cv%)$SU1Ya zaX{u;EI^qEwOYH`k6(O@>+6330H+rgj!x!F{T8#B|#T#Z9 zzn?$L@cQKz4)<*w?k}G6Sp;$=?QOr)GJ~p6_5p;r`1@%S-~Kkav#)3woz4p|_KWK4 zm7&D~l4Lc7T}5t^Br(DQlocQgu}WaM&9W>lUR)JgEMRdzTOunWn_Fgj8)5;T=OK>A zD@jYae;&+iHk(FRfbte(+ji#rA7L;UlzaiDQ@HL903b~l_W;mr=Eqq|sq%SV6#4=D;aXTj<~)mv{(SYuL@dwAs9>H`)$N=z73}7^k!rm zqtQt9^~z9IK`Ar^Py;WeJF(E?|+o;Hj=S9;4sy z6+FNsXi>oFg(d9m%SU1nJjZVew1vg_F}I2Z`hFY3VN^&%l#bN=o(EfW!UzRapjya|l3QQ6`t* z0eV;g>&7VlCulL5J3=NGRbR^vn+$>dGNQ-aCZ4f`Q65RH%N#J#?l90RqG4> Y0~R0y=v@s6*Z=?k07*qoM6N<$f>*Mv2><{9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/mining.rsi/miningB2.png b/Resources/Textures/Structures/Walls/mining.rsi/miningB2.png new file mode 100644 index 0000000000000000000000000000000000000000..f65f066b65aa26487dec4d03b79e560239294cff GIT binary patch literal 1192 zcmV;Z1XufsP)Px(Vo5|nRCt`-TTN=*Fckh$x|&^(jAj$M8cd<|08@jHP>L^CdWRfB;P?Qg5X7uX zH+C(P-E5}|^=V{{JxMFI7XBbiMwa8~`RTpy{pbb@W3$!d*BC z!dKcZV$TFG|f7^z#N*UnHe{#&seq& zFW`ba0)6KBTa;yquIua^Aq1q9Q0g)GdC3UCRc|tM08o}C?(gqMTcYnflw}F6^*S_Q ziue$^u0@{jFbq#tC^Wtr9^m?ar4A^H0!kf5a~QiFu|+esLLOi+9UizEa5}Aw3DOqG z^BwB?!R~n>wv+R>+iesLNWuoVZ#K)sNd2Xhzr8?f$As8IO1T~;2$=mm4E-N}h7zG* z0T7k_n|~e%kLN=XWeaf5QB~Efn&$ZqN&!Vtpzn#$>}HwX|3t6=7|T$WCBA+8IvVf$ zpD4?6#Mb)0yKrSoBiIWJLyxv?C$Eu47~lQ@N*yi|9ZMrv0E}h0adz?i8#a^X7~fKe zq5&?Z7@P6!^@z`>q6twnz$Ysd)BEET(_iEM{~N(Za2R@rteivEckkXqO8I+^(Fm9D zq=G13K&i*8u{q`QT%@uEqG-T=zXt$IVW+}ZADr_jR5ldBEbQ*?jSbzVl9uOdCei68 zKVwkYP(-1^A3uIV-*+Po05H-5r4ARx4W%9z7eEvnKn#x-=2m(LsaSm<(RsjgNKFt? zcz_SLyhXqJRzDS&7{vyJ+`qI9NG2t=6r$t2>|B>5)pDOJrSYQ5G^SR5EZ_esqL?n3g6wmInf(`jtWzdL|6qC z9){l5>k0mMiWXg@Vhf_!0M7Yr^~TK;xLqEpgu_uZpsK2iw0K=VpsFe;^_X-t>@Llz+-1}CEc0000Px)cu7P-RCt`-ThD9bMil#?ycD7+LJ$O?lx_wOm`o<{{dS2AmHRA&XKV)F zZzD;P&Eo-lwpaa@En#DLKqf43QNZQC<+hEn0MGNJXR~7FW%K9oJWq=S)b0ccaq-#q z89v;%@%&ka(+dlLjiZx!Ve*GJZNOGBF8XJ(ITmns`RGPK6xYLjyYK-=Cv%)$SU1Ya zaX{u;EI^qEwOYH`k6(O@>+6330H+rgj!x!F{T8#B|#T#Z9 zzn?$L@cQKz4)<*w?k}G6Sp;$=?QOr)GJ~p6_5p;r`1@%S-~Kkav#)3woz4p|_KWK4 zm7&D~l4Lc7T}5t^Br(DQlocQgu}WaM&9W>lUR)JgEMRdzTOunWn_Fgj8)5;T=OK>A zD@jYae;&+iHk(FRfbte(+ji#rA7L;UlzaiDQ@HL903b~l_W;mr=Eqq|sq%SV6#4=D;aXTj<~)mv{(SYuL@dwAs9>H`)$N=z73}7^k!rm zqtQt9^~z9IK`Ar^Py;WeJF(E?|+o;Hj=S9;4sy z6+FNsXi>oFg(d9m%SU1nJjZVew1vg_F}I2Z`hFY3VN^&%l#bN=o(EfW!UzRapjya|l3QQ6`t* z0eV;g>&7VlCulL5J3=NGRbR^vn+$>dGNQ-aCZ4f`Q65RH%N#J#?l90RqG4> Y0~R0y=v@s6*Z=?k07*qoM6N<$f>*Mv2><{9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Walls/mining.rsi/miningB4.png b/Resources/Textures/Structures/Walls/mining.rsi/miningB4.png new file mode 100644 index 0000000000000000000000000000000000000000..1412f0026964552f50657b6c65ef5cb0c17fe7dc GIT binary patch literal 1446 zcmV;X1zGxuP)Px)U`a$lRCt`-ThD9bMilXKlGX`pgVHjzm3-Up z$bW?zknv$SLBHQe7)}5HQ4|%77jbglkZxBS2iye4nn;p){(N%Yz<0m=DgC`#IDm7W zUtPC@APAOup$IVo4v!Z~+SbAWrfF`>0gYvpi@i_J_+4&0qnoL=0MZd;8T zC14mv3IL2*NRrtbUl)solnv4jFbpHT>pu@b+5lNd4}ot#{}_8aukqu>9-=5hW651@ z+lKG^NRrud`T_=ne$MQG4#wlLZ1d8Pc0l{#CBk_FzaRfrct0AA;CUXx@Q?i6Y&Kn^ zx^+XzEKr`3Xugi)OvMSq2?m4y8k5rjN*r)<-pG6Qrd1l}{8r5GZ9&;INUOD~b-XyY zlcRKTf|3Xzae}z|ZN~X^tnY0?+5u%oMoU)F3A!ad5lX4BxMXFlSr9X*oUk=R;P7}+ zP-(<*Zdt8DU2?=G`Kt~{JD@7-({oy}U?bzVCIWz>I8im;MXjHDerqD&i;vzb5TSAc z)E&|esA7S{2^_}(fHkdOm+%J^5TOST?&D=*pxf;riXxb1miW5er|^BhP?yS7E4#Hq zW^0?YfI6W>50Lr%|6UIOfL^b+MsmtozWk2z#9|@0zb^~vB*>VR-&1nC$#?>(LUlp` z5n35>TY^J%MCa87B@tj*t>wuLGOU^Z0jmWPX#uX=foZn1hyZ1xD3ED>04jHN0HEK` z%7b84es=b%)+8w1c)Puu62YOBAU&7Y3FY$fcwGA|Q0p|vm{ofONKb=|Sujl#!{IO& zL8~CH3?0XT@B0PCxGqRLAW3HMJTE`WRxF$6iz9I;1VI4L^T0XZ4jvH4aX|=Kud_0q zB=abWw3r2y@__PExJnx=p8VJn9+0L*Jz#U)V%gS20ImC1@8$)aP<&5t97l@?P%;aA zvU7^}_YFLGoGxW@BNt2QI9n#1Jjy>8{2gyk1e{*n%atLzzSuYN9B_ENz{z=|u!nHK z7Ft9=?FS^K_2Bjh6CJ*i{r|IJ- z+8t0f;<`Nrv8>T(D49iScYtWbrfoKnQxuuzmPCN#tRIHFZe0!6ccX*XsdTm(0p2m#f%U z&>{lpzDhI|Q5IdbI4Ua(!!Xk4&p!p{(>IC$%W7dX3Z!#D?L&Yu3!G;sNH_g(icl`! zIvyZG++o_Z+q5-2po~qMtL6Kx;Q=zAmra8I0^6hPx)Wl2OqRCt`-Tfb`~M-={)tcuf}3b89|a5%zYMh#cEcwv#TG`Oft)U&3b3Y z8s6JC?|t*$Tfi_1g~H_F!%rvcURBq(bO@n}dc6+cznR`uL1`DYS`D2}2d?`W8jS`# z&kN@hLh$YVYXHDkKmDn+ws8g6b{W2Z1I7l^`%>h2qtU?0$q8Jy8jkt?4IXb7uvJtx z0DPqU3yNT@zwo)|d2roos34B5;sjU2obvj{6=2)t>9rJl`_Xx&L?x)g_!eNS4@#qB z^?Ducb~`p#RM6EhmkkBjb~&=Y0ifM(!*#3Zbb{@{*dS&dI)n#Opa91Dp`aqfF>d~g zw#d3Lt^nIE!*Lum8V&S%vrspgzFO6;n}V7 z`o|vUA$mc>>1Xs4lMzWeeaY zFB6$Xo*V#rJuej&pw$V=e4YO-UpbZ~L;eqFj{+i*kxy|l)60wn@CdL9IFYGTNGdEq z3lZ8XP7=@SJ3CKsad8gE*+4EA9dET-u8y2waXi8}}G0~YRAHb313tYDvCOSn>3gZ@_90laJzbK0XM31{^ zumCMgFi8oNc0mZ4^Iv?Pc^;s=1uV;gTM9y(Sit0=P6po|ja2(c1WO524(K~Hr< z0m@r|u|90Oyw)`hP~HN6{O~mZ;J3dXMG7003PG#Y0%Lu+ZWWYb8U=z#;5b28G#v$$ z74YH17+1p_E-ud_<8R-#(QGzB>HEld^vG=93bY)C`d?Pjrgyb`T`CpZtXHKc(DXvqigVx=e`KljUNauJ!Z0GVF_F4_`= zkW^TJvJ=ebEdY0T_55kL6+}gR|K%s)T(QLM-oM5#DX;)#1-yPY3=5>d%m)O5$D18Q z>YN51V6-+51PPU2zxy2H@i?*ll~L)oPJ3-b=77Wu~KF*th}$3+P71!~|+CmvoBM z_xX%*1teL3{L$2G?jUyJR7EPH0I(jJXPoD_~htq*958NFd+=M|+#f z>l@z!!B=A&bD#4NDHmQJKe*PizVYKQ?-5wH#ID+I{}1==6A-gv-!lLJ002ovPDHLk FV1kdcq8Px)U`a$lRCt`-ThD9bMilXKlGX`pgVHjzm3-Up z$bW?zknv$SLBHQe7)}5HQ4|%77jbglkZxBS2iye4nn;p){(N%Yz<0m=DgC`#IDm7W zUtPC@APAOup$IVo4v!Z~+SbAWrfF`>0gYvpi@i_J_+4&0qnoL=0MZd;8T zC14mv3IL2*NRrtbUl)solnv4jFbpHT>pu@b+5lNd4}ot#{}_8aukqu>9-=5hW651@ z+lKG^NRrud`T_=ne$MQG4#wlLZ1d8Pc0l{#CBk_FzaRfrct0AA;CUXx@Q?i6Y&Kn^ zx^+XzEKr`3Xugi)OvMSq2?m4y8k5rjN*r)<-pG6Qrd1l}{8r5GZ9&;INUOD~b-XyY zlcRKTf|3Xzae}z|ZN~X^tnY0?+5u%oMoU)F3A!ad5lX4BxMXFlSr9X*oUk=R;P7}+ zP-(<*Zdt8DU2?=G`Kt~{JD@7-({oy}U?bzVCIWz>I8im;MXjHDerqD&i;vzb5TSAc z)E&|esA7S{2^_}(fHkdOm+%J^5TOST?&D=*pxf;riXxb1miW5er|^BhP?yS7E4#Hq zW^0?YfI6W>50Lr%|6UIOfL^b+MsmtozWk2z#9|@0zb^~vB*>VR-&1nC$#?>(LUlp` z5n35>TY^J%MCa87B@tj*t>wuLGOU^Z0jmWPX#uX=foZn1hyZ1xD3ED>04jHN0HEK` z%7b84es=b%)+8w1c)Puu62YOBAU&7Y3FY$fcwGA|Q0p|vm{ofONKb=|Sujl#!{IO& zL8~CH3?0XT@B0PCxGqRLAW3HMJTE`WRxF$6iz9I;1VI4L^T0XZ4jvH4aX|=Kud_0q zB=abWw3r2y@__PExJnx=p8VJn9+0L*Jz#U)V%gS20ImC1@8$)aP<&5t97l@?P%;aA zvU7^}_YFLGoGxW@BNt2QI9n#1Jjy>8{2gyk1e{*n%atLzzSuYN9B_ENz{z=|u!nHK z7Ft9=?FS^K_2Bjh6CJ*i{r|IJ- z+8t0f;<`Nrv8>T(D49iScYtWbrfoKnQxuuzmPCN#tRIHFZe0!6ccX*XsdTm(0p2m#f%U z&>{lpzDhI|Q5IdbI4Ua(!!Xk4&p!p{(>IC$%W7dX3Z!#D?L&Yu3!G;sNH_g(icl`! zIvyZG++o_Z+q5-2po~qMtL6Kx;Q=zAmra8I0^6hPx&d`Uz>RCt{2TQO_fKotJmT0@m&a4sTRLJ7f^2a`bi144&VD1;W|xj&*yhOX(5 zrE|&HIfj-%A#~CZ$kM%vF{Yc0qh?U64t7xobB?SK$GUgn#M$2>$&!7(Pv70W_wGGF zF-+4;HZ~q7qDN}`Wf`5IVr^{=uInNQf|;JTZ5ywax&VM@?|+ioR!#t87It@c(Q38e zIMtcHb9Q!y`rZz%Ut1M)8r5r%yPK>)|8A`Gu)c>W5GQ^nRwf=*N-x38Q4#;nwN zWhx0_cm>8P<7*iTP(B30us?B~?qC+_d!49+6#B2v{gU zPyw=_oB+lwlmu6^X3ZqGubhCa0`6J{)6l{YO3wk=b^hkF*LK4G(??R;S580}_OZTh z!}r@$JI}#b1-{>wVg&*PFoYPh@OrsBw(SqU|DCwsteL2#`1KFR7cm^CI{u6b zji~S z0GWXF+s*6Gt2Tpyd$0p$_2);|8Yn;%NusF&@<0m(P>d066d+2177C!aq}nJTO+p@j zUJC`J-O@b%{OEZN6u@_A^7`|(Z5KiTWM80MF2kuH*XCxUu?^4j3ZVcpC|ld6Y0`sw zM39F-81})KC3GwT$V1@k+ZOs=3lWXij>Z5y8F;qvklaZKCar-DqtU@$}{ zDxr0fZ-3u)T^t>Kq&826G&>+~JRk@(i3b4b5Z59eFn{p?$_9lt3J~3^*Fpi5Lm?P7z~DZet1IaLt!#R(#qhSO&eMKoZqXj zUgsuIpqv24EPVO1IdeRL=OVmY)C(-?1s3%Jb6qc>O}e~lb67b6s?A~L1c)j?MwTd0 z00Kl6AY%mp3P6Bpy+9`_=}|BtS}&lL0&H8XUO)>&h%pPE=iQlKkgh9gG`3M+?n-H2 kxjW2r1Vp#ksp