From 590dc948ee87b1c1229235342cfe9bea2378aa2f Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Wed, 7 Jan 2026 06:51:44 +0100 Subject: [PATCH] Chameleon Projector Battery, Price Decrease (#42271) * init * fuck using * glowup * unused * meta * whuh * review * tests * Update SharedChameleonProjectorSystem.cs --- .../Power/Visualizers/PowerDeviceVisuals.cs | 3 +- .../Systems/SharedChameleonProjectorSystem.cs | 60 ++++++++++++++---- .../Prototypes/Catalog/uplink_catalog.yml | 4 +- .../Objects/Devices/chameleon_projector.yml | 48 +++++++++++++- .../Specific/Robotics/borg_modules.yml | 2 +- .../chameleon_projector.rsi/decharging.png | Bin 0 -> 6799 bytes .../Devices/chameleon_projector.rsi/icon.png | Bin 716 -> 6240 bytes .../Devices/chameleon_projector.rsi/meta.json | 18 +++++- .../chameleon_projector.rsi/powered.png | Bin 0 -> 8097 bytes 9 files changed, 116 insertions(+), 19 deletions(-) create mode 100644 Resources/Textures/Objects/Devices/chameleon_projector.rsi/decharging.png create mode 100644 Resources/Textures/Objects/Devices/chameleon_projector.rsi/powered.png diff --git a/Content.Client/Power/Visualizers/PowerDeviceVisuals.cs b/Content.Client/Power/Visualizers/PowerDeviceVisuals.cs index 5cc86d203d..057dabae5d 100644 --- a/Content.Client/Power/Visualizers/PowerDeviceVisuals.cs +++ b/Content.Client/Power/Visualizers/PowerDeviceVisuals.cs @@ -3,5 +3,6 @@ namespace Content.Client.Power; /// Remains in use by portable scrubbers and lathes. public enum PowerDeviceVisualLayers : byte { - Powered + Powered, + Charging } diff --git a/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs index 6c686ff555..bf6fea5b47 100644 --- a/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs +++ b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs @@ -14,6 +14,8 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager; using System.Diagnostics.CodeAnalysis; using Content.Shared.Damage.Systems; +using Content.Shared.Item.ItemToggle; +using Content.Shared.Item.ItemToggle.Components; namespace Content.Shared.Polymorph.Systems; @@ -34,6 +36,7 @@ public abstract class SharedChameleonProjectorSystem : EntitySystem [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] private readonly ItemToggleSystem _toggle = default!; public override void Initialize() { @@ -53,6 +56,7 @@ public abstract class SharedChameleonProjectorSystem : EntitySystem SubscribeLocalEvent(OnDeselected); SubscribeLocalEvent(OnUnequipped); SubscribeLocalEvent(OnProjectorShutdown); + SubscribeLocalEvent(OnProjectorToggled); } #region Disguise entity @@ -105,6 +109,18 @@ public abstract class SharedChameleonProjectorSystem : EntitySystem TryDisguise(ent, args.User, target); } + private void OnProjectorToggled(Entity ent, ref ItemToggledEvent args) + { + if (args.Activated) + return; + + if (ent.Comp.Disguised == null) + return; + + // We don't toggle here as this is only called when we subscribe to being toggled off. + TryReveal(ent.Comp.Disguised.Value); + } + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) { if (!args.CanAccess) @@ -136,6 +152,10 @@ public abstract class SharedChameleonProjectorSystem : EntitySystem return false; } + // We do a TryComp, so if the item has variations without ItemToggle, they can still be used just fine. + if (TryComp(ent.Owner, out var itemToggle) && !_toggle.TryActivate((ent.Owner, itemToggle), user)) + return false; + _popup.PopupClient(Loc.GetString("chameleon-projector-success"), target, user); Disguise(ent, user, target); return true; @@ -206,7 +226,8 @@ public abstract class SharedChameleonProjectorSystem : EntitySystem return; // reveal first to allow quick switching - TryReveal(user); + if (ent.Comp.Disguised != null) + ClearDisguise(ent, ent.Comp.Disguised.Value); // add actions for controlling transform aspects _actions.AddAction(user, ref proj.NoRotActionEntity, proj.NoRotAction, container: ent); @@ -216,7 +237,7 @@ public abstract class SharedChameleonProjectorSystem : EntitySystem var disguise = SpawnAttachedTo(proj.DisguiseProto, user.ToCoordinates()); - var disguised = AddComp(user); + var disguised = EnsureComp(user); disguised.Disguise = disguise; Dirty(user, disguised); @@ -246,21 +267,38 @@ public abstract class SharedChameleonProjectorSystem : EntitySystem if (!Resolve(ent, ref ent.Comp, false)) return false; - if (TryComp(ent.Comp.Disguise, out var disguise) - && TryComp(disguise.Projector, out var proj)) - { - proj.Disguised = null; - } + if (!TryComp(ent.Comp.Disguise, out var disguise) + || !TryComp(disguise.Projector, out var proj)) + return false; - var xform = Transform(ent); - xform.NoLocalRotation = false; - _xform.Unanchor(ent, xform); + ClearDisguise((disguise.Projector, proj), ent); + _toggle.TryDeactivate(disguise.Projector); - Del(ent.Comp.Disguise); RemComp(ent); return true; } + /// + /// Clears the disguise for the projector, allowing the user to immediately disguise again. + /// + /// The entity for which to clear the disguise + /// The disguised entity. + private void ClearDisguise(Entity ent, Entity disguised) + { + if (!Resolve(disguised, ref disguised.Comp, false)) + return; + + if (ent.Comp.Disguised == null) + return; + + var xform = Transform(ent.Comp.Disguised.Value); + xform.NoLocalRotation = false; + _xform.Unanchor(disguised, xform); + + ent.Comp.Disguised = null; + Del(disguised.Comp.Disguise); + } + /// /// Reveal a projector's user, if any. /// diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 6b56eced0d..c800eddab7 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -847,9 +847,9 @@ productEntity: ChameleonProjector discountCategory: rareDiscounts discountDownTo: - Telecrystal: 4 + Telecrystal: 2 cost: - Telecrystal: 7 + Telecrystal: 3 categories: - UplinkDeception diff --git a/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml index 9260574c66..e69b092afa 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml @@ -1,12 +1,18 @@ - type: entity parent: [BaseItem, BaseSyndicateContraband] - id: ChameleonProjector + id: ChameleonProjectorNoBattery name: chameleon projector description: Holoparasite technology used to create a hard-light replica of any object around you. Disguise is destroyed when picked up or deactivated. components: - type: Sprite sprite: /Textures/Objects/Devices/chameleon_projector.rsi - state: icon + layers: + - state: icon + - state: powered + map: [ "enum.PowerDeviceVisualLayers.Powered" ] + - state: decharging + map: [ "enum.PowerDeviceVisualLayers.Charging" ] + visible: false - type: ChameleonProjector whitelist: components: @@ -29,6 +35,44 @@ - type: StaticPrice price: 5000 +- type: entity + parent: ChameleonProjectorNoBattery + id: ChameleonProjector + name: chameleon projector + description: Holoparasite technology used to create a hard-light replica of any object around you. Disguise is destroyed when picked up or deactivated. + suffix: Battery + components: + - type: Appearance + - type: GenericVisualizer + visuals: + enum.BatteryVisuals.State: + enum.PowerDeviceVisualLayers.Powered: + Full: { visible: true } + Neither: { visible: true } + Empty: { visible: false } + enum.BatteryVisuals.Charging: + enum.PowerDeviceVisualLayers.Charging: + Charging: { visible: false } + Decharging: { visible: true } + Constant: { visible: false } + - type: BatteryVisuals + - type: ContainerContainer + containers: + cell_slot: !type:ContainerSlot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellMedium + - type: PowerCellSlot + cellSlotId: cell_slot + - type: PowerCellDraw + drawRate: 4 # About 3 minutes with a medium cell. + - type: ToggleCellDraw + - type: ItemToggle + onActivate: false + onUse: false + - type: entity categories: [ HideSpawnMenu ] id: ChameleonDisguise diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index f212354123..7ad58ef5eb 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -1655,7 +1655,7 @@ - state: icon-xenoborg-projector - type: ItemBorgModule hands: - - item: ChameleonProjector + - item: ChameleonProjectorNoBattery - type: BorgModuleIcon icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-projector-module } diff --git a/Resources/Textures/Objects/Devices/chameleon_projector.rsi/decharging.png b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/decharging.png new file mode 100644 index 0000000000000000000000000000000000000000..a818589da1118b57be9f81faebfd59d7eb8deeb8 GIT binary patch literal 6799 zcmdT|ZHQD=7#>lx4oXl&Vn3RSus_wEbIv{I-pcG_H(dfr$ucYK&dj~EsO*r7PLZ$( z(Z?SR`X!r@Q1m0Le)J=-jiN6Jp-cibOQVv_)B?+oWv%Bu_s-mVoY~pg6`A!6_v3uL z&-*;@`<^p!Uw&xGqB(3H%jI%&dKPyr!*c*v{_@Lk-+yD}W<0K_EPiZVE_d5abWN+i zwQzkdH|_iW?iKyZf(`k~GksC-nlRu0Y$eQx)!rz_=+5%gc!4wNYESt}IcU7U|yD zmm1M4yYM484+VVT&dm=aLWw{)48wQ`g+&D+@Gi`VE65YcK`<<7HHqXAjm_Wx&mQD_ zWz+QbR{BdhM)x?qd9Il2C{ION;u7YK2ntXGn(!ni(uhG4TI0lFUwzm6V=i~?jHX_y zYb!a1oAJRt&tsw_B8^b0f)c8zTrIhyxN?<7VTGcMctpiwG2$HKzLGTJYT?SVaAX-N z5Lk;MWYW`thM_BTAVXIwJOL;Kj5rsO2%SKbv?l`8EDTkdoGDZm^;JoQ8bQ@y1P@>X z)x<*t@kD*OVUofCqG&jIaRR|7A{rbClL!@E4ll<$MJwc&6B7iogk@48w=S1bBCQsW zc#f!eOrt)uBLW`rNSnq(4YoWqzBG?e2|oSsMkN$c>F{#w08gP2OD&lyXpfgk5Y5Lt zvP?h&u|?##^0fnLK7tT}S;7=y;c)4K5otzBASC`-8Y~BY^9w5ZN*bK}pojGFDz}$0q7Ig^*O! zK6V*{%xwBIC7H3u-TLgeU#LKsBI(oK*a88AR_Q!uKubQXrb2!$s~ z*jBZz3q}}B!NxZjYdyo6*wlkHW4vXUfSfvOg(9~mX-x+ zlW*PY43I6xX4n}t^ufhG2;N))9v>f7`1O|uLRI! z#WVof1C#AtkhH9p3j)fr?-Wp0OqS0j@CRwrrQX5B<=L0yQ|xFeY;v!&|?I&*C`16{h3lF|Kxb4Z+(_ee_h3l_ewB+i_4GRZOZtT0~y5W(Z2GoIldxp=w zbM~rlc8?xE+Bg5sRfF5Q|2uWI#_Z6@f@vdffB3^ApDw?K#(KJ!bnUqBsZIX_2}Qc* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/chameleon_projector.rsi/icon.png b/Resources/Textures/Objects/Devices/chameleon_projector.rsi/icon.png index ce20b5eeeed277078a03893f96e9ce1aa8ca518f..2d74fcfb85ba6d2e8b9fce94af65ced378f2465c 100644 GIT binary patch literal 6240 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 DWNLMK literal 716 zcmV;-0yF)IP)Ve(f0`5$t{2 zQJ;5q<9(N=&Xx8j&rhk=oA+w(%T{E&!WVrn$v=!=SA{-zNXG1u${pY+O+`$ZuXxoKlP3u5%GM z`91sz_-pJp%s*`b{P_A^H5$`a6X&mp~tHosQe7JccUjrvo2PjrY0wSNYe}dd}~2_0jny z`Q#6fd4%xGnMeH6ssR3U@^w|`$o*x-XOn-GZ-P@V7;;tleDmdC`~J+`+%sSwZ-SE- zVWxhYXTW8Cm-zA5%bz;~6eMSqouEugDp91_%5;4do~!;$KvjNMT;s=IFMl*_g%(w& ytp2_W06+fY+n*vtqDV?IC|kxXW{eplVT2+QvK6yoEHh&kV=W{WTM-T^ zOIjo$OVL3HNuuXB>XhE+yytn(=kq@QonglOuKRm^uj~Ha*LDBq9+8&&j75bv3xhx) zQBxDV74Wwjc!GrlfLHu^?r{)kO<#bu9ove)1v8j*SE?5U%=Twcz!X2KD+uKG@`5z<8KdX~V}6v@6lqfo6IrA=iYgpee6B-}`lPTI`62 zD&)2XD-XW)$V-pwUTKepriyy!zZB0dE|fV#CugAz2j-4sFs^;D(>vNSIkPxEFxRkp zr&y}nLbgP6{@%f<5s~Y`7mqIbUd|VJX171j;NHICyZfvk4juo(30>%XuK7GEy_7LJ zb*)z?IlWhsd*ophX(8zF{KB}BwS`VcMxHGz_zv`Tkd);BH>=z~p?7|Nzx^Bk;Mi&G zJzE3)MeFRLY?~{+`{yP{(bi3inkt;2o_OsEPk2LYgWlHGh1PltdgRe^W|ebmQ+`9> z(U$S9xkXM#@~g3;if)1Jvd*cWd-~^3p_vJ`y|JRS`}Co*%F=por5Az6oH9oHe5aaL z+2Km_{M}kV?(7M&C+@HfZ?K}}j2GHp$zzTrR%h2k0^`ebpRYc@(Qk+G!`Rz{v*jaI zubLA@Jl|g2&bqb5+QetJ_s+st+t?ayncuwkxs&Hu zvk}^@Cn#VlqRIj@Q~ab=oB7t>&3TyBHO6%+)9mJyO5KRsH*EPhXKyJbY|rz&E?6P; zVTmCszo&AZG5PM{tk_fL=jzYry6(j~EbhKhX;LrqM$jY3dT?G6Gnggl3bu6+@LA0d zX0Lvfmh8Ag^^(Y=G@Ie5!*&!g22zj+exZKu{hXlhSN!{pudF=3LSHqZnW~rO>ELrK z%kSyG&%d*<0@a=G`FvVI(p%anSZ%C9#*6029xHq#MH|ZFdY5V3p5|+4r3NI$x5Xh&KPwnKtqBYyw3#*;*?C~9g)kwFndAaL3+kRJMY=R zs~tMlC`Zn_rrl;$_TBddN@K>(${oGgE>)F#yL{n&e^m#+u*<}ws%HLUb$P*_vYtaN z@x~5v+z^I$(kpPajn3)YYJta*frilyR?fq}4=7dnJ7)W?>gBwC9s(V;FfgAFdjETC zRjc@T+g0`Ei?ZFh3DFlX;QNG9@5q|1>wj5txRPA$FnNpP8kqEw_WGmE3T95ryJ})^ z;KhSq$VMKNK=e&e@~$$2O**bKuGKXE0Q+^NQs)4 z6X};)ZA?VOx}r)t{m&>7r1oHIX4UBvS0^O$lIjl%5wBmnqMqluW=g}&!t!$P6(Rms zq_y*2@RYmy`v=d(R>bNNix_;xGhrwQ^Vz)`sm^C&*2Ilvjd{L({ytdLOM+-%?gpcj zY+)~ft7Vrv8xW>$#fMKv=v9QOh`rdcv9jB)@%)M1KAG3IH3bHqYr5BGga)xP%2{DM zOkdBwYPK=Fog$5`F6#^};B(mXI`>!)pMdQ89n6q4(S|7F+F`qOZ!E%MINGVLli5!` z+e0=tX+`PZO%3o;?@1quL}kQU?7r%K?5xV=wl|m&C9|lsrvut^&BeH;?4JBMv#9G2 z3^ql}Bn%e4nNQ+l2`3rX1!n5m6`e^NCS~WgtGv}dbV>M@+Q}V$HCNO^MM_>IOB&BO z>4;foQ-oI^NTv3sfNd1_q7^Fapr_k3MYOJ;fAom?_;C6V`_Sz2 zG4I$H-Qe*fqSpr78tX6I)#dlF)ZvRT04vMfs_A+hG;z~<>l{YAMWy4lX!{|?8YNMr z3Y5Jn?W4F#^d6<=>DFnVHpvX5vHmUb>q^O~)(vTJB?9+EoU_&;!qjUbEn}6oYScgs zrD*s?xS-&0ZDyzwQ#Mxj1kOfFw|eN2kxE)Kex|;1*%h(MdOezWrCX(F?R=@8f(~m9pWQ}Nkywxg%o)Z za@Ij7^0T=6M>n&Fk}B21SL0JhXzYvL&-gfQhP8w%c;9ySs>+bj4XC6(_YZ5j0&PtM zrQ1?`ht`WAG`4NhK`Y&hCQ*#Ml3x}NRDIg}Ha|X6`ow)IF_Rmj(B3g}8{PiOOzqM} zYK7Mxx0&5{_6KN2gw>b0Yj%`KuRAQgr!z7JF95C%G%>WTy}|r)oP0WG@>H7fpx6D5 zt992z&t>&}9O!?Om4DHdJYYsGj5910XnHGCOUS%~${|abUnn@_-gJe6laOc-S+O(! zyhEgiWJPOavgA`*f{KJnciwrg+7#fU42Oet)G$OMo1%I6iFtSHS|6X=0{ zfC|W(J1o3<*f>G2<=DWb*L+(}f6ReZD|LD$mMU4DQfv2Xc(d&x2Ak_gP`@;;+rOfD z*AB428FQ;n9O`o4Td$rSPpkMF1#XzSAs1@WBt|xWy5vF_+-)Wsx?fd0?VV0z_l`A$ z7MI^bU^5ze7Efl>Hte2ztUgITE+&6un_zMD5pdY&oo#9BB4&^)RU?P=%Nyz?<7A@n zIpd z^{)DCrCyyd#j2Epj3T;$`3V0f$j1ydJbhIsC}j1{8`&6Xm&TByx+Bto-F8Lw9r8)~ zlXcDQlVe71w~9Y)J!ukQ|0D$Ys(a|zN#*Xw$O^aBVS4#jpVZdL2>7W;_z>5>EzB2@ zO_SKa0_jd{SCop_)f^qCL`Q|nec>3yZ{7r&(vR(%yWA+^98xxE(@~byf6HW02+wtJ zzrWI8uch+if(u`t6tuPUcjC9l`_G<*5Bsf)(8jz=Gopi3)|=>JbSo)&C&dffL?0R~Gk4|sYMn*Z&YU?IX6Uq0gyt1rFgGEY z4bQ}%+@5tvm;X!XlZ?~*g!kW=4vH31w$|_4PJD9Bn$Jzu6Yj+9`Ly!X^rMN;EFX@# zh^%CIqW;KLvsYPycJ75|&-|95IxK+S;DZ@%4NgpX^D;KC;moNBt;;V?`a~|eh?yA| zQz9qD@2JQYU+iO^SSQVWU9?9_4=I!QRz2R-t|5{hbGaiRvKn=1$~@BuYxMP0&Kp!m zU;ZA=HI+hdB%Cd#xi;3bm9>0@6m~YJtipiwon(GHBBofUKO$@IErp568G$7Wg>BQw zg}23B@socvIO8a^mJ>H7eLATbozU^(!4{(oEk=px^qqwCPLb2`B1YSQh07wX*(4no z5_%LSp+IW%2v!ll$#o>A5K~V)ehXv4&TUbt9^GT!C)_F25n?`8fHs^`Bnl?V^JSza zhd3BkD6fWZEl|vPzMwr~{G?NE^FIF3`1nuKa0=pdB5G531P<=n71j(ILhdY*(A_tF zFm3zJ-^g`1&7n{Q6HH#n|qQL?x5{J!+hzt>z@@jM zHhmALw@~#?;`Vt*T99My9>0o&M{NR1*G{QRY~1+qKF)yebm|=`r8Vdp#9gOSOM}mI z+WrZu@gZ{X@ZICdHHZk#)`6n}M}p1n$$her`#KZ(TDd;B{p$*K`Wc-E=Nei;pcN5R zLqkhbL&HA~JHQd=LU4T5-dan^dW!?zMrvz)#W{_Z7u8QjY46z(?UGTv!GQzwf431y zHL-HqvZ^CAOfK3+aHHEHS*KO{6MS`gyDmr`%Bq`BFo>3h;(B7I-eW4ca$uyI8LC1F zWK(p?8mHvSx=x(fu#;c>K5XTB%^7?EoUiqBc{VM#LZ$V?`}v~JNtF*k=_a@acCA7W zIIXjo-7;TCuuYKcXZ8DpX_$Ozk>lSFE3_MRDGRfIU>TVmsTh^J z|85+|zOS<0{>D?gk+d(zGb&3G-ePa8t1ArWPY{>Sj6kRrh+jFRSdWitA#GihZ%E&E z&g>>a8Y5+ST=>Cc*w>oz&XnUhrf5}3zH(=;d6J~i`<2b*-bdxSe5d#)^!N@sbUAy2 ziqf+>x*P_DhI<7xZg!=K7+{a zwhz(OHS#dqtWi!Zcb45U)|>YH%Mp-_B{SUOy7~{<1&1PVsP%f9N!PV5DGu@zY3;3+H;lgeOI=`=8plR%_%*t!Y|z&Q9jIWS5x@&kFuj&AWD=C(Mezm_VFAqWU+`?I>(2%HWj?%-e@g@i_k;fz z^dEXH<+7wJ7EdQ}ctK6^x(d8}v1B@lO2#g|)uK?~2yKKbgoM;0L69&641z&wxk5Av z+9V`e+f`c&j$TG(N@KAJG!lhJ1(0h{0Uk0Og`$w)WC#X<(t;pSnivRC3yp#h2yik< z6G0)u;jYUlESOZF69`_*v*J;a0V*PlNI;X&?|wBV-bGH^4~%%8lwxaHBvOG`FPz-ojvk=>XCac-;Xo zFWG_FU=5iR0-MgXrqjK26?oZ#d6Y{{1;%}E7pxhbwB)!1rjU6Z_r2!~2yW1&OC0pC z!2iZ{z@5&e{oi#BZ{CJiU0^OZexJn?eIV_i=#(b&GqvI&c^lAnrBB zgTC^9E>&eG0+!Vb6MGg2q@l=ruJF5}=L;AG*{0@3g1@g2SR;oem^HZo-?<2y;`Ocl zUXDG7d(^_D1uV>)ycbQ0cr5`C!2mV$4U(t6zTB3q4h=zIgHI?77sBV;Y^M6G$)hVzD9?id&jB}2}gsc75 zvnR}xGABO`%&+NEVVy7kq_ohS*fB)tdROASv3Jwp!`Ni8KXP`8m4h#U7=gmu+<7Kb MqkZ_B1}>rh0)7B4Qvd(} literal 0 HcmV?d00001 -- 2.52.0