From 4831c0624fabce204515a03ec1dd8db4b42d2862 Mon Sep 17 00:00:00 2001
From: Faron <171642577+FaronCD@users.noreply.github.com>
Date: Sun, 4 Aug 2024 05:09:08 -0500
Subject: [PATCH] Adds an abandoned security shuttle space ruin (#25922)
* Update cell.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update medbeam.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update crates.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update mob_spawn.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update undead.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update space_ruins.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update space_areas.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Add files via upload
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Add files via upload
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update medbeam.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update space_ruins.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update undead.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update mob_spawn.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update abandoned_sec_shuttle.dmm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update space_ruins.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update cell.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update code/modules/projectiles/guns/medbeam.dm
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update code/game/objects/structures/crates_lockers/crates.dm
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update crates.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update medbeam.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update medbeam.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update abandoned_sec_shuttle.dmm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update config.toml
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update effects.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update particles.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Add files via upload
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update medbeam.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update effects.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update space_ruins.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update space_ruins.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update code/modules/projectiles/guns/medbeam.dm
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update code/modules/projectiles/guns/medbeam.dm
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update code/modules/projectiles/guns/medbeam.dm
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Update space_areas.dm
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Add files via upload
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Add files via upload
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
* Add files via upload
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
---------
Signed-off-by: Faron <171642577+FaronCD@users.noreply.github.com>
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
---
.../SpaceRuins/abandoned_sec_shuttle.dmm | 327 ++++++++++++++++++
code/datums/particles.dm | 18 +
code/datums/ruins/space_ruins.dm | 7 +
code/game/area/areas/ruins/space_areas.dm | 4 +
code/game/objects/effects/effects.dm | 5 +-
.../structures/crates_lockers/crates.dm | 21 ++
code/modules/awaymissions/mob_spawn.dm | 14 +
.../simple_animal/hostile/retaliate/undead.dm | 37 ++
code/modules/power/cell.dm | 68 ++--
code/modules/projectiles/guns/medbeam.dm | 225 +++++++++++-
config/example/config.toml | 1 +
icons/effects/particles/generic_particles.dmi | Bin 782 -> 1493 bytes
icons/mob/simple_human.dmi | Bin 122872 -> 126911 bytes
13 files changed, 686 insertions(+), 41 deletions(-)
create mode 100644 _maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm
new file mode 100644
index 00000000000..fbdf10f74a1
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm
@@ -0,0 +1,327 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"c" = (
+/obj/machinery/door/airlock/external{
+ id_tag = "s_docking_airlock";
+ name = "Shuttle Hatch";
+ req_access_txt = "109"
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"d" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/mob/living/simple_animal/hostile/retaliate/skeleton/warden{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"e" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "burst_r"
+ },
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"f" = (
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"g" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"h" = (
+/turf/simulated/wall/mineral/plastitanium,
+/area/ruin/space/sec_shuttle)
+"j" = (
+/obj/machinery/computer/nonfunctional{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"m" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood,
+/obj/effect/mob_spawn/human/corpse/skeleton/security_officer,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"n" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"o" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/turf/space,
+/area/ruin/space/sec_shuttle)
+"t" = (
+/obj/effect/decal/cleanable/blood,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"w" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"y" = (
+/obj/effect/decal/cleanable/blood,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"z" = (
+/turf/space,
+/area/template_noop)
+"B" = (
+/obj/machinery/recharge_station/upgraded,
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"D" = (
+/obj/machinery/computer/nonfunctional,
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"E" = (
+/obj/structure/closet/crate/secure/sec_shuttle_ruin{
+ name = "emergency supplies crate"
+ },
+/obj/item/gun/medbeam/damaged,
+/obj/item/gun/projectile/automatic/pistol/enforcer,
+/obj/item/grenade/flashbang,
+/obj/item/storage/firstaid/regular,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"F" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"G" = (
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"H" = (
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"J" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"N" = (
+/obj/effect/mob_spawn/human/corpse/skeleton/prisoner,
+/turf/space,
+/area/space/nearstation)
+"Q" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/effect/mob_spawn/human/corpse/skeleton/security_officer,
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"R" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"S" = (
+/obj/machinery/computer/security{
+ dir = 1;
+ network = list("SS13")
+ },
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+"T" = (
+/obj/machinery/door/airlock/external{
+ id_tag = "s_docking_airlock";
+ name = "Shuttle Hatch";
+ req_access_txt = "109"
+ },
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"U" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/space,
+/area/ruin/space/sec_shuttle)
+"V" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"X" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood,
+/obj/effect/decal/cleanable/blood/footprints,
+/turf/simulated/floor/plating/airless,
+/area/ruin/space/sec_shuttle)
+"Y" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "burst_l"
+ },
+/turf/space,
+/area/ruin/space/sec_shuttle)
+"Z" = (
+/obj/structure/computerframe,
+/turf/simulated/floor/plasteel/airless{
+ icon_state = "dark"
+ },
+/area/ruin/space/sec_shuttle)
+
+(1,1,1) = {"
+z
+z
+z
+Y
+U
+V
+V
+e
+"}
+(2,1,1) = {"
+z
+z
+z
+h
+o
+g
+a
+h
+"}
+(3,1,1) = {"
+z
+z
+z
+h
+D
+d
+j
+h
+"}
+(4,1,1) = {"
+z
+z
+z
+h
+Z
+f
+S
+h
+"}
+(5,1,1) = {"
+z
+z
+z
+h
+B
+f
+Q
+h
+"}
+(6,1,1) = {"
+z
+z
+z
+c
+H
+H
+w
+h
+"}
+(7,1,1) = {"
+z
+z
+z
+c
+G
+J
+F
+h
+"}
+(8,1,1) = {"
+N
+z
+z
+t
+X
+J
+R
+h
+"}
+(9,1,1) = {"
+z
+z
+z
+y
+m
+n
+E
+h
+"}
+(10,1,1) = {"
+z
+z
+z
+h
+h
+H
+h
+h
+"}
+(11,1,1) = {"
+z
+z
+z
+z
+h
+T
+h
+z
+"}
diff --git a/code/datums/particles.dm b/code/datums/particles.dm
index 01206630faa..2b2dca7e396 100644
--- a/code/datums/particles.dm
+++ b/code/datums/particles.dm
@@ -107,3 +107,21 @@
velocity = generator(GEN_CIRCLE, 30, 30)
scale = 0.1
friction = 0.1
+
+/particles/fire_particles
+ icon = 'icons/effects/particles/generic_particles.dmi'
+ icon_state = "bonfire"
+ width = 100
+ height = 100
+ count = 1000
+ spawning = 8
+ lifespan = 0.7 SECONDS
+ fade = 1 SECONDS
+ grow = -0.01
+ velocity = list(0, 0)
+ position = generator("box", list(-16, -16), list(16, 16), NORMAL_RAND)
+ drift = generator("vector", list(0, -0.2), list(0, 0.2))
+ gravity = list(0, 0.95)
+ scale = generator("vector", list(0.3, 0.3), list(1,1), NORMAL_RAND)
+ rotation = 30
+ spin = generator("num", -20, 20)
diff --git a/code/datums/ruins/space_ruins.dm b/code/datums/ruins/space_ruins.dm
index 41d93e14769..03e494504d8 100644
--- a/code/datums/ruins/space_ruins.dm
+++ b/code/datums/ruins/space_ruins.dm
@@ -360,3 +360,10 @@
name = "Dorian Casino"
description = "A swanky space casino."
allow_duplicates = FALSE
+
+/datum/map_template/ruin/space/abandoned_security_shuttle
+ id = "abandoned_sec_shuttle"
+ suffix = "abandoned_sec_shuttle.dmm"
+ name = "Abandoned Security Shuttle"
+ description = "A security shuttle that has been floating in space."
+ allow_duplicates = FALSE
diff --git a/code/game/area/areas/ruins/space_areas.dm b/code/game/area/areas/ruins/space_areas.dm
index af8b7c6f9eb..24c22722040 100644
--- a/code/game/area/areas/ruins/space_areas.dm
+++ b/code/game/area/areas/ruins/space_areas.dm
@@ -244,3 +244,7 @@
/area/ruin/space/deepstorage
name = "Derelict Facility"
apc_starts_off = TRUE
+
+/area/ruin/space/sec_shuttle
+ name = "Abandoned Security Shuttle"
+ apc_starts_off = TRUE
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index 60107130674..4a9e2500c02 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -181,6 +181,7 @@
if(parent)
UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING))
QDEL_NULL(particles)
+ holding_parent = null
parent.vis_contents -= src
return ..()
@@ -206,9 +207,9 @@
// Add new
if(isitem(attached_to) && ismob(attached_to.loc)) //special case we want to also be emitting from the mob
- var/mob/particle_mob = attached_to.loc
+ holding_parent = attached_to.loc
last_attached_location_type = attached_to.loc
- particle_mob.vis_contents += src
+ holding_parent.vis_contents += src
// Readd to ourselves
attached_to.vis_contents |= src
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index bf36273ab16..733cb21fbd6 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -678,3 +678,24 @@
log_admin(msg)
#undef RECURSION_PANIC_AMOUNT
+
+/obj/structure/closet/crate/secure/sec_shuttle_ruin
+ name = "locked crate"
+ desc = "The side of the crate has a slot for a keycard to be swiped."
+ can_be_emaged = FALSE
+
+/obj/structure/closet/crate/secure/sec_shuttle_ruin/allowed(mob/user)
+ if(!user)
+ return
+
+ var/obj/item/card/sec_shuttle_ruin/keycard = user.get_active_hand()
+ if(!istype(keycard))
+ return
+
+ to_chat(user, "You swipe [keycard] in [src]'s keycard slot.")
+ return TRUE
+
+/obj/item/card/sec_shuttle_ruin
+ name = "warden's card"
+ desc = "A card used by the warden to unlock their crate."
+ icon_state = "data"
diff --git a/code/modules/awaymissions/mob_spawn.dm b/code/modules/awaymissions/mob_spawn.dm
index ea51fed28d8..1741cdb69f1 100644
--- a/code/modules/awaymissions/mob_spawn.dm
+++ b/code/modules/awaymissions/mob_spawn.dm
@@ -379,6 +379,20 @@
flavour_text = "By unknown powers, your skeletal remains have been reanimated! Walk this mortal plain and terrorize all living adventurers who dare cross your path."
assignedrole = "Skeleton"
+/obj/effect/mob_spawn/human/corpse/skeleton/security_officer
+ outfit = /datum/outfit/job/officer
+ id_access = "Assistant" //no brig access for explorers
+
+/obj/effect/mob_spawn/human/corpse/skeleton/prisoner
+ uniform = /obj/item/clothing/under/color/orange/prison
+ shoes = /obj/item/clothing/shoes/orange
+
+/obj/effect/mob_spawn/human/corpse/skeleton/prisoner/equip(mob/living/carbon/human/prisoner) //put cuffs on the corpse
+ . = ..()
+ var/obj/item/restraints/handcuffs/cuffs = new(prisoner)
+ prisoner.handcuffed = cuffs
+ prisoner.update_handcuffed()
+
//////////Corpses, they can be used for "decoration" purpose.//////////
//Default Abductor corpse.
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
index 063ac6b55ea..2807b0860ee 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
@@ -76,6 +76,43 @@
del_on_death = TRUE
footstep_type = FOOTSTEP_MOB_SHOE
+/mob/living/simple_animal/hostile/retaliate/skeleton/warden
+ name = "skeleton warden"
+ desc = "The remains of a warden."
+ icon = 'icons/mob/simple_human.dmi'
+ icon_state = "skeleton_warden"
+ icon_living = "skeleton_warden"
+ wander = FALSE
+ loot = list(/obj/effect/decal/cleanable/shreds, /mob/living/simple_animal/hostile/skeleton/angered_warden)
+ maxHealth = 300
+ health = 300
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ deathmessage = null
+
+/mob/living/simple_animal/hostile/retaliate/skeleton/warden/Process_Spacemove(movement_dir)
+ return TRUE
+
+/mob/living/simple_animal/hostile/skeleton/angered_warden
+ name = "angered skeleton warden" //round 2
+ desc = "An angry skeleton."
+ icon = 'icons/mob/simple_human.dmi'
+ icon_state = "skeleton_warden_alt"
+ icon_living = "skeleton_warden_alt"
+
+ attacktext = "claws"
+ attack_sound = 'sound/hallucinations/growl1.ogg'
+
+ maxHealth = 200
+ health = 200
+ speed = -1
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/head/warden, /obj/item/card/sec_shuttle_ruin)
+
+/mob/living/simple_animal/hostile/skeleton/angered_warden/Process_Spacemove(movement_dir)
+ return TRUE
+
/mob/living/simple_animal/hostile/retaliate/zombie
name = "zombie"
icon = 'icons/mob/human.dmi'
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index d8f6535a23b..ba949775de1 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -10,14 +10,23 @@
throw_speed = 2
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
- var/charge = 0 // note %age conveted to actual charge in New
+ ///How much charge the battery currently has
+ var/charge = 0
+ ///How much charge the battery can hold
var/maxcharge = 1000
+ ///How much charge the battery should start with
+ var/starting_charge
materials = list(MAT_METAL = 700, MAT_GLASS = 50)
- var/rigged = FALSE // true if rigged to explode
- var/chargerate = 100 //how much power is given every tick in a recharger
- var/self_recharge = 0 //does it self recharge, over time, or not?
+ ///If the battery will explode
+ var/rigged = FALSE
+ ///How much charge is given every tick when recharging
+ var/chargerate = 100
+ ///Whether it will recharge automatically
+ var/self_recharge = TRUE
+ ///Whether the description will include the maxcharge
var/ratingdesc = TRUE
- var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it.
+ ///Additional overlay to signify battery being organic
+ var/grown_battery = FALSE
/obj/item/stock_parts/cell/get_cell()
return src
@@ -25,7 +34,7 @@
/obj/item/stock_parts/cell/New()
..()
START_PROCESSING(SSobj, src)
- charge = maxcharge
+ charge = !isnull(starting_charge) ? starting_charge : maxcharge
if(ratingdesc)
desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it."
update_icon(UPDATE_OVERLAYS)
@@ -164,9 +173,8 @@
return 0
// Cell variants
-/obj/item/stock_parts/cell/empty/New()
- ..()
- charge = 0
+/obj/item/stock_parts/cell/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargeable AA battery"
@@ -175,10 +183,8 @@
materials = list(MAT_GLASS = 40)
rating = 2
-/obj/item/stock_parts/cell/crap/empty/New()
- ..()
- charge = 0
- update_icon(UPDATE_OVERLAYS)
+/obj/item/stock_parts/cell/crap/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/upgraded
name = "upgraded power cell"
@@ -200,10 +206,8 @@
materials = list(MAT_GLASS = 40)
rating = 2.5
-/obj/item/stock_parts/cell/secborg/empty/New()
- ..()
- charge = 0
- update_icon(UPDATE_OVERLAYS)
+/obj/item/stock_parts/cell/secborg/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/hos_gun
name = "\improper X-01 multiphase energy gun power cell"
@@ -242,10 +246,8 @@
maxcharge = 15000
chargerate = 2250
-/obj/item/stock_parts/cell/high/empty/New()
- ..()
- charge = 0
- update_icon(UPDATE_OVERLAYS)
+/obj/item/stock_parts/cell/high/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/super
name = "super-capacity power cell"
@@ -256,10 +258,8 @@
rating = 4
chargerate = 2000
-/obj/item/stock_parts/cell/super/empty/New()
- ..()
- charge = 0
- update_icon(UPDATE_OVERLAYS)
+/obj/item/stock_parts/cell/super/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/hyper
name = "hyper-capacity power cell"
@@ -270,10 +270,8 @@
rating = 5
chargerate = 3000
-/obj/item/stock_parts/cell/hyper/empty/New()
- ..()
- charge = 0
- update_icon(UPDATE_OVERLAYS)
+/obj/item/stock_parts/cell/hyper/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/bluespace
name = "bluespace power cell"
@@ -285,10 +283,8 @@
rating = 6
chargerate = 4000
-/obj/item/stock_parts/cell/bluespace/empty/New()
- ..()
- charge = 0
- update_icon(UPDATE_OVERLAYS)
+/obj/item/stock_parts/cell/bluespace/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/bluespace/charging
name = "self-charging bluespace power cell"
@@ -352,10 +348,8 @@
maxcharge = 500
rating = 3
-/obj/item/stock_parts/cell/emproof/empty/New()
- ..()
- charge = 0
- update_icon(UPDATE_OVERLAYS)
+/obj/item/stock_parts/cell/emproof/empty
+ starting_charge = 0
/obj/item/stock_parts/cell/emproof/emp_act(severity)
return
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index 945960fbb94..6c5836846ce 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -79,7 +79,7 @@
return
if(current_target)
- on_beam_tick(current_target)
+ on_beam_tick(source, current_target)
/obj/item/gun/medbeam/proc/los_check(mob/user,mob/target)
var/turf/user_turf = user.loc
@@ -105,7 +105,7 @@
qdel(dummy)
return TRUE
-/obj/item/gun/medbeam/proc/on_beam_tick(mob/living/target)
+/obj/item/gun/medbeam/proc/on_beam_tick(mob/living/user, mob/living/target)
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.adjustBruteLoss(-4, robotic = TRUE)
@@ -124,3 +124,224 @@
/obj/effect/ebeam/medical
name = "medical beam"
+
+//Damaged beamgun loot, DO NOT let it break
+#define SCREWDRIVER_OPEN 8
+#define REMOVE_OLD_PARTS 7
+#define WELD_SHELL 6
+#define INSTALL_LENS 5
+#define INSTALL_ELECTRONICS 4
+#define INSTALL_CELL 3
+#define MULTITOOL_ELECTRONICS 2
+#define SCREWDRIVER_CLOSED 1
+
+/obj/item/gun/medbeam/damaged
+ name = "damaged beamgun"
+ desc = "Delivers volatile medical nanites in a focused beam. Don't cross the beams! It is damaged and will rapidly overheat."
+ ///How hot the beamgun is, if it hits max heat it will break
+ var/current_heat = 0
+ ///How much heat the beamgun needs to break
+ var/max_heat = 50
+ ///when current_heat / max_heat > damaging_heat_percent, it will burn the wielders hands
+ var/damaging_heat_percent = 0.6
+ ///If the gun has overheated and broke down
+ var/broken = FALSE
+ ///If the gun is still too hot to repair
+ var/overheated = FALSE
+ var/obj/effect/abstract/particle_holder/fire_particles
+
+/obj/item/gun/medbeam/damaged/Destroy()
+ . = ..()
+ if(fire_particles)
+ QDEL_NULL(fire_particles)
+
+/obj/item/gun/medbeam/damaged/examine(mob/user) //The 8 Trials of Asclepius
+ . = ..()
+ if(!broken)
+ return
+
+ . += "It is broken, and will not function without repairs."
+ switch(broken)
+ if(SCREWDRIVER_OPEN)
+ . += "The panel can be screwed open to access the internals."
+ if(REMOVE_OLD_PARTS)
+ . += "The old fried electronics and melted lens have to be pried out."
+ if(WELD_SHELL)
+ . += "The distorted shell needs to be welded back to form."
+ if(INSTALL_LENS)
+ . += "It needs a new glass lens."
+ if(INSTALL_ELECTRONICS)
+ . += "It needs new cabling for the electronics."
+ if(INSTALL_CELL)
+ . += "It needs a fully charged specialized battery to function."
+ if(MULTITOOL_ELECTRONICS)
+ . += "The electronics need to be tested and reactivated with a multitool."
+ if(SCREWDRIVER_CLOSED)
+ . += "The panel needs to be screwed shut before it is usable."
+
+/obj/item/gun/medbeam/damaged/process()
+ . = ..()
+ if(current_target)
+ return
+
+ current_heat = max(current_heat - 1, 0)
+
+/obj/item/gun/medbeam/damaged/can_trigger_gun(mob/living/user)
+ if(broken)
+ to_chat(user, "[src] fails to start! It's broken!")
+ return FALSE
+ return ..()
+
+/obj/item/gun/medbeam/damaged/on_beam_tick(mob/living/user, mob/living/target)
+ . = ..()
+ if(current_heat >= max_heat)
+ user.visible_message("[src] pops as it shuts off!", "[src] pops and hisses as it shuts off. It is broken.")
+ broken = SCREWDRIVER_OPEN
+ user.adjust_fire_stacks(20)
+ user.IgniteMob()
+ LoseTarget()
+ update_fire_overlay(COLOR_ORANGE)
+ overheated = TRUE
+ return
+
+ if(current_heat / max_heat > damaging_heat_percent)
+ to_chat(user, "[src] burns to hold!")
+ user.adjustFireLoss(0.1 * (current_heat / max_heat))
+
+ current_heat = min(current_heat + 1, max_heat)
+
+/obj/item/gun/medbeam/damaged/attackby(obj/item/attacking_item, mob/user, params)
+ . = ..()
+
+ if(broken == INSTALL_CELL)
+ if(istype(attacking_item, /obj/item/stock_parts/cell/medbeam))
+ var/obj/item/stock_parts/cell/medbeam/battery = attacking_item
+ if(battery.charge != battery.maxcharge)
+ to_chat(user, "[src] won't function without a fully charged [battery].")
+ return
+ to_chat(user, "You start replacing [src]'s battery.")
+ attempt_repair(user, attacking_item, MULTITOOL_ELECTRONICS)
+ return
+
+ if(broken == INSTALL_ELECTRONICS)
+ if(istype(attacking_item, /obj/item/stack/cable_coil))
+ to_chat(user, "You start replacing the fried electronics in [src].")
+ attempt_repair(user, attacking_item, INSTALL_CELL)
+ return
+
+ if(broken == INSTALL_LENS)
+ if(istype(attacking_item, /obj/item/stack/sheet/glass))
+ to_chat(user, "You start replacing the broken lens in [src].")
+ attempt_repair(user, attacking_item, INSTALL_ELECTRONICS)
+ return
+
+/obj/item/gun/medbeam/damaged/screwdriver_act(mob/user, obj/item/screwdriver)
+ if(broken == SCREWDRIVER_OPEN)
+ if(overheated)
+ to_chat(user, "[src] is still too hot for the screws to be safely removed from it.")
+ return
+ to_chat(user, "You start removing the screws from [src]'s shell.")
+ attempt_repair(user, screwdriver, REMOVE_OLD_PARTS)
+ return TRUE
+
+ if(broken == SCREWDRIVER_CLOSED)
+ to_chat(user, "You start replacing the screws on [src]'s shell.")
+ attempt_repair(user, screwdriver, FALSE)
+ return TRUE
+
+/obj/item/gun/medbeam/damaged/crowbar_act(mob/living/user, obj/item/crowbar)
+ if(broken == REMOVE_OLD_PARTS)
+ to_chat(user, "You start prying out the old electronics and lens from [src].")
+ attempt_repair(user, crowbar, WELD_SHELL)
+ return TRUE
+
+/obj/item/gun/medbeam/damaged/welder_act(mob/living/user, obj/item/welder)
+ . = ..()
+ if(broken == WELD_SHELL)
+ if(!welder.tool_start_check(src, user, 1))
+ to_chat(user, "[welder] isn't functioning.")
+ return
+ to_chat(user, "You start welding [src] back to form.")
+ attempt_repair(user, welder, INSTALL_LENS)
+ return TRUE
+
+/obj/item/gun/medbeam/damaged/multitool_act(mob/living/user, obj/item/multitool)
+ if(broken == MULTITOOL_ELECTRONICS)
+ if(user.electrocute_act(rand(1, 10), src))
+ do_sparks(6, FALSE, user)
+ return TRUE
+ to_chat(user, "You start to activate the electronics in [src].")
+ attempt_repair(user, multitool, SCREWDRIVER_CLOSED)
+ return TRUE
+
+/obj/item/gun/medbeam/damaged/proc/update_fire_overlay(new_color)
+ if(!fire_particles)
+ fire_particles = new(src, /particles/fire_particles)
+ fire_particles.color = COLOR_RED
+
+ animate(fire_particles, 20 SECONDS, color = COLOR_ORANGE)
+ animate(fire_particles, 10 SECONDS, color = COLOR_GRAY, delay = 20 SECONDS)
+ addtimer(VARSET_CALLBACK(src, overheated, FALSE), 30 SECONDS)
+
+/obj/item/gun/medbeam/damaged/proc/attempt_repair(mob/living/user, obj/item/tool_used, next_broken_state)
+ if(!do_after_once(user, 5 SECONDS, TRUE, src))
+ to_chat(user, "You stop repairing [src].")
+ return
+
+ if(!user.Adjacent(src))
+ return
+
+ if(!user.get_active_hand() == tool_used)
+ return
+
+ switch(broken)
+ if(REMOVE_OLD_PARTS)
+ user.put_in_hands(new /obj/item/stock_parts/cell/medbeam)
+
+ if(WELD_SHELL)
+ if(!tool_used.tool_use_check(user, 1))
+ return
+
+ if(INSTALL_LENS)
+ var/obj/item/stack/sheet/glass/lens = tool_used
+ if(!istype(lens))
+ return
+ if(!lens.use(5))
+ to_chat(user, "You need [5 - lens.get_amount()] more [lens] to repair [src]'s electronics.")
+ return
+
+ if(INSTALL_ELECTRONICS)
+ var/obj/item/stack/cable_coil/cable = tool_used
+ if(!istype(cable))
+ return
+ if(!cable.use(10))
+ to_chat(user, "You need [10 - cable.get_amount()] more [cable] to repair [src]'s electronics.")
+ return
+
+ if(INSTALL_CELL)
+ var/obj/item/stock_parts/cell/medbeam/battery = tool_used
+ if(!istype(battery))
+ return
+ if(!user.get_active_hand() == battery)
+ to_chat(user, "You lost [src]'s battery.")
+ return
+ qdel(battery)
+
+ if(SCREWDRIVER_CLOSED)
+ QDEL_NULL(fire_particles)
+
+ broken = next_broken_state
+
+#undef SCREWDRIVER_OPEN
+#undef REMOVE_OLD_PARTS
+#undef WELD_SHELL
+#undef INSTALL_LENS
+#undef INSTALL_ELECTRONICS
+#undef INSTALL_CELL
+#undef MULTITOOL_ELECTRONICS
+#undef SCREWDRIVER_CLOSED
+
+/obj/item/stock_parts/cell/medbeam
+ name = "beamgun cell"
+ desc = "A cell that fell out of a beamgun. It cannot be reused until fully charged. Only this brand of battery is compatible with medical beamguns."
+ starting_charge = 0
diff --git a/config/example/config.toml b/config/example/config.toml
index 0ed2c1da0de..83d590b8759 100644
--- a/config/example/config.toml
+++ b/config/example/config.toml
@@ -682,6 +682,7 @@ active_space_ruins = [
"_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm",
"_maps/map_files/RandomRuins/SpaceRuins/casino.dmm",
"_maps/map_files/RandomRuins/SpaceRuins/rocky_motel.dmm",
+ "_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm",
### The following ruins are based from past pre-spawned Zlevel content ###
"_maps/map_files/RandomRuins/SpaceRuins/abandonedtele.dmm",
diff --git a/icons/effects/particles/generic_particles.dmi b/icons/effects/particles/generic_particles.dmi
index e322afcebbe9e462578fef3cc8dd880626c1581c..0eda2ecc2d6c27ffe61d08d6518795dd8ffc9c84 100644
GIT binary patch
literal 1493
zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&sdH5!5hX6E#mPmP1tppJc?=8{
zb9yJ8=Q?D-bL{-<;3<`&g}YXZ2OeqO*K|bpc2}(N<EJ
zc-iFIvIF81Uv+v3ZsM5AaaHVC%yh1sQ_7X~O4YvCAD=nv#oNNqKOc)fJ$&-0kAD0Y
z1_qWxo-U3d6?5L+*_f@8D%1Y4+@wX@smFz1L?wF863^+U4&7cdq2a&l1CLxmmf6Y~
ziXK_r3T$uIZ0~BiX*+ebm=2TB4kbau2e|@ffdzY$=iDz6o@V-{@V)iE`+Ka?)dDTz6|a`qozpRcajefOMN9rLnV-mjP)_6jO2;SdO7
z;m~Ai5n*)dVo)^wT>pRG`^x_JJL1*rWH0whqR6^7bY`2)7Ji@BWmtB?P(?mr@x=*o
z4F?kxr0>^#%iFGP&Axp3^1Qq}z3pq)>pcCZG|f-To{8>aT3*B`SlpH)#-9hIA#yL0be+wFVyyxHpG8PKpz=f=sCo@uLHZaO(C{{AGp|N3j*|8m8pI=dP6
zsqb0!@%VrJYae@#Uw>J$DQUKN^!m?2A`6bDXFs{=*z!jG$g5YYvbRQU^9a0B=&tW_
zM&kJ6%^W_4+)oYrmn9a{Ye#n*|KHg-+5jTkY;1J=$t*Wz}W-M)c}YdD-0}**VhB
zcS+t5H(#=E!KWwv>;YXLvl5OM+~t{~WXGzWQL-)gSol#Nj|P2@pAR1|TlpyFL-q`=
zqjP$L>Tb#&<$3XNSNgv#EP~RERZ_ftKmL5wln6S5;%j(RqXq`1@Fczsr&N^|2+Azb
zVv;UTPIi`i`0$~ke-lF-<23Qw63cZn6sLUD)z#fOTOe_6?a!C&j?eE^v&qDBuj}&;
zyYVLd^x?Pf-d+2}DIl~kyrHy*_kZfczkjdWJO2IQ;H@{?H*YTfnm?O$`}XaN
z=S_b0n*Y|SyHuIqcgPki#oMeP5VEF^
zbW%zwRPs>$E!6YU0bhWq)*3S%TDx|w=katlXr{msQlcUc{_=0n-m4{YsFFS79u-lKr^J^dZ&-u=i@$v31TjM)g5jFSc+`Yu}@65k{`@V1*+^z|?
z`loMid&2jG-K4()Nguz~z1#V_pKVfi!be>lofAr1e%#a4n{RYz`T9Mgd-&f=2mSxC
zcLwX-$q&OGJ}i&lx&3}c{f^S|cdqjF#l^;(f8g(b
z_g4{5e;-i)yZqhb^JRL^dwP2sJRYs**cYvV$s>OT;FKiV)
oDu!&5cQTMgEfr7$U}ZgH!^RD#1ix`)1IuX!Pgg&ebxsLQ0K5LI3jhEB
delta 769
zcmV+c1OEKg3yubm8Gi!+006tak|_WH09Q~fFDZ*Bkp
zc$|&W%?^Sv3uFGs`SlR91kLBP}Pl}3+KV(7{gEmr6M=Ry$C9T7U%o}1zG1<
zMOb(+wMJI<-G2>;?7+g(4rV2NvBEuiAbz+?EunbqqK5aky_wGcmd4f^{yn5Re$Ec)
z&Z@!Ml0_P!Vo|MO&30|U59Q4ArXrc<$@D)z3$4CFG^d`%0004zNklOKW3Fm;~-$1EF<7x)Hd|lu`G4oJwbM(6DL&qqoZPP!1r9{#pT{uaj=&(70C0%IebLcCL;KjLI8bp2JTvzMR^{3^=~hh&
z@ps1$tQ#Ci(7?)CT=+sxXxhfR>O1z3RJN>O;Cd@LplMs*rd#Y0DJvYvv?ef+S+B!B
zgOT$@L_|bHL_{82mpXvxHp?#THa#ia&Qvm?>)(19xZRN*_GEtW3mT(=yCW{#zvIG#
z4J)K?@#%QNJ4F5o(ud?k`r=#mLo6a9BD4Dd9iI=Qw0SP800000NkvXXu0mjfum5s!
diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi
index dd33948a4ca19a4f0b17ca9d9575b0f32fbc187a..16eb74972297f9c45f1cf33d7946564f1cd0fc39 100644
GIT binary patch
delta 14582
zcmX|o1z1$k*7g}1X;DDBTSAePZlpsxq(nMJ@_@9YsC0wU4bm;$A)SI!Qo_(P^B?ZL
z-_P^R%;~fD+AH4muEk{scE=ia0vU(~;9vm&aQ1HI8USFkzPbjUayA}T?r&T@-?%sf
zz`KmENu%ofe8gdMgE|IP@{#8?qkl?pykM0UYMIJUx~rMSKNmemm~Q12gjuBXJPz27
z33!fd(gU-zE-LLWYIxW9`FsjF;qOqIWK2J&id7H`N%9dhZ=VntNNMWrfwl!iIB+$?
znFj`Xd)3@&fOt*GjBOu11w;N7!Q&6!T4q&r+@b73ok0w4goC|3A5%LqT_5*3p{B)+
zemr-mV;;P}CSc8%g_CWfhIK!NMwk~yu^BaDXUU$7cDQtDrmd8E9*Q8o_|9!#=c@f>
zaXEm5mB-?}4?tR3)3y}I1>P3Vq_x6A$Wk{+>pI1EvP@)jxL-Y9T`KAh+Ue0!O`dkY
z9@QdU>q_08tfX14H_hlpuVyZ@)_RNYMECH(SdCbMoUU4$19WpRL{iRy9>b&jq#$&JZXi{Kg8=ShZYc
zLbpA$$YO=q@r>0}B;Y;7Kl;nz;_-)kw}EhtwyV^!{mi(Xih3`fgifGthZ#w9^J9Tn
zlp*fLJ0N6>QXuizIcrk%q#ALXx=SLHc}&x^{%roI&2mZMT;^ii-(iq=#bn}^7EKla
z=mBLpY29}je*=8{bwbe58qm>Tf(_s$>ySSR{HB~%@McjU11)I_@ek}coM!sse%3Z#;t^k>^WNidcc2ZaX*KCAYOCzB?6SN`
z6ZlkcaC&2Pt;+U>y)HA=UhHVDls9d#Ap7Xlf6zaB{~}mk|DJYpcn5%jZ|Bi4)q5-M!ueCrjk)bq2pX4
zhj&r$YfX+(*&Sfy^|f!zaML5d3xBNaaqQX!{QOCr!s$V_-~8#L>>M0jM}a6sIXO9t
z`KnjKUVFO9(Ju8yuNsyQHydKN(qbzoOSlNnOUw%q-b2BX?kQl;u#{
z`I)cw2VAD1%=yC$toiA23QR#(N@Smc=2FL@wKk;$+zIc~Gb3smVSoi>VNp_6h7}iK
zd?JodOuS$4?HePqv~qDP7xlg9beACnULSShpGy5!Ec=$>n+6@Sx#77h#y76(wiT2o
z^8633P)>UVZDGfFe}?&+%TOlTcx>OcERDE-UF66hTE>a`7{}Z*%)<7Qi^)09RYPus
zg{74hF3qp6fXs*tccQYXtaWk6e3=G51u-L^L%+1@6cECiNIzG
zhwR{9l-Nu5s8bG71p>y+6;WWlzTpP_;NMPtj$pRv&nvx4DFZ+LnBf|zZxFKhcA15wj1(8z!_QFI!{)`
z>G#g4j2kIwW3<&?&U$-_r^o^J7MtkgWO#cqJd?T%$xll(g;N`DzRxiO2L_(9(VO
zWrE{*tN1QQ!A+r#0AQ{J{D}ojP+|Z)`~(Dnkk%kK_AL!F9&>$}x%$kYJjkqF=wO9T
z(Agyz-5a}0mPke(Z|T4SN#zz^lgK%-Z;7!|x|{8`$Um^`OCg^-8nqu2z&x#gJ1%_@
zHr=aq2EtUQt3G@|!V60@oB-m4XxgA1qSev`Vih{#hJGp){S)x$tfSYG!M65M>C5u&
z8k=D>GGyDus-MAk$47vYJ0V~*n8?B`BJzkyF%ARpKVNvAvY2?h6G0a!_2v!7cjuMG
zT-o4?Vi@rVG`^{Eim*vqI_H0%KP36JGfmurmx}N~;XES6`dYK8^%u{wTiu9ht(Y!F
zT!5X|G2NxjSgmJHxdm{k;agirUn+#6L$vj&tP5N+;CLe9vHYcGk|^L=7|1TR6QWNu
z=EPp3_wq%FOWctnkTco;xH(U7KlCNZHufNSTH2?AZP2?`M*fq;r@p+f4{8j8jvC^lNgFF(xvquk%Of
z*e$LWMM_E#3IF7~y6@~ciagJBD-DPLc`=Zqlalf+ZsJYQ9h?mAMXc_i&PH^foL%EH
ze@nfJID*Swqp$z5Ae|ne@D0G4da47q)cn~ixegfVOMt!G
zIs`yvX4|#e6Q&3?Hti|b+zbZmw_!6`8}Sn==XUM%B2jKZBuR)6+l28^P&^vXEk}<
zu*quw3BUDGdYr(gM{s46RB+#gGK80rfW4vy_WqR*hw#V5aCfT*eHzV=usIuf5e-6W
zvg+??Tn8um?;x&cUbK*YYwmf-
zXvI}&|A`>houLDin~JdT-Z#f>8RclgXI%sHtm
zlLvbh2J(5*35HdSC86h%nZkIVt(c-#%IQ>HPCJg-e@!LjPs+BDt+Is$7FqB*KJe7-
z&>;viRKtIpDH$P-u(S|lTTh?YU3gDK5W4o`TeqWnXI3Epycd$%_L=e=@X&rr_N`gu
z2i(g!+tLKEjJ62r=|QQ!_bBH45^WVSn~j33E>Dj%?!X-{v
zj{8d)cJ~nss&H6cDUsBDgeFF^2q&v{61@dv@{pxWW=Z}~I022J#kI1sit4rON??#B
zCMU;^=pi|7@7a(tF`*8}e}op@%jnBQFDRGJG)FnL3)G49b;_NbCw}qVDOIC2D>6((unlJ#Kk_dz$Jp`R47_sc^t`9rNO5Uo2h`
z^QXZd`;*N$61N-sl^tZGWF;<7QYY3Z!rRs|dz^%M1|
zw}Pi{Ba81O4Eow~PEvUWN0b4#)Mdwu6Z=os-D>j)quw?I^65{Nc{f@wVADP%jpF(l
z@gVL0FAV7J?w(G+`?f{P*m#&CR^dL)%K5;_l=jK2T-a10T!mu(_j%7Kx1io%4flMr_>&B4epK%}eXe&;Z@6
zFMo&y7__QoBN=!qV%wMO?uthQ<~v#pM$%%2az1&B63}
zm6Utetf5ak!4b92uTLH;#KbUbV>8^nx+g-W+(8Osn%rJbyt{|uHX@LRr)h{U52eKD
zMXY_+q9_@t#1j=u6*N;944c!L#`g874JkVRV%EwoE=9_u<#kqVY+4@|6!IWL2a
zf^!9geJjO}t;aG%ejHu&?87bhXUl7Zqz>C}ob!I#=T6!kcVW{FRG?xfB
z$cL{v-%3aFibP2W|Gj#7*VpFLsw*c@NreK?<+>KvTXU-a*MYifcS{j?bN}tZV%Qw=
z!l9j@D};;2;dpefjdAPgH*_Rm9McN(_xyl9CtW{h!~`
zX2PXIuuhI%_)wDCthV}C|2{3fn$sy%XUPsYPj!U3?#&c4v#?+)jL}VeCUmZt
z=1W0nkzLTHDc^B(_6B%sT>cKc{n3!(vqLQCB1V1OKA+Z=k{3`^W3(h7s5;rs<)0TI
zI%7RHG{guYNOo@Stx7#;+LB>mVMZuxlvAirl6AUnO{wyHNGXhn!=hEqm2^{s~#2r
zM-Y=|MY2{kI)KM?4-m9vk{*kreDXI5S!MlS6Ni;FW_unS^o+a_dQrl~EN&Q|u5h*u
zPJM!BB8}$+&@8H5Z(2reJvy}_xrZ$;k2ipz&Hnh1)lJV2*|||jwe-<&XdioL&r=lg
z1VGTF-PXauK-0inxA9S{V&CuO81wNAtmxkNsH+<=VqmoC5m_|mcxB+DeM7SNXby@W
z`VDJwmnjs>{8v1{Iu%2GeLV%AMG$wJg$xcM9fFV!wT2A@37Pxh8h>{ThJ0+d{0oa}
zgUETfdbI(!^+p~`%4M|4g9i^R`eGijcU;-Vpt)Y|cqh0k4nwYonWdg?k2-MPen0nR
z6A9=P^PWRJWJrZ>XvhnP$VKM;SC7YT@+h{7HIP|3N<%)gA7-pZFvIyUFF%$~{zvYV
zVbqgv)Elb8_dUtvJFxe31b&1RCh>F?D1W+iXnA|k?Tvk*Qt~2I7^z?au1Mk6;Qy(7
zNS4um@tUXZw3y37jS0ZS#8j1*hFR4vtb2l@uWA=MYq&i{Y2xT4$As=}73Af;Cqi-$
z%h*xX>pPC#ddNpcMh5kEBiKqSE4RUTXlL!HAF>MOC>g817zW6Uo*t$WWU5De`^KuP
zr-36TQ%^6%qfL7&R2}u8C%zg%-aSf`kyPe%ZY%8-zf#ec=C=T
zo|pNab38yMMA-Jr>(1L3fC+fTC`2kAJGbyS${+kAQwSFmz|_>#?40P-K(ACU44K{y
zU2qIva6J4>LKD0voH+(i?Hp;tC1C5LbNWwP+83j@^*dsq4?b{vRQeK0ZjcnFd%7M$
zNMmV`)SI>910~?nva;xqgefU0HMOOEtE@7n>FnSy9B3QQU5Z0cFhIecw0p8F&YLXJuo9jJU$5!!Skzk=SGSw@o
z$AwLgbsN4`G^9ypGx?ymb2r%re6EN`6ro{Z3^H`V1CdJ1>7O>vL^sMj^8Q+i6!La)
zdfvqtA?NEvYa4>Db6&!nqwD&C(<+LaLc_~H2WkU9_cfoo@Uwy_PHZ-ftlqZTKn~x9
z5O_2OKcDHG527>27Z2$-@i@5hDmONXFmdqI7+Ij
zTOl9>8X1|GNT{fWmv~+hr$~Yl5NXnNd9vxY-U)-yYdGivCCLMWgVM^%xPQj8H41RL
zPq)X}UXOtpU9CQ+Re=a!&1}HLD#(o77^Q-geEXLojz;XxM=u?vpv9`R=LbLI3Em;c?3~0U6M1qGr8`b+cb%%Uq=?VC@Szw@B;(<(+v3(6!ISl#6^SIOQ=+vq|j)i-;+fne8fY?61XCr9%
zH;C5x`2O(N7~z870Xx^rGJ1$v-~}vx4}F28)s@Kd0;t16ec{qa0}k6R%*qU^Wo9th
zb=NHTj=R<@tB)lY78VRT0>$yMLW-{SPf<+q&)>g)kM?)`qmg&4j&iD$(;>JTci}26=Hb)oSHHg
z>mfPUE3R@GuM`3sq&ENW7E^O2uat6A1RXD`Qz;d_iPnaBY+1g&+Rr!
zm1;AX_G1P#v}EBSrH>xJAidDl&6Nn-!!+M7LO!Gdx+72@nG{`jr&v-{S)czKU;=_5
zt`KPkMf#1N2qrc*Y!5ntj|4}0{IedJOQbI1{RwwFxs))-beW;kJrP6^qqdusI>xj<
zTO`m!OqxA$72~LPL3iR55f4_wYD>()(b3=Dq6XY#%*@Qku|XLb)OQ=wHFi>_rt38FQxwFRFCb-qGqUjO{wp6Bo#%N)zAdDdf_bhFVPy&yFwFU?QT
z^{C-eQavNzt+<`lB*e(eA+1I8x_-~zuKQWu9v+Dxx6JN~g<}9M0xr9&AF&_ab)Vga-R`EX6W^xmVk<92=Y7{@^Pz1U_8BH>5Q?GsA&M
zAP73y?Ei#B+@J&B9T(mYC-XLlpo>6EQB+h^&IJLb08adyf`(bv^Iri2j6
z!1#E?ptX#V5hdh`ArI@2Wqs;H$Bl|LE;yU}8dt;PVdj>LVfs(-YJe%~D<0roD{|5A#k?g5Lz4
zSzH|UQb=EjM_+vAJz0}MXqcNhOMHZr{@Ug%^uuJd>jv4~()z$bPma{${K_I;o2H-k
zkU!wLq(VHt4iH9cc^dG#1^4S6y*GLshHC1s>)(6>-Ft$u%!_&E5;3JO
zS3ZDaD8TXr4MMD`KiOHJpE#RR4XYvprQZ?u*01d#6HNSUzWF5n2eu1f_8
zhAk=_jE;@Jf}k_z(bLPD5D@+*z$@J0
zq+@)0Ke6v8@iikwcIC7E^b{mf-@)7blIBD$2L#TX{knbRpS9EQu+t7m5q0(Sp9mO4
zh7IeD?^7{)xz_R@>`nK*e;^?ADX5q@x1HLg?3(Pnc@`Bf6HttnuymmCr9Mqd$bqC{
zw!2rLZqLt%yrU$&zNqG9GQ
zW2%Js^T&1)K9rWG`J?9YSo21T<8hz@LqcY?#w!>sOREZU9*XgKwAt@7?
z;^y4Gi;UH9iE-^hOr<36kCjvBCe}%Zus9%P)E4rwPu~7D`1f|>6Zo#>SlQoc>pfaM
zgQR4K+QflfxM*~*j2-9Qognfw`?6mW8El-T*6IAm1*VbQ+$@STuNQTFikTVG?zyYo
ze~()3HF69(DR(IX-2z3w@TBs5!O(w_G#~989e;dy$Ymjzelj6Tw6QapzZ28<&=cKX
z8c{j7e}xq}4sLHAkoKVTL(W}O`NCZ=9B*&Aflf1W4j-b%RN}yUL4s&oGuS}oTyzRj
zedeZnac5ZB_3BXw%&fAmD^ie;f;9%ZY59s52x==<|3~ZU@pPjQuw#-^56J07ts;vq
zF8_CnfN$!;kx2AXIjsln-lB~l~#V(ZVuVjE@-xJ5Sr5oW>=0TBaxEQ(vyYvmdk>F)FHBDW2RVVz5|q$OkVxS9gtgRcmErN
z%HB6N3g2#AT%3BH?G|RE0e{B)8f9%-@9Y1Qx3}li*4DnfQHW_4=|m~ySF5d2pq||hoRu>)6&h$%BOEw
zExIYpvIR&1lO7A`klZwpLg`N#Dy#mM=qH*+dA%p^`TVO+pZlAEQdi_cX&*Cw^#*8c_w4U5rDav~6ZRcTxC$G&nE{z`Z6u!lZTqn
zveEgk86dGp0@b+@qr6VeaLG4VJ)tMk2??`VM}Lw9qrcI`K%sh;Cd3={@1DwnHg$(5
zHJu|8r(MAXdUtD;6eSA#sGQ2RJ`;^6Lyb#gYX@gK&Ak&%%Pbe!kQ5cMkYz$CNyznU;q5|+8a
zuxrcum`d2PG8V5g;r`%(#KK01Z^cj4i)5bOy`QC8nwQMn`{v#M3Y!C&wb{+N{jNp+
zUhUxl%Sm#OCI%3-Am(T|JpdA)nHA=ewlv(MJYoVTnM7kE8OLyuID
z6tE|tV8ss=IL$``CN$P~*F7vf)&jhHdg?CM?A|M^q`ggrSLD>6sBk*rWxKSuMz0?abvNbjzOl>_&vv8-NejnqCfqxi
zucf4Dfmhl&aeL;~FxTs|H-E;&j+nc#i}>a`e%klWVH2Lt5z;=7Gy^!~6l)p7V}^5Mi5FR)+uk%NT$%E}vDukxb#l4gu}OE?k9riL0D>Z&wwH^j=-|
zRv!Ktm%IEGU2f-Sub^W^N|#V_V5BS3Ocqp1jelPaV%(A^pcX2SX64VN>S@|PRr9k+U=sD^;xzCKogXF~sA#fv(zoUi8;
zV5J#)N-@fEZ)F6LnW!TGaUDLZkZn}{3y#V}x!f{tlHU!&WqX!P*RRCqriA*7W>~S?
zT+ExAjDG%$t{V}Q%R>0KKML(}MQSq&)v3Z@0FTGGtj7Iv74*vC;D$9MfNk{Tw5`#W
zq>huIRV~n8IG}<#pH3zK;KOeb`QFK0J&$rLX_
zeHUE`vKn3ZN~rNA=6$j%(W}q00?*!9K1r)u55rV7S(D4dn+t|lM}i+BfBCJ$3E(+%
z<0)-BB4b
zw;dvwaU;14zp^OjNS;LnkVa{0P|?P*1$N*-5Av_NVrnP+G3Dod@I=OMBz8PEaOO&`!Xv3+DS|StGuB{zm>@+y)1oRENprij
zbFQ{^OGomM?{9^cgXUUi?4|M}VDp;w?ip8Y76IIz8=|2Ob^fw)5b;ID09+R16oM`4
z?oPP`3bLN*yF}F?AYa#`t5A;<&w6Buj6mX*C!TibLny0NE|f
zS#13?hYsK>+xqCyqeRKuFzI@Tw$>Pv1(TyABXRyNH4s7do<~3hNtMf*1X7chBSeyT
z5#^2r0tOAvG_pjpiNmM|uZ{~rkJUhsG%xQ=`^D+Rx`xxS&+ox5B3A=F@4B{L73~4w0-i%BugCk-NA;a$8KG?o9*XK|0)z
zqL(_MQQ*Jlj#8HNO*miI3`M_)a`05ZnV%=w$S<9)l0dX+Xd&7?r$i84beS$AOx^y;
zlPAP<Q0-fg;hGdp(
zZ96znr7`ESqd|5~$`d5_6tnhToJh}gpl`-&rl}Egx@?;MYMZ}w&1V;Ko8ShTuqY<+
zo{`2+@dIAUZ_)jbUmh@GJ{F
z6j|t#%7%UzM>@=nUiM|bWP4a$UG0ArYC{ADK5o^xhtTYb6TDY&$5$d;_$VT$4}+%<
zrSp?FrvKhE7dxP(z{gVF3*J+dKijA;YCmq)y_TVDQ
z7E!(+)hsz=c$w30nJl%6^TEPVk^XgSo}~=%en%
z`4U@VULM}S$cUVk6%!{H*M_I)l~a}W@uw4T*JhsPd;;k`|0?E59_WrbJVBjoHU|7U
zu)fGznYspl9Te=yd@Mt1KniF3bQ>(JCF}}Lu`%576b*bp&(9F$>B){XI?Eh8Co;(s
z^pt}-MgXXDaAya!tKyEP18+Zem^qPO97k#DE*-G*@)9YDP}9)R5EJ+IS@6|OlJZF8
zdr2SV5~1;J{-mtzYF)hLHWeRzgkn)8HK(c!aH08>p231sCnT6pIx_d#Sx{k_c5l6<%90s6UPky
z=#6THnCEVdFv561u9uJjupnkOi;CSOj4ZA51NQI9x>
z2+XBr5p)LZ%ae&8iiIjY#Hc99P7@?1kLFb}dP`r0l>Hg}*@kGAe9HK?GAAcz;?vFy
z5AbRn58xp)2Y|ox#~B6UokO)gBXI=dn4q26AS;Kfad}a_S$FR*yhaCA#??Suo6mu8KhXXdhOLIo%2L==Ib)qN1+Cd0DiBIbYz1`8d52I4NenDA*s?0kMos4mo7
zd6XFzLF=oONPpbWfr!0z*kqlVnK@4LbW_lyNyd@hqgNUx0-hGG#EdQxo*oT?Bth8U
zzLFZfWcX&6U7*a)EhdWI*fs|WMt@)cM9+_bh2#dwoHF&-G=1BvA1>BF^CT?b
z=QpTd!wxtTKyg8>Fn8|&p=zEPJCEhJWgkDO(v9D*$=BhiE1XXrEl^enf
z{c0W06?S~{lzj2(^SiUR|69^#Ps;WFrMG$AFGB{Kge*b#!`K>(+`9tf)-shA1ca7O
z+vVRk@m6$H9OUs87ghbtS#To>lib?abP{tLuM?a2+ZcJzIM(rc4cqhvIfA)x76yf-
z|LIF6w#86p!zYZVLinbyO1pkP;o%=9>eqO&h({&j&khShDn}9T4KLiJyKf(aCM7R2
zf(;S?bIQ%XVDrOO7mbsSCzy9CW4t?q(}^f1OY8;MjLoL8tEta4RJNYIIUW}EBY{BN
zKm<9SwNF}qMpIJ<_wYGCMa{5%*l(9MkrzL1u#+kGYYvmr532pw0k#ajlH84c^{=l5N^Nv*e5$8R}
z!!%aKu+tLw_}_ExKI9v+b{{`ds7N(40(n27i?QpkJJ(b~0m^n)*A?c`jM78>o-~Cn
zjuKo8)c$-#qixA&OWuE9AAvR)QqW);rgE|FX2ytr4N=Y#?qJi$5#TFELMgVw0Xs|Q
zUnTURv__A?H+%`*|9SOVc2m%#qIy153aglYRX-l_bz|e!!9L_cZ~|7_XT5lIKqaZI
zyCb;ZDkSC+M+!CA7
z)Gkga(9SI@#;s){P@3CK7;z=C<%oH}=okvYu><9!t<(Yi%{vW*Y+xC&B4Sn;X>)Qo
z{NgHzx9*i;S|eO41WZ&3>nk*u-JGs`wYu<0b*QBOY8}FGu+f|BQ<#y;T?MazKbS9xqEV&d}5VSddW%>sHW?DRDZz#7R8%j{7g2B0bmlk(T@zr5a7(6#co
z;djeo3pPn=CJ|(Ox2VZFdbVf_dng|1^w6$W)9XhNVY7YoRIE$;J=+Znm#!TfYRL>n4Ge2?fC!$w(u
zYO=m~iND?+(?mkxKM|-TA6-_)aHmaqdzl6!Ea`5~Ybn2mavhmtryL*u(o==pML}Ry
zNCWuwv+D(}B-{7)gr91Z&s*O;Je`BF0yq;LXJf2dXO(hcj!5##?^>ubZ80De68GN{4#e%X}*JQ0Al7Pb(RDs
zbd~(HL6R*)10}xj^MHG1{(&Nik1X^+H&`v?S56KWZMJ@+R?z?@L%8r7`Zq7n(yoc$
zW{sLCZDp?k+H**9IBFkA%XrUqe=H_TGN)Zg_KQy+N{u;r1ZpGKpd{)aG_4rwX}WvR
zpLj5oLRDzE`~tmi;UbfD1gQ!GJcQ;}9PD1*h79es_Dk_N
zF?GZMPA%Lkd};RaHatZC`7~@*kucmU-E153d>?Fk
zT5H)-_fAa4g7tbq%sX|hhKH*HCbAen2Uf0lOK+Yyib!QV;TDvCr4^VS91CL;d~lsT_7#cQz2(v0JF0vY)mShW3XAIVQ+P&mstHy3b9KM
z=3~MmRH+Epf#eP8R3`|Twbp6(^gs0s
ziR8On7!6QVAo>k=$gF?&?u0XZ5e@K@Sdd~>&mO*0&S^bknO*ETk)IMzeC>kT=e-!}
zBCb2C)}I3w`vj>qSD>aZ*4@esZ2UJ)s}^d*I*!~n5m&<&d~$B&{u0kozZ~Y1p2?{$
z$<#RA=!3$LK_UOmWCtgiVjqp0V*!n7GNz*A$OZzcRD(}Zt%!4M;e=-x4(7;&Rs&O9
zh^KM+L`V01SrPqv%Js$bGv>(>0RRZG=nq@kROk(ljhRsA@LAjJE7|o(jo)5<0aU09
zLR}bV*8lZ60-_nX33O=AgK}&mGHi;XpusC`>Jq%5qmO~7=d4;6@28oi>d28N-!myz
zo*<+f@?pV-I2Zmk!4JqX$XS@OH6?{f^Ai}8dY$%@PTzj`$}6{nf|l(Ee2(BQVDpPb
z#L`RZqqtH5NHcx8Xe0U$*VVIKNonE2qDDxGX0vA
zfaw-e7cbTOoEfZzRNpYXt3%QQ2I(e+O`|asGo^F6Jl~Pf11V~(Xu!vh3IH%%!(Pe$
z=@~r>D>I4du>HH_VO*d}Pfyvtr?bxUei^w5Ir)cZ=2`{_Y6DVM`IWKlMl^&1Ejz
zmAN5C(SKsPE-jR?2`g9$06c&vwoCx!gWnS%x={#WC#KAXpSCnQ?J#3btG$;nD$C^m
zAO&+X)D324b`JvdqM30=nM1Gxgh-|r1kt~!P21LX+t!BrXScKIi8He@e=Nl`O0uzm
z%ewsQxSOa({xlO18`~aaM&Bu(@|E`9HzH8P4~)W9{^1yh4hUy@Ir&<*-gVl2nukll
zGsl|W9_0%TY(%VX{a1UHlD`3zQ~~;bNnYR%*Z32E3s%~rmkMzy3YwnZ37N@X@Ah@p
lFt6CST>bOk8~RY#h=?C_A|DL(p?_`!l;zdsDr79)|37hVPKy8l
delta 10497
zcmZX4byyT#-1g8QjVRqI(jeVk0wN;PNFycPLx%{6NJy9DBOr~$f;318NH<8wg2ckI
z`;PDX-}hbD&g_}lJ+mi%b>H{GR`IT3cpn~u7;E^r002x)&ujw##z3HQogI2A6YVNizFR?fjq_$-=OcL%LqMs@_Q5OcPm~(2
zFn+e>paD6NCa)^SeAJQU^l^Y?r?u6Y?u-5P@zpx&igc(IYWk4DU~%YgH)ceo0VvMa
zpiM^Zh;)_^4Q3SbgmgQuTKh+H3Wn?tj46&emS($W
z#nGvi(|?X*h2CPNX5tCLc^2D_YQTQ&FTW3osT&6AEemjt6|c4^VqQP`z0r{FYzOBM#J7$YdIHjoK`R+dGCs1l#i(MMNG!}|EKCg5X7IGU
z(hCjx314Y)rhfQ5L=;cJ-lKwr@h(kUBRsG|tCgV1h_6vg;1jF7#Dz-9G%L?`xp8-X
z-VXg?Uvb${O;_=B(>*Q4ZRd)Z1kR`gU}SDI9W0}97I2#oNsB`
zkFT5u%m#|wng^M$;M9K%J_sfw+yq^+Bu~`nJ8te^X)pDZ9-(gC*Jk)Gl#6ac&!!)V
zBF4Wpkv<~=gfWrhIWm&}1utR2rlepQ7cX_3!PA
z%ZxuWhT-v=k@k-lH=a=?_H{?%#oqOP*6`XHx%~0CV0-x33?#~N;Di*Oo
zuTu0(e^H+PwE->v#nFq=jN!N7Yot%D$yaWEeq1M4EF0di8D~{ZO@ezX0c9^4Z<6_m
zWMyq-EZun4hPOPWTDM3SmduX*%Q>3x>?M$s$DmZGw9QK5sdu2qrR9Y&>gl5l4|Xzq
zg$hH@p=TB$k15Wh@QDQ2Oj+gJXT^_YZnBc33Hy>?T39d^nzv7vhCTiTCV+ozbGcFZ
z5?^zAXTuF1Cq8m_bE~!*a{Pr#o^d=!CkULd_x1G+j*ayno4apVqJxZ!jBG@0wY;Rni1(Pyq=bk6dUbUn#b+jNO)4NXlOlf*E3
zGIUl&7?*C2##oMIj}Dk4k;08tn0d83ny=e0RYJ1C#5JC<5nLHCH9Sb4j|oUzTC#of
z#rfo^pFN&KbHf{4z=aQb7lyw=Uc4%q-|vDJnd%hqs2O;8aM~ZvMug5{++|I$tg`X4m|VQlJ2R=@vyCE>Y+kBWC{A$K7i|L;{j0K}3q*;@n$a8=Z_g)s=Y
z&@?f8LQkbV&IBtfc`$*4*&4hqeuAwUT;n!hzQ2L8onGiGA$`;nIzT~>44CT`6}^V6
zr8T=ooVwRxG_go3fB)v2D!X>!t{oO}7hH_+OHF##kc2V@|NMerlkot9dy|wxG9kHl
zO&@ytNab^AtAC&
zZp%{Ks1Hp~8BG7{*-s+OEE?_hPkqbH#1hw^{r=w-bW=!g>vh7}_ie>${*PbaoNT3d
zKZKBb;T{Heg0y#*CKgIOov*{4a`M^`q1!h~z#;X2PC1MZEWZ^rwA)H}RaXyz<1=q4
z&b%&YpCRBy;ucd9vO1f82Y+8$aB`;CHNK+HfIZI1)Vh^7Djr3{D{E>7Hk0MY;!+Sb
z@~?OwQc~7dO*+;JaC5KGvPRB)paobQP8Ya1UJcdm8NwyZT&zt&n-%%+)O;~v(Sy~#
z^xqcufj+WrJ*T&uTV;tv3}6{JkXksok1m2o4~`A>`)dmUYg=W99|oXSombs6(N2AD
zxrwPeEyUl(x!_JHGcqJ+3>s{H>>)Y*zTG!b
zvGLY%($;3oRpeCh@$DD%ZmDXynAA6$RiOs$-tFg!_Gpk?)OA7B%}@B|=CzITuj}R|
zPeOn_Z9c#BX?D8v{g0ImXqzVsNP&_VS-iEH6nz7(uxFF;R_9;NN)j=qJh9gN6tmXck0>35}N!dCjvsZOfezA2Us
z1Xs`t80y5Jop~&TK7%8Fy|znbU`qY-r_DMr#|s6-dC4oGTha;Gj%K~e_P?q8v(6k}
zP&|VmQJ`#Uh_Sg%H5WTwE3|!A%7sTtTAF5~ewWDqTiX7O-V=EX$o!CBg@5B+war0Ia-s5;Kf8<#r
zQhU;Qdz^U%o!#6xn^sEhBRO>tz|A%mS#-Vz+-~f*JqHK=F5#JGlNjM0LfP@l-Kr_H
zw*dhGy)IHwQJb-Bw{E+wTHaw>`V91lRuEnRj{EPW~YyL;cTaHeMuXk=*~s-m!5Z
z^QzH=k2X8odg4IHeWhIy9xIAhP*fD5liBr$`j2}cnR6qD9leFy;r!)`G8-86&RA~G
ze7%FJ^?07Fbm>QLDTaY!A95I?CzdIcJCpBI&D5TL`A}Cl_`=hlqZzx$QHgSlH}f`Mj>e7WL%MIg-)D%8jCVtS#uTs3}v3QjhUC0Po>a(8GavU
zEkkgw_&|IhrtxT79|0)1YT$y<^nL&mXt@H=pj=;y$jyM?iXf4G|0UYh3jox@hbqY0@veOST1
zAJK$EbKh))LXrNIl$2J8vu(|7*!7uiofV2Uhq^D4NsB&V0A=z5?IL~qs!hO)Lvu}xC@WXUUC|Djut5A^7Mi_v(g
z=kebjb+vy@f&TM2cwPLVBtd`q6o^deW^$r6#IpKTqS@;xx`9NTFMVrj5Y9XMqSuynVoDW;8&JQ4-*WHeL6j4fQOzrX@5EKJ
z|8arHDgOUVZw2{Z(Y-xiMJH+h?k{Def}wU@@-rbudMggZS?L;buUs+&^nWi4F-
zXr*_TuALRY2?o+e(Z1lKS+Ne$$vrIB!1twlOp|HVT~Ux>_g1d0E&7Xg3&R~0_*!l^VXod&(V`8~6i
zp1o64ScsvW!LK^E`uTwGd8vKM#>Zgq@2s_c{>(#vS=3XBa~0n;H3?>!
zQhpfvZY3I9b7$>@%1E}9NTa0sR3NezaX0)xLs%pwwK!bYP9eLEcvOeb_C1kWwB#sL
zI5MRY;{pUkMMVXPiHYAYyTvXZ#Vot23sOfZ6)L#8^38HxqYFw{@`%lx04a1XG`kVl1;eDeDbhp`+@))f5o&;vPc%6r~EKHcjc1yxmq_o6YQ
z$fjrGVSMn`n*yZ&mEwFXCJ%cDReKdk*Xj
zju}9X-*s@_L*t>CR~R+288xz_R4NnKm$v%w3!T)z=)~@EWgw9ag-w&;L=x?oUz`3#KEya(a@9Qhp)NxAj@7O=!k266-
z1JDUs#!12hz-sWn-jETd4GPToii8V(iR!uaI=snw#;6*RIInzjML&uA&aWO)>aR7f
zHnNib5(U}MYRsZ~ev`bMiy!+y*!h8O$3#xq&z^dp9*0trqWyC6wvtlj6Wa!n=19b8~Sw-w8DdQOL6(8Ae+N2R3P_I&jq0b4TF-RwJMcX>#l`
zzT>Jio=OeY7uI{guJ;YgON|ej!ek^->wd8q0l1&;T^@MDBP7tV|MJIYt@M+VC^J@d
zPGNE|DP}GC1}HE1RC{9iH(~02+Mlv?XzT?#VNk%^^ZBS-w%LDIL3uBlyF0%|GnJE^
z_OyaiFK_Ab0|9_u%3DL<)Tr7_vs5?t9xym`psBt%Z;b^6BjE%7i0us3$LQg-#{{_t
z9*1*6$Jg&^M1b0J_TDwFGjxN~lwinjda&Hk<&88AM&`R!;QaPZB6N#PH&15%K&J3c
zuPsePiNe-aP`_ekaQI_!IX9`B1KF`ISC;g=%=+v9RQ1lE|AZ}k%_+41kdlItW)RK$
z;^Di$svfaR9)8~^kpYAwRMvcfSpqU(g9B#!AF{3-NiPjMI}V=5kDnPE54x(Xc}Rd(
z!WTbVo~oVV&E)~8)XpK>jR=@gm8!KhOL<2;=B$3B=eE}CMw7xxM<`k)AevWy-cA4h
ztyDbO<=pssdpND=z3f-B){ntAdu8S2Ep^ZbXM`=|27@An1{Ld9f$P4l
z>pr(@`@0J4l;roWqBo(!5h0~4SA%+>UtxHPhx76nH+1Xj&+&pnKTO12G
zZrx#YS!mFlVAer6H`3O$pWQ3h+tq`X*&<;3LHUfcB4YLo{ci*l6JdAmXq?3+*Pib_
z2P*mg^$@}X>s%Mb4#8UiM@PrFZ>qfi79h@y9}n=qlRRaMdd$GDV)tyY#6UwtWMcm)
zN_JPdErckGu0AFKsRTzjHz)69poa!5)PCv&k0!plJIki4#|Cd^Y0iT7^Wiz1kfEOk~BEXP0~A2QsjHeS%OD2m!XJ!(U6~UpW|yJf6WQNB!6Y<
z;>qA&%mZty$Ydt@q>&5(<+3U3naURcP&G50`=)tODB#T2@a4`&1w8hQ74Lu>gxWjp;YVU#n#Q~^cPh|ie*#lXWJtZp~&mn$gVoOkwFMH
zfrCq}Uae^)_VqMs#VK#Fp@;T3ih3&6H8wtgh^z;^_~!_@d{ShXj_SzXIpXy-(t9X!
zMga+PUzOYSmV!98|BSz3iegg1g?dt(%;(
z(kJ2G(Gv^9zS4eDi9nA6f5w2!H&RgjlR(<=#AM#80IXP+$)G|
z7z{oe{(ldV?a90T(Qsq<1NVQu5OOcT>gsse5p;ImZ^ZM2@V*Y`{oMdNJ3HgsE~6Y7
zi!eN+-MGSFM^h2nVS*`3wts~Y_v6P{0OiAnKWv2yJLP;$H8Mt`OG`NqS30t#-3t`M
z@_XZO?|%O_N}7ah?dB#BTA=rI;v`bJBo`MKkbwbRzY``#SP{tQWx5zvcS_*(0Eh_g
zWQf!p6V*qHi;5ONtFBf|{xAV2A4DO@v@?z4gRKRrt-cvUjK#m0frzYGzlI5D3X7~?
z1d_#jV*s9wE?6ZE)A-rRU+HRQu{7=fcnA`trF4g;VTN15kP6JyUY*oM`MGfdDG94M
zrWV2-dYzfu=^Dc87yjh&YGC!5*Q?NHk6be5yEZTUSyJNG!Amg)eC(TTJk0RS^FFe>
zLzQ67W;0R#7l@bIH(Lp>j#Db5p7`!gu#{F*5R~cWDnY*1V8SPUIRc*HbuIs$m8*SF
z71~KTRocAnC(Y1v!}*I5P?pr3!@pjOBz-++I4$Pv4)xK^m5MF}OG`2I@TG&V1^*S&
z>3pVYZf!?m#=Pm7Ko5A+>Ah$0V-s4uT4UaxW1P7Lr~C0cFO7^|Lt7{01?(R9qgP%X)j_B*<~ZSNyR!I5>J9xe35S6pxzcT_B!S?d@BkhkPcK
zUY%s9odi%WM4O%BI#>=+xZamIZ~bi#D5$R~>gPv+WP1O1Nbk+*e)Et@q!wsoq&I8v=FOX$V-U#fC?G;#4K4SO
zpbQ)Ey7YCav*u6!?oH`H#n_>*w0&C;Db{Jef5j-WOG1CrB~n2T_s0Men1eCL2qg4T
zc!fGSJ(|T*7{AX$_gaPtNar`F6~VLG`}JiB0S`8@RGw5oGLgi__O+y6cgDSxSW3Nk
z3TmJSMt07-Cs+D4w#Wy!44}BT6jVq=bJeWE7+&0wSlF$^9nis;R5NDKMKygnQkIA#
zG`;-vb&S$A(stKtK;6Ul5-ER%c#XrHKaLmsH8;h3ge7%w-3}>>R2biSso6|VV%m0!
zy7HIoG)cj+R2%1kkm-Ukney`TvXC;!5*#Z07coF0(I$2OtgWpr)poSf#z6M6
zn|LWQh@|sw_-UNlyiY5XBbZRzGRJ|A=>`3hi~zJD5I0#_Svjb^!_@unh@}Pw~-GP@am3!Hr3GtrcTGlRrv{Q!D;wd=L*Bdfmgc(HnoC`d%@q+k1g>
zbea~&EI<(3lM|wJjW#LLYtg~&d4h?$&KL)Pu`%As{IE8H^%%gBjrnshfFG?i@$maP
zfy3VouIKP=hiT9`N@)X^ZK2C5lc<{fbf6iH4S4wayhC9xEkA8x0T%EzIGI}Z(fTYh
z;T{5^!VfG%W5`$0Y|lbCF`eB{I%+lwm16}R#^}9~^FU-ba2x3hRkN8j^0D)T!@wMT
zx+af}j`2>s8+VgvJ4(p1hOG;G?#LHea!3Qn29X4VJE#*IXg;;`E_3KhOApAcmppoi
zXL+?*Cly{nE_vwN*i!GCFM|byul~{rG1Cf(ns0?}g=O;}&8g;v5d}CGjm*e#$yH4{;Cx9D?A@6?*
zwwW<>!29WdFg(T^c){>o#?9G30pwjmLhE^{PB!@_n5Z^Yb&R)<_IDx*b@U`y8Uvc-
zjh+I`)I@Cb@0hiVw<12wGAM{!yT>guRdFH@V%ShShk>DDetulb*wALcHN`Qy#E5)l
zg!?j=@e6(Fg4Rjqz5uI-
z2eBR}{ee+ttr2k1XIP?jW-Z0KE~~YdJ!#&TBSv%v;1Qt!r%|J-$C+y4{3}Dh(bz=;?g|}YJFI99LNB!J93vIN#!qU
zB~Z!dipCT_&g`zN&wNs!m2m&)fCZDWG#;2Rr9RZVv&WQyG^!dKEg!w%8LnoTg!~#b
zO&Gz%!F-u=s2fl?eM&=zWLmt&ZjwD06{RJ1)L$zL+g`-2UA~APp2&c(W?^^?E;Hmb
zXq%N#HZZ78P>;g!$D@VX#r#=3
za*0egm(D`%JM`_I5;n)Tf`j8ndzXnS-@{NbU?VbBinXDl}%SK9A~
zb7N6U3-yyHPv*Y+JpRw$m2Wp1=JgZsu@L|G)^LC
zC{^Oe_DEc>EIPWn_CZgbcWFUs%+a5xWes$u0x#`Tige(;Als8UP2BT4Jce82E8H85Fmpm{+6=->(OK55)YyE)uy3^HYk?cE5-J
zBROMWk)$BA>V9lOc=2eojwa_r0TbUwp->fl`*z0bV^RoCo%Uz9O*}Z-*pFN2UEqFC
z?}oR~c(}7CDuvx6r&7eC!Tz}gk>q}PjUH_#OY|+Qk_LxyN-h5tbhFr}7AG8;Gz
zX&=Ka?t+AZlVN3(Tq(Am$gBO;p3(Gdob`c`P1~J^4R{NZxAfIww)Pse{(D6whXe4g
zcPDkI)jQ7b-;2!{o@JLOIuYw&Y2oOow%NGDyl8m0zg+jcfo-o8D+UPGkH!{3#mWzN
z0O;~N2GMd5DX`Xe1f%H1U9bziKDD-oqG(ilTJ^nMZK(3`hoJ0dD$5nksNr!vguHoc
zL`6jf%goHoQjmAL+{{8FM7kfe-ps*&JdCkSUtjQC4Y^9W&!y{ug3X;idauSddnX@q
z^Q#H#~&qkiTwwnrt@pI@JKHbL|taU_eN3r2#MO
z3^7ZTF;2BD01LtNHi>XRU(qYA<8KLHJ`$u%>iYeQW&di`YM3oJ&y2Hg{5Tf`ViUTn
z-19g06}VUWXXxT}i+g(XWPeikXT~X&DhSf6H1T8yVP0L!77Vz)G|4=oYq}3P=%}<9
z=_V$+%)TYKlN&_T-4;yko*ue4u~3pI^V^`gl-C7aUYhh?
zpsDY#pKl4%gkG*mNi31He+LhIs!4Ef0*YlHoEFgjQ(H4d97uQ{5<*_~&AKP1rzMW_!(K6$z38whoVNzAu0IrQRu6gb)
zwu+l5RW^GH4p>FXe{chcq`ZC{)WF7;yr-TDiKB4{AF}gZV;y>SK`p?l&7bdK!mcjeTF{O^_u=^FJ9LXY^$16v+xcGrr?g5C;I&;H1e`fa_Rs~dl
zu@b~DOtm0VtFSFgyF@!utLX0QQ>niBaFYdI@a(U;j7On7>FFt
z2h?K$3I@6g2wuXySUyVPg)MYhlBawk_|Q(^;f>Ec`7LF5XOSF~r(&JoJb^!Ejgi9e
zY|z7`KO+O=$-ZcP%GWW~&6izF5YM`FKo=?6Yt)K*1ZB3M?KHTU+fDjVXT4yQZvGwHOD!*d
zmav2!RJSFynDJ8+;eN`8^FXg}Hysh~*7i1r)$<8oZ~R$?&;O@B#y)Rs1o6$6
zF~+w&-v-knp}54urPnWyf|Dx#uekTJY9^{$_!JSmR2i$l+{K-yg;{&c4slw5iH>~2~RFjUBkav5uEko2^i|6+6;3a5tzsUUX<9HNm
z{8K?~xu6e<$@1OZ$uZR|x_L>9->jWE6FsF2D1R8)R?^iaiRfmQLu}nY_HTPWH_Am(
zvAn0Et*xyyyq=Ro-(t4midkq>6$HOd9d|UJ@Y+pO&_KoC2f1D+ZEtOPz?|6lsqd{r
zz$)T=^Ph&FF=8WUSz*|JC{t?4Lmscv;Qkv{t8JZVer`)CdJchDulSaQbd
z$