From 0cd76c7baca78ab3ea821397d38508f632506be6 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:04:21 +0000 Subject: [PATCH] Add industrial smelters (admin only) (#43651) * Initial commit with shredder base functionality * Fix items being deleted and make items continue moving after a grid tile gets deleted * Make a bunch of previously unpullable/unrecyclable things work * temp commit * Fix the recycling hitbox to actually be good code * Fix material spawning via tiles * Finish up the prototype visuals for the shredder * SHRED EVERYTHING * Add reduced efficiency for recycling with shreder * Fix miss in conflict merge * Make more things pullable * Update shredder textures to look different to recyclers * Remove unused * "fix" repairability and sprites * Update sprites, set up TODO-s * Fix switches, description * Fix up some comments * Add "Do Not Map" to the smelter * Add to meta.json * Review fixes * Review changes * Review changes * Remove readonly in new system * Aaaand partial class * Fix the final test issues * Update and resolve merge conflicts * Update the impulse strength to match new mass values * Fix issues after merge conflict * Update size, fix physics resolve errors, prevent computers/circuitboards from being deleted * Review comments * Fix tiles giving steel * Add a todo about tilestacking --- .../Tests/Materials/ReclaimerLoopTest.cs | 6 +- .../Materials/MaterialReclaimerSystem.cs | 14 +- .../Materials/MaterialStorageSystem.cs | 12 +- .../Materials/ServerTileReclaimerSystem.cs | 26 ++++ Content.Shared/Maps/ContentTileDefinition.cs | 7 + .../Materials/TileReclaimerComponent.cs | 77 ++++++++++ .../Materials/TileReclaimerSystem.cs | 141 ++++++++++++++++++ Resources/Audio/Effects/attributions.yml | 5 + Resources/Audio/Effects/grind.ogg | Bin 0 -> 21151 bytes .../Entities/Objects/Misc/implanters.yml | 6 +- .../Entities/Structures/Furniture/carpets.yml | 2 + .../Structures/Lighting/base_lighting.yml | 1 + .../Entities/Structures/Machines/recycler.yml | 134 ++++++++++++++++- .../Piping/Atmospherics/special.yml | 6 + .../Entities/Structures/Power/apc.yml | 9 ++ .../Entities/Structures/Power/substation.yml | 22 ++- .../Storage/Closets/base_structureclosets.yml | 9 ++ .../Structures/Wallmounts/Switches/switch.yml | 13 +- .../Structures/Wallmounts/base_wallmount.yml | 11 +- .../Entities/Structures/Walls/grille.yml | 12 +- .../Entities/Structures/Walls/walls.yml | 7 + .../Structures/Windows/plastitanium.yml | 10 ++ .../Entities/Structures/catwalk.yml | 17 ++- Resources/Prototypes/Tiles/floors.yml | 2 + Resources/Prototypes/Tiles/plating.yml | 4 + Resources/Prototypes/tags.yml | 3 + .../Structures/Machines/smelter.rsi/meta.json | 39 +++++ .../Machines/smelter.rsi/smelter0.png | Bin 0 -> 16309 bytes .../Machines/smelter.rsi/smelter1-0.png | Bin 0 -> 17967 bytes .../Machines/smelter.rsi/smelter1.png | Bin 0 -> 18001 bytes .../Machines/smelter.rsi/smelter2.png | Bin 0 -> 16925 bytes 31 files changed, 557 insertions(+), 38 deletions(-) create mode 100644 Content.Server/Materials/ServerTileReclaimerSystem.cs create mode 100644 Content.Shared/Materials/TileReclaimerComponent.cs create mode 100644 Content.Shared/Materials/TileReclaimerSystem.cs create mode 100644 Resources/Audio/Effects/grind.ogg create mode 100644 Resources/Textures/Structures/Machines/smelter.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/smelter.rsi/smelter0.png create mode 100644 Resources/Textures/Structures/Machines/smelter.rsi/smelter1-0.png create mode 100644 Resources/Textures/Structures/Machines/smelter.rsi/smelter1.png create mode 100644 Resources/Textures/Structures/Machines/smelter.rsi/smelter2.png diff --git a/Content.IntegrationTests/Tests/Materials/ReclaimerLoopTest.cs b/Content.IntegrationTests/Tests/Materials/ReclaimerLoopTest.cs index 310401ed59..94ab23df03 100644 --- a/Content.IntegrationTests/Tests/Materials/ReclaimerLoopTest.cs +++ b/Content.IntegrationTests/Tests/Materials/ReclaimerLoopTest.cs @@ -37,6 +37,9 @@ public sealed class ReclaimerLoopTest : InteractionTest var reclaimComp = Comp(Target); + // Put a floor tile down + await InteractUsing(FloorTileId); + // Power the reclaimer await SpawnEntity(ApcId, SEntMan.GetCoordinates(TargetCoords)); await RunTicks(1); @@ -49,9 +52,6 @@ public sealed class ReclaimerLoopTest : InteractionTest // Check that reclaimer enabled Assume.That(reclaimComp.Enabled, "The reclaimer did not get or stay enabled"); - // Put a floor tile down - await InteractUsing(FloorTileId); - // Reclaimer can't reclaim materials? Job's done. if (!reclaimComp.ReclaimMaterials) Assert.Ignore("Cannot reclaim materials"); diff --git a/Content.Server/Materials/MaterialReclaimerSystem.cs b/Content.Server/Materials/MaterialReclaimerSystem.cs index 1a57f539cc..81e8f9de73 100644 --- a/Content.Server/Materials/MaterialReclaimerSystem.cs +++ b/Content.Server/Materials/MaterialReclaimerSystem.cs @@ -210,19 +210,7 @@ public sealed partial class MaterialReclaimerSystem : SharedMaterialReclaimerSys _materialStorage.TryChangeMaterialAmount(reclaimer, material, outputAmount, storage); } - foreach (var (storedMaterial, storedAmount) in storage.Storage) - { - var stacks = _materialStorage.SpawnMultipleFromMaterial(storedAmount, - storedMaterial, - xform.Coordinates, - out var materialOverflow); - var amountConsumed = storedAmount - materialOverflow; - _materialStorage.TryChangeMaterialAmount(reclaimer, storedMaterial, -amountConsumed, storage); - foreach (var stack in stacks) - { - _stack.TryMergeToContacts(stack); - } - } + _materialStorage.EjectAllMaterial(reclaimer, xform.Coordinates, storage, true); } private void SpawnChemicalsFromComposition(EntityUid reclaimer, diff --git a/Content.Server/Materials/MaterialStorageSystem.cs b/Content.Server/Materials/MaterialStorageSystem.cs index 86df5a6e28..1465784bbf 100644 --- a/Content.Server/Materials/MaterialStorageSystem.cs +++ b/Content.Server/Materials/MaterialStorageSystem.cs @@ -224,11 +224,13 @@ public sealed partial class MaterialStorageSystem : SharedMaterialStorageSystem /// The entity with storage to eject from. /// The position where to spawn the created sheets. If not given, they're spawned next to the entity. /// The storage component on . Resolved automatically if not given. + /// If true, spawned stacks will attempt to merge with existing stacks in the area. /// The stack entities that were spawned. public List EjectAllMaterial( EntityUid entity, EntityCoordinates? coordinates = null, - MaterialStorageComponent? component = null) + MaterialStorageComponent? component = null, + bool mergeContacts = false) { if (!Resolve(entity, ref component)) return new List(); @@ -242,6 +244,14 @@ public sealed partial class MaterialStorageSystem : SharedMaterialStorageSystem allSpawned.AddRange(spawned); } + if (mergeContacts) + { + foreach (var stack in allSpawned) + { + _stackSystem.TryMergeToContacts(stack); + } + } + return allSpawned; } } diff --git a/Content.Server/Materials/ServerTileReclaimerSystem.cs b/Content.Server/Materials/ServerTileReclaimerSystem.cs new file mode 100644 index 0000000000..0b975ece79 --- /dev/null +++ b/Content.Server/Materials/ServerTileReclaimerSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Materials; +using Content.Shared.Maps; + +namespace Content.Server.Materials; + +/// +public sealed partial class ServerTileReclaimerSystem : TileReclaimerSystem +{ + [Dependency] private MaterialStorageSystem _materialStorage = default!; + + protected override void SpawnMaterialsFromComposition(Entity ent, + ContentTileDefinition tileDefinition, + float efficiency) + { + if (!Resolve(ent, ref ent.Comp1, ref ent.Comp2)) + return; + + foreach (var (material, amount) in tileDefinition.MaterialComposition) + { + var outputAmount = (int) (amount * efficiency); + _materialStorage.TryChangeMaterialAmount(ent, material, outputAmount, ent.Comp1); + } + + _materialStorage.EjectAllMaterial(ent, ent.Comp2.Coordinates, ent.Comp1, true); + } +} diff --git a/Content.Shared/Maps/ContentTileDefinition.cs b/Content.Shared/Maps/ContentTileDefinition.cs index 72c2f33588..cdfc5cf5b4 100644 --- a/Content.Shared/Maps/ContentTileDefinition.cs +++ b/Content.Shared/Maps/ContentTileDefinition.cs @@ -1,4 +1,5 @@ using Content.Shared.Atmos; +using Content.Shared.Materials; using Content.Shared.Movement.Systems; using Content.Shared.Shuttles.Systems; using Content.Shared.Tools; @@ -132,6 +133,12 @@ public sealed partial class ContentTileDefinition : IPrototype, IInheritingProto /// [DataField] public bool EditorHidden { get; private set; } = false; + /// + /// If this tile is reclaimed, what materials would come out of it? + /// + [DataField] + public Dictionary, int> MaterialComposition = new(); + public void AssignTileId(ushort id) { TileId = id; diff --git a/Content.Shared/Materials/TileReclaimerComponent.cs b/Content.Shared/Materials/TileReclaimerComponent.cs new file mode 100644 index 0000000000..aee15adeba --- /dev/null +++ b/Content.Shared/Materials/TileReclaimerComponent.cs @@ -0,0 +1,77 @@ +using Content.Shared.Maps; +using Content.Shared.Whitelist; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Materials; + +/// +/// Makes an entity into a grid reclaimer, able to delete grids in front of it and produce materials. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(fieldDeltas: true), AutoGenerateComponentPause] +[Access(typeof(TileReclaimerSystem))] +public sealed partial class TileReclaimerComponent : Component +{ + /// + /// An "enable" toggle for things like interfacing with machine linking. + /// + [DataField, AutoNetworkedField] + public bool Enabled = true; + + /// + /// A master control for whether or not the reclaimer is broken and can function. + /// + [DataField, AutoNetworkedField] + public bool Broken; + + /// + /// A whitelist for what grid entities can be affected by this reclaimer. + /// + [DataField, AutoNetworkedField] + public EntityWhitelist? Whitelist; + + /// + /// A whitelist for what grid entities can be affected by this reclaimer. + /// + [DataField, AutoNetworkedField] + public EntityWhitelist? Blacklist; + + /// + /// The delay after a grid has been consumed that it can recycle again. + /// + [DataField, AutoNetworkedField] + public TimeSpan RecycleDelay = TimeSpan.FromSeconds(0.3f); + + /// + /// The bounding box in local coordinates for where it will check for grids to reclaim. + /// + [DataField, AutoNetworkedField] + public Box2 RecyclingBox = new(-0.5f, 0.5f, 0.5f, 1.5f); + + /// + /// Multiplier for the material being extracted from the tile, as defined in the tile's + /// + [DataField, AutoNetworkedField] + public float Efficiency = 1f; + + /// + /// How strong impulse the reclaimer should apply to a grid after it has destroyed one of it tiles. + /// This helps guide the grid further into the reclaimer. + /// + [DataField, AutoNetworkedField] + public float SlurpStrength = 1600f; + + /// + /// Next time a recycling attempt can be made. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadOnly)] + [AutoNetworkedField, AutoPausedField] + public TimeSpan NextRecycle; + + /// + /// The sound played when something is being processed. + /// + [DataField, AutoNetworkedField] + public SoundSpecifier? Sound; +} diff --git a/Content.Shared/Materials/TileReclaimerSystem.cs b/Content.Shared/Materials/TileReclaimerSystem.cs new file mode 100644 index 0000000000..556add2666 --- /dev/null +++ b/Content.Shared/Materials/TileReclaimerSystem.cs @@ -0,0 +1,141 @@ +using Content.Shared.Conveyor; +using Content.Shared.Maps; +using Content.Shared.Whitelist; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; + +namespace Content.Shared.Materials; + +/// +/// Handles interactions and logic related to . +/// +public abstract partial class TileReclaimerSystem : EntitySystem +{ + [Dependency] private SharedAudioSystem _audio = default!; + [Dependency] private SharedTransformSystem _transform = default!; + [Dependency] private IGameTiming _timing = default!; + [Dependency] private SharedMapSystem _mapSystem = default!; + [Dependency] private SharedPhysicsSystem _physics = default!; + [Dependency] private EntityLookupSystem _lookup = default!; + [Dependency] private TurfSystem _turf = default!; + [Dependency] private EntityWhitelistSystem _whitelist = default!; + + [Dependency] private EntityQuery _physicsComponentQuery = default!; + + [SubscribeLocalEvent] + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextRecycle = _timing.CurTime + ent.Comp.RecycleDelay; + DirtyField(ent.Owner, ent.Comp, nameof(TileReclaimerComponent.NextRecycle)); + } + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var tileReclaimer, out var xform)) + { + if (tileReclaimer.NextRecycle > _timing.CurTime) + return; + + Update((uid, tileReclaimer, xform)); + } + } + + private void Update(Entity ent) + { + ent.Comp1.NextRecycle += ent.Comp1.RecycleDelay; + DirtyField(ent.Owner, ent.Comp1, nameof(TileReclaimerComponent.NextRecycle)); + + //TODO: The recycler is hardcoded to rely on the conveyor component for its powered state, and this system is based on the same functionality. That should be fixed into a more general solution for both systems, but for the sake of consistency I'm not doing that now. + if (!TryComp(ent, out var conveyor) || conveyor.State == ConveyorState.Off) + return; + + var reclaimerGrid = _transform.GetGrid((ent, ent)); + + if (reclaimerGrid == null) + return; + + var mapPos = _transform.GetMapCoordinates(ent); + + var grids = new List>(); + + var entMatrix = _transform.GetWorldMatrix(ent.Owner); + var box = entMatrix.TransformBox(ent.Comp1.RecyclingBox); + + _mapSystem.FindGridsIntersecting(mapPos.MapId, box, ref grids); + + var shredded = false; + + foreach (var grid in grids) + { + if (TerminatingOrDeleted(grid) || EntityManager.IsQueuedForDeletion(grid)) + continue; + + if (grid == reclaimerGrid) + continue; + + if (!_whitelist.CheckBoth(grid, ent.Comp1.Blacklist, ent.Comp1.Whitelist)) + continue; + + var intersectingEntities = new HashSet(); + + foreach (var tile in _mapSystem.GetTilesIntersecting(grid.Owner, grid.Comp, box)) + { + var tileDef = _turf.GetContentTileDefinition(tile); + if (tileDef.Indestructible) + continue; + + intersectingEntities.Clear(); + _lookup.GetLocalEntitiesIntersecting(tile.GridUid, tile.GridIndices, intersectingEntities); + + foreach (var entityOnTile in intersectingEntities) + { + if (!_physicsComponentQuery.TryComp(entityOnTile, out var physicsComp)) + { + // Marker/Spawn entities and similar don't have physics, so we just plain remove them. + QueueDel(entityOnTile); + continue; + } + + _physics.SetCanCollide(entityOnTile, true, body: physicsComp); + _physics.ApplyLinearImpulse(entityOnTile, _physics.GetLinearVelocity(grid.Owner, Transform(entityOnTile).LocalPosition), body: physicsComp); + } + + _mapSystem.SetTile(tile.GridUid, grid, tile.GridIndices, Tile.Empty); + // TODO: Ideally this should be using tilestacking to get materials out of every tile in the stack, as opposed to the top one. Not doing it right now as it may be reworked however. + SpawnMaterialsFromComposition((ent, null, ent.Comp2), tileDef, ent.Comp1.Efficiency); + shredded = true; + + // If it was the last tile, grid's probably gone + if (TerminatingOrDeleted(grid)) + continue; + + // We suck in the grid slurrrrp + // TODO: This can probably be refined, as it applies a stacking speed which could theoretically get out of hand if a grid is very long. + _physics.ApplyLinearImpulse(grid, ent.Comp1.SlurpStrength * _transform.GetWorldRotation(ent.Comp2).ToWorldVec(), tile.GridIndices); + } + } + + if (!shredded) + return; + + _audio.PlayPvs(ent.Comp1.Sound, ent); + } + + /// + /// Spawns materials from the of the given tile. + /// + /// Entity performing the spawning action. + /// Tile definition of the tile being reclaimed. + /// Multiplier of the material amount. + protected virtual void SpawnMaterialsFromComposition(Entity ent, + ContentTileDefinition tileDefinition, + float efficiency) + { + // Handled on the server because that's where MaterialStorageSystem is. + } +} diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index b842eb7b6c..d3a5cf94b7 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -276,3 +276,8 @@ copyright: "by petercornell (Freesound), sampled and sped up to 400% by whatston3 (GitHub)" license: "CC0-1.0" source: https://freesound.org/people/petercornell/sounds/837240/ + +- files: ["grind.ogg"] + copyright: 'modified by SlamBamActionman (Github) from "01-1 Angle Grinder.wav" by domiscz of Freesound.org' + license: "CC-BY-SA-3.0" + source: https://freesound.org/people/domiscz/sounds/461728/ diff --git a/Resources/Audio/Effects/grind.ogg b/Resources/Audio/Effects/grind.ogg new file mode 100644 index 0000000000000000000000000000000000000000..95b69bf6e50207083c24ed772a7d524bc204d2c2 GIT binary patch literal 21151 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/smelter.rsi/smelter1-0.png b/Resources/Textures/Structures/Machines/smelter.rsi/smelter1-0.png new file mode 100644 index 0000000000000000000000000000000000000000..a463a2be4432fc850f6196506d99d172d506dec1 GIT binary patch literal 17967 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/smelter.rsi/smelter1.png b/Resources/Textures/Structures/Machines/smelter.rsi/smelter1.png new file mode 100644 index 0000000000000000000000000000000000000000..735198a3ca2edff440bc63d074ca663d6e061e7d GIT binary patch literal 18001 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 bLmMF2zMS}@AoUS+00LZ3KaZpCOIH2|QUN%6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/smelter.rsi/smelter2.png b/Resources/Textures/Structures/Machines/smelter.rsi/smelter2.png new file mode 100644 index 0000000000000000000000000000000000000000..290f55271737ac93236bc716fd0c4b313abaa3b3 GIT binary patch literal 16925 zcmeI3dsGu=7QjaYd{S+35tT{|qO>|>GI^0PL}&sgT_TjG6?%MO)EUKt-%5)hcyYtzzv;Z7V)@k^l)GVGcd*AA9yp&Vl59 z_q+Fg-|ybJ-^?GgI&JQpkdYHdLJ$<9RLIk*Zx;2JFg%$0|I9kacIs<{MUiQPpi!Z& zzadb?mT(A)kJhU*>=~*Qj4&HxajjWH#yX7_YBmH(W;-o7kx$xL8ZuXJif8}0XCIrT z*T%Ew2~>#6A|vzkiefAIWbs@zQJhbRwd~o_krF3HIWUrToaHncOg79J&vyI8sNb$( z4x8nkV$Y9fC%OW%GE`|Snb}IR1hGPxK!hTeNF2)*h(vtROcsi81ssIO;UO@}!}tis zM_Jt;wsa)*OJddPuylEHcQ{IlXXn}N7L3CwEG&#INXqvPF5E^!SmJHo~g6*!5-;%jFl>m>u?bHro}b_tU*Eqop^H$=1z|qR4UL77jNS z;rKJs61_GSht=R-nwH>@2GU5H>^91d>(|bbXSSPddFBB^_NoUAOyxwS>W%Gpy+)(o z&^CKg0fnF&sb5Q*y2wIu(n*`yVI|0<0%|K!{&sKI>%7V7p{qp$=p@NikYW3Y0ZVUML3#0=>*GgDU^=tah})%lBc4lgET&uu$2;gVv$v`+nb}~rQp+NxJPF6&uwN^= znQ*wuI?+UsHYyo5pCnPKa$mTQ;kkWBdlUw})YCS!WyzEl_QF%7yFVrCfN|)m#c^>$F2VmpuBlRr)lw@Ki{rFB zgz7asB2EYEgnS*W!NoXC#__d0F`pNQB7Fbr^o;f;MWHQZ99^ zM^CK><&#>SPC&v0iBoNs%NN7AmXE?(9OVl&0+CRF;O-jkYwji3?YbvA<=Q{R!6nGE zP9JCe0;O8@)UksbeCGT+?x+aow+OUj57mj!~FLn&`Tl z$CZ25z)oytoxKpZl8L$0bw8NK>+#yx40P}RD*00qVZ#glSQ_{UDG+K%92W2h1Qwut zE*!__X<$B&6l;V+Ef*&RJ!$sIBDh7@W_$qq9x{9k5n)_G&mrS8YhWjRc@Ero5>xUjNzc+J!kM{qA%z5(Jw%hUxXsmhr@OK?>6;SgQl7EroL*>)NA>aNpF{;-O+$y zA1l|br{})tN$M$ylnMm`9(ARI!=Oc)-borVJs&{J-~xcqiwrJ$K7f|N1puKJ z8C>*y04;+H075S^xaj!+S_T&YgkEHD(enYc3@!i&y~yCA=L2XNTmTSyk-`Dmw?LPH=1%ez11pTlOg0NR1XuNsD zf`iEr6lhh-6V=W$*D_W4ZHn-ve1+i!c-W+iV~SS)^??zFN4t*QJon5E^0aK(_vgCC z-1=5_eA<+d@T_l4S<8bKr?l1|zc!`z>xR7KNYf{$WjVv;%?*;HwKtbG=2xGX@Sm95 zE2b)EN>;W)=Zm@)mj9Fu9kYL!(G*^t zQg`!KBtK0_W`?LYJzYKO=+!A}V)x%@I51h=EUP|QVof-+SGy`G_fBUH1Z{6iS&)2u z^YkG%YfGFtW45<_SzHnw`qp^pSl%`L`0&w7>zCXs)F+&9KDd_5yp>knL52k^3^doY zz4meYuLXNvm~TwQo>`r+_uSzn@1MNYyzk^9I6gEnAZOdtS3Xsw-+d#0C`P?(x$2VR zeB1+JYj<@TvAgA!m9vz8OFEhyP}wN>;pbpsWq#R94?+=#_IGq_+m!YBen<1JCpuMF z;kID;L+lBQ6Q9_6x$XPiZ^uy6vua)&(iqkG#Y<@|2Z*vOm&*eukNT%V9Z{Ln{91MH zzKn(oT`OO&J3KcfIHqX1a>=r^$6tAOS5;S4#{D<#cOE-mS~qI>r41?QLstdd?LV>? zK_|8uzk9yn$c_h&m8zPGNXwB=%6GCZj41qKvYNfa7BJ?EvC!DSL`*zd)}VWD!dqWm z+`Az(mgkthw zmC;2tS960qyQDLZ1YC+}>j;}ZeR}h&KRL552W_z}xw~5t|7=TY;HD#`9}YReZT-v` zI4)$PHttTe;K0)FQk9pHYqh-gEm5QIA21Yb4SFy;edFnC;}XZdGynaFHK(r5SiN(^ zsxtK>ik;D!8>ZG*Ir$^4i7E5b&dv+`=+q>|hKu)xe_7uW+c*t!{&Kw#IvieAT)X35 zaY<>+Zg~U;7dOqAyKTbJtIN61O;w)X-B><-Tu_B1mBmqPm>SZ!xVBbwATB5D*7HqG zP32XmidIyNQBP^yY&!A5{ygEV#-9TPk#{ZyDRVkMl(UYmKiH60k)IiMyCjk-LwLa_ zp@)hN9=!K(W>wQz)f1fI0e^p~>N$lY;q8#i?E$+gn?lz}wp!PhRg5Fgn#QNTe=(@& zU#HfOgHz{k+C1gyif6z2ZtdqC_Q0QuqiU+(zK#xGku|hr+$1FW;WH(Z!w&{z@0qr_ z?$G*W?Hz3kPGlso7CAP~n|18l=7}*?>l_Pr>_Lg0fia4V>!t`JMGAunkH0s0G-z)w}I%iL7(p}9*Fa9Iu z3R(VQ`nwgwTC&vwp>_7o>pN6+{QZu~QfR9=b=tlQckYC)TUQ@9`~Ir6Yd