From 4e3d5c42a52a88e8bbdbd1943e5282c4b66c54e9 Mon Sep 17 00:00:00 2001
From: Casper3667 <8396443+Casper3667@users.noreply.github.com>
Date: Wed, 29 Apr 2026 22:08:49 +0200
Subject: [PATCH] Ops restock pack changes (#22351)
- rscadd: "Added several new restock packs avaiable from the operations
ordering console."
- balance: "Rebalanced the prices of the restock packs."
- rscadd: "Made the restock packs come with cargo access locks."
- rscadd: "Restock packs are now actual boxes that can be opened."
- rscadd: "The commissary restock crate was moved to the operations
loading bay."
- rscadd: "The toy shelf can now also hold cap gun mags, card packs,
card boxes and music cartridges."
---------
Signed-off-by: Casper3667 <8396443+Casper3667@users.noreply.github.com>
Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>
---
code/game/objects/items/toys.dm | 8 +
code/modules/cargo/items/operations.dm | 165 +++++++++---
code/modules/cooking/machinery/commissary.dm | 245 +++++++++++-------
code/modules/cooking/machinery/smartfridge.dm | 2 +
html/changelogs/CommissaryRestock.yml | 11 +
icons/obj/storage/boxes.dmi | Bin 13280 -> 13377 bytes
maps/sccv_horizon/sccv_horizon.dmm | 3 +-
7 files changed, 304 insertions(+), 130 deletions(-)
create mode 100644 html/changelogs/CommissaryRestock.yml
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 01ad8e8f82b..1e9ff3aa271 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -352,12 +352,14 @@
item_state = "comic"
/obj/item/toy/comic/azmarian/issue_1
+ name = "az'marian comic - issue 1"
desc_extended = "Issue 1 - The Az'Marian Landing! - In this issue, the would-be hero departs from Az'Mar and lands in a war-torn \
town in the outskirts of the Kingdom, witnessing the townspeople terrorised by a Zhan'Khazan maniacal terrorist. After mutilating \
his body with alien technology and even cutting off his own arms to replace with robotic equivalents, the cybernetically enhanced \
Corporal Khara'zan will not let his reign of terror be stopped easily. Will the visitor from Az'mar manage to stand in his way and prevail?"
/obj/item/toy/comic/azmarian/issue_2
+ name = "az'marian comic - issue 2"
desc_extended = "Issue 2 - The Road Towards A Dark Future - In this issue, the Az'Marian meets the local nobility whom he had saved from \
terror, learning that the Kingdom is threatened on all fronts. The superhero embarks on a journey through bandit-infested lands towards the \
headquarters of evil, meeting an unlikely ally and his band of friends. However, all is not what it seems, and the superhero will soon face \
@@ -365,24 +367,28 @@
faces the modern threat of depraved Tajara."
/obj/item/toy/comic/azmarian/issue_3
+ name = "az'marian comic - issue 3"
desc_extended = "Issue 3 - The Swamp Debacle - In this issue, the Az'Marian and his loyal but dim-witted sidekick Murr'zhul reach a poisonous \
swamp polluted by waste-producing factories. A chemical-obsessed scientist looks to experiment and find the perfect poison for his evil deeds, \
killing the surrounding nature and turning residents sickly. A lumbering creature hiding in the swamp caves, a mad researcher about to find the \
perfect toxin, and the duo seeking to halt his plans. Will they find a way to shut him down?"
/obj/item/toy/comic/azmarian/issue_4
+ name = "az'marian comic - issue 4"
desc_extended = "Issue 4 - The Den of Evil! - In this issue, the hero and his loyal but dim-witted sidekick Murr'zhul reach the stronghold of \
the retreating Corporal Khara'zan. The superhero uncovers a sinister plot orchestrated by the Corporal's superior to turn all of the local living \
beings into cyborgs. The leader, Director Shul'tyz, is not yet aware of the Az'Marian's presence, and the time is ripe. Met with a slumbering horde \
of cybernetic ha'rrons, schlorrgos and even Tajara, the superhero encounters a threat that will truly test his mettle."
/obj/item/toy/comic/azmarian/issue_5
+ name = "az'marian comic - issue 5"
desc_extended = "Issue 5 - Path to Recovery - In this issue, the hero, who has faced a successful confrontation with Director Shul'tyz, managed to \
free the local populace of cybernetic mind control, but at a heavy price. The syringe that was shot into him started coursing through his veins, preventing \
him from using his powers in a rapidly degrading state. His loyal sidekick Murr'zhul helps bring the hero to the capital of the ancient Kingdom to seek aid. \
Met with internal politics, a mixed reception, sinister plots and a meeting with the King, will the hero find a way to recover from the illness that plagues him?"
/obj/item/toy/comic/azmarian/issue_6
+ name = "az'marian comic - issue 6"
desc_extended = "Issue 6 - The Pilgrimage - Steppe Trouble! - In this issue, the hero and his loyal but dim-witted sidekick Murr'zhul embark on a journey \
to a sacred shrine in the mountains built by the early Ancient Tajara. Having received a blessing to prevent his state from degrading from the local priests, \
the hero has little time to waste before the blessing wanes. A meeting with wandering nomads, an audience with their ruler, and a perilous journey across \
@@ -390,12 +396,14 @@
trusted Hharar side-kick manage to reach the mountains?"
/obj/item/toy/comic/azmarian/issue_7
+ name = "az'marian comic - issue 7"
desc_extended = "Issue 7 - The Pilgrimage Pt. 2 - Mountain Survival - In this issue, the hero and his loyal but dim-witted sidekick Murr'zhul reach \
the mountains that contain the ancient shrine of the Suns, where he would be able to recover from his illness caused by Director Shul'tyz. Trailed \
by Sham'tyrs, facing freezing winds and snow, the two will trek to reach the shrine in hope of recovery. Bandits encampments, a village in need of help, \
a chance encounter with the S'Mara, and a shape-shifting spy amongst the Sham'tyrs, will the heroes make their way in one piece?"
/obj/item/toy/comic/azmarian/issue_8
+ name = "az'marian comic - issue 8"
desc_extended = "Issue 8 - The Shrine - In this issue, the hero and his loyal but dim-witted sidekick Murr'zhul meet the Parivara at the ancient shrine. \
Tended to by the Sun Sister with the blessing of Messa, the Az'Marian manages to recover from his affliction over the course of a week. He learns of an \
evil plan staged by a group of Cae'rrin living in caves nearby to desecrate the shrine and eat its attendants, and the two embark on a journey to put a \
diff --git a/code/modules/cargo/items/operations.dm b/code/modules/cargo/items/operations.dm
index 1a0a203bdab..76ec7851ad4 100644
--- a/code/modules/cargo/items/operations.dm
+++ b/code/modules/cargo/items/operations.dm
@@ -587,11 +587,11 @@
name = "commissary cigarette restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 200
+ price = 240
items = list(
- /obj/item/commissary_restrock
+ /obj/item/storage/box/fancy/commissary_restock
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -601,11 +601,11 @@
name = "commissary tobacco leaves restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 150
+ price = 100
items = list(
- /obj/item/commissary_restrock/rollable
+ /obj/item/storage/box/fancy/commissary_restock/rollable
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -615,11 +615,11 @@
name = "commissary chewing tobacco restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 175
+ price = 240
items = list(
- /obj/item/commissary_restrock/chewable
+ /obj/item/storage/box/fancy/commissary_restock/chewable
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -629,11 +629,11 @@
name = "commissary smoking accessories restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 400 // includes a bunch of lottery tickets, so it should be relatively high compared to other restocks
+ price = 140
items = list(
- /obj/item/commissary_restrock/smoking_accessory
+ /obj/item/storage/box/fancy/commissary_restock/smoking_accessory
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -643,11 +643,11 @@
name = "commissary electronic cigarette restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 225
+ price = 80
items = list(
- /obj/item/commissary_restrock/electronic_cig
+ /obj/item/storage/box/fancy/commissary_restock/electronic_cig
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -657,11 +657,11 @@
name = "commissary snack restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 150
+ price = 100
items = list(
- /obj/item/commissary_restrock/food
+ /obj/item/storage/box/fancy/commissary_restock/food
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -671,11 +671,11 @@
name = "commissary xeno snack restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 150
+ price = 60
items = list(
- /obj/item/commissary_restrock/food/xeno
+ /obj/item/storage/box/fancy/commissary_restock/food/xeno
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -685,11 +685,11 @@
name = "commissary candy restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 150
+ price = 65
items = list(
- /obj/item/commissary_restrock/food/candy
+ /obj/item/storage/box/fancy/commissary_restock/food/candy
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -699,11 +699,11 @@
name = "commissary microwave meal restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 150
+ price = 220
items = list(
- /obj/item/commissary_restrock/food/microwave
+ /obj/item/storage/box/fancy/commissary_restock/food/microwave
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -713,11 +713,11 @@
name = "commissary drink restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 300
+ price = 150
items = list(
- /obj/item/commissary_restrock/drink
+ /obj/item/storage/box/fancy/commissary_restock/drink
)
- access = 0
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
@@ -727,11 +727,110 @@
name = "commissary beer restock"
supplier = "getmore"
description = "A box full of stock for the commissary."
- price = 200
+ price = 100
items = list(
- /obj/item/commissary_restrock/drink/booze_cheap
+ /obj/item/storage/box/fancy/commissary_restock/drink/booze_cheap
)
- access = 0
+ access = ACCESS_CARGO
+ container_type = "crate"
+ groupable = TRUE
+ spawn_amount = 1
+
+/singleton/cargo_item/toys_restock
+ category = "operations"
+ name = "commissary toy restock"
+ supplier = "getmore"
+ description = "A box full of stock for the commissary."
+ price = 110
+ items = list(
+ /obj/item/storage/box/fancy/commissary_restock/toy
+ )
+ access = ACCESS_CARGO
+ container_type = "crate"
+ groupable = TRUE
+ spawn_amount = 1
+
+/singleton/cargo_item/dice_cards_restock
+ category = "operations"
+ name = "commissary dice and card restock"
+ supplier = "getmore"
+ description = "A box full of stock for the commissary."
+ price = 120
+ items = list(
+ /obj/item/storage/box/fancy/commissary_restock/toy/cards_dice
+ )
+ access = ACCESS_CARGO
+ container_type = "crate"
+ groupable = TRUE
+ spawn_amount = 1
+
+/singleton/cargo_item/toy_mech_restock
+ category = "operations"
+ name = "commissary toy mech restock"
+ supplier = "getmore"
+ description = "A box full of stock for the commissary."
+ price = 200
+ items = list(
+ /obj/item/storage/box/fancy/commissary_restock/toy/mech
+ )
+ access = ACCESS_CARGO
+ container_type = "crate"
+ groupable = TRUE
+ spawn_amount = 1
+
+/singleton/cargo_item/comic_restock
+ category = "operations"
+ name = "commissary comic restock"
+ supplier = "getmore"
+ description = "A box full of stock for the commissary."
+ price = 25
+ items = list(
+ /obj/item/storage/box/fancy/commissary_restock/toy/comic
+ )
+ access = ACCESS_CARGO
+ container_type = "crate"
+ groupable = TRUE
+ spawn_amount = 1
+
+/singleton/cargo_item/nka_comic_restock
+ category = "operations"
+ name = "commissary az'marian comic series restock"
+ supplier = "getmore"
+ description = "A box full of stock for the commissary."
+ price = 50
+ items = list(
+ /obj/item/storage/box/fancy/commissary_restock/toy/comic/nka
+ )
+ access = ACCESS_CARGO
+ container_type = "crate"
+ groupable = TRUE
+ spawn_amount = 1
+
+/singleton/cargo_item/music_restock
+ category = "operations"
+ name = "commissary music restock"
+ supplier = "getmore"
+ description = "A box full of stock for the commissary."
+ price = 50
+ items = list(
+ /obj/item/storage/box/fancy/commissary_restock/music
+ )
+ access = ACCESS_CARGO
+ container_type = "crate"
+ groupable = TRUE
+ spawn_amount = 1
+
+/singleton/cargo_item/tea_restock
+ category = "operations"
+ name = "commissary tea restock"
+ supplier = "getmore"
+ description = "A box full of stock for the commissary."
+ // Bulk commissary orders are at a discount, so cheaper per tin of tea than regularly ordering tea
+ price = 75
+ items = list(
+ /obj/item/storage/box/fancy/commissary_restock/tea
+ )
+ access = ACCESS_CARGO
container_type = "crate"
groupable = TRUE
spawn_amount = 1
diff --git a/code/modules/cooking/machinery/commissary.dm b/code/modules/cooking/machinery/commissary.dm
index d2d0143c214..7975875d4ce 100644
--- a/code/modules/cooking/machinery/commissary.dm
+++ b/code/modules/cooking/machinery/commissary.dm
@@ -122,7 +122,11 @@
/obj/item/gun/bang,
/obj/item/eightball,
/obj/item/bikehorn,
- /obj/item/camera_film
+ /obj/item/camera_film,
+ /obj/item/ammo_magazine/caps,
+ /obj/item/pack,
+ /obj/item/storage/card,
+ /obj/item/music_cartridge
)
display_tiers = 4
display_tier_amt = 5
@@ -130,25 +134,6 @@
/obj/machinery/smartfridge/tradeshelf/mouse_drop_receive(atom/dropping, mob/user, params)
LoadComponent(/datum/component/leanable, dropping)
-/obj/machinery/smartfridge/tradeshelf/attackby(obj/item/attacking_item, mob/user)
- if(istype(attacking_item, /obj/item/commissary_restrock))
- var/obj/item/commissary_restrock/P = attacking_item
- var/item_loaded = 0
- for(var/obj/G in P.contents)
- if(accept_check(G))
- if(length(contents) >= max_n_of_items)
- break
- P.remove_from_storage(G,src)
- item_quants[G.name]++
- item_loaded++
- if(item_loaded)
- user.visible_message("[user] loads [src] with [P].", SPAN_NOTICE("You load [src] with [P]."))
- if(length(P.contents) > 0)
- to_chat(user, SPAN_NOTICE("Some items are refused."))
- update_icon()
- return TRUE
- . = ..()
-
// -------------------------------------------------
/obj/structure/cash_register/commissary
storage_type = null
@@ -265,14 +250,24 @@
set_light(FALSE)
return
-/obj/item/commissary_restrock
+/obj/item/storage/box/fancy/commissary_restock
name = "commissary cigarette restock pack"
icon = 'icons/obj/storage/boxes.dmi'
icon_state = "commissary_restock"
item_state = "commissary_restock"
w_class = WEIGHT_CLASS_NORMAL
- var/illustration = "sparkler"
- var/starts_with = list(
+ illustration = "sparkler"
+ label = null
+ foldable = /obj/item/stack/material/cardboard
+ color = null
+ icon_overlays = FALSE
+ display_contents_with_number = TRUE
+ allow_quick_gather = TRUE
+ make_exact_fit = TRUE
+ can_hold_strict = TRUE
+ closable = FALSE
+ opened_icon_state = "commissary_restock_used"
+ starts_with = list(
// Cigarettes
/obj/item/storage/box/fancy/cigarettes/pra = 3,
/obj/item/storage/box/fancy/cigarettes/dpra = 3,
@@ -286,7 +281,12 @@
/obj/item/storage/box/fancy/cigarettes/cigar = 3
)
-/obj/item/commissary_restrock/rollable
+/obj/item/storage/box/fancy/commissary_restock/Initialize()
+ . = ..()
+ // The copy() at the end is required to avoid every line after this from imploding. Why? I have no idea. It just does.
+ can_hold = src.starts_with.Copy()
+
+/obj/item/storage/box/fancy/commissary_restock/rollable
name = "commissary tobacco leaves restock pack"
starts_with = list(
// Rollables
@@ -298,7 +298,7 @@
/obj/item/storage/chewables/rollable/vedamor = 3
)
-/obj/item/commissary_restrock/chewable
+/obj/item/storage/box/fancy/commissary_restock/chewable
name = "commissary chewing tobacco restock pack"
starts_with = list(
// Chewing tobacco
@@ -313,7 +313,7 @@
/obj/item/storage/chewables/solar_salve = 3
)
-/obj/item/commissary_restrock/smoking_accessory
+/obj/item/storage/box/fancy/commissary_restock/smoking_accessory
name = "commissary smoking accessories restock pack"
starts_with = list(
// Misc smoking
@@ -327,7 +327,7 @@
/obj/item/spacecash/ewallet/lotto = 8 // A bit of a risk that hangar techs may just use them instead of selling, but that should be handled IC as theft
)
-/obj/item/commissary_restrock/electronic_cig
+/obj/item/storage/box/fancy/commissary_restock/electronic_cig
name = "commissary electronic cigarette restock pack"
starts_with = list(
// Electronic
@@ -339,7 +339,7 @@
/obj/item/reagent_containers/ecig_cartridge/grape = 2
)
-/obj/item/commissary_restrock/food
+/obj/item/storage/box/fancy/commissary_restock/food
name = "commissary snack restock pack"
illustration = "snack"
starts_with = list(
@@ -361,7 +361,7 @@
/obj/item/reagent_containers/food/snacks/sosjerky = 3
)
-/obj/item/commissary_restrock/food/xeno
+/obj/item/storage/box/fancy/commissary_restock/food/xeno
name = "commissary xeno snack restock pack"
illustration = "snack"
starts_with = list(
@@ -381,7 +381,7 @@
/obj/item/reagent_containers/food/snacks/adhomian_can = 2,
)
-/obj/item/commissary_restrock/food/candy
+/obj/item/storage/box/fancy/commissary_restock/food/candy
name = "commissary candy restock pack"
starts_with = list(
// Candy
@@ -393,12 +393,12 @@
/obj/item/storage/box/fancy/vkrexitaffy = 3,
/obj/item/clothing/mask/chewable/candy/lolli = 5,
/obj/item/storage/box/fancy/admints = 3,
- /obj/item/reagent_containers/food/drinks/bottle/bestblend,
- /obj/item/storage/box/fancy/foysnack,
- /obj/item/reagent_containers/food/snacks/choctruffles
+ /obj/item/reagent_containers/food/drinks/bottle/bestblend = 2,
+ /obj/item/storage/box/fancy/foysnack = 3,
+ /obj/item/reagent_containers/food/snacks/choctruffles = 3
)
-/obj/item/commissary_restrock/food/microwave
+/obj/item/storage/box/fancy/commissary_restock/food/microwave
name = "commissary microwave meal restock pack"
starts_with = list(
// Microwave meals
@@ -418,7 +418,7 @@
/obj/item/storage/box/unique/donkpockets = 3
)
-/obj/item/commissary_restrock/drink
+/obj/item/storage/box/fancy/commissary_restock/drink
name = "commissary drink restock pack"
illustration = "soda"
starts_with = list(
@@ -451,7 +451,7 @@
/obj/item/reagent_containers/food/drinks/carton/small/milk/strawberry = 5
)
-/obj/item/commissary_restrock/drink/booze_cheap
+/obj/item/storage/box/fancy/commissary_restock/drink/booze_cheap
name = "commissary cheap booze restock pack"
starts_with = list(
// Booze
@@ -465,61 +465,114 @@
/obj/item/reagent_containers/food/drinks/bottle/small/xuizijuice = 6
)
-/obj/item/commissary_restrock/Initialize(mapload, ...)
- . = ..()
- if(illustration)
- var/image/illustration_img = image(icon, illustration)
- illustration_img.appearance_flags |= RESET_COLOR
- AddOverlays(illustration_img)
- fill()
-/obj/item/commissary_restrock/proc/fill()
- if(LAZYLEN(starts_with))
- for(var/t in starts_with)
- if(!ispath(t))
- crash_with("[t] in [src]'s starts_with list is not a path!")
- continue
- for(var/i=0, ieNNmDw~l_mnAi1glDf*`$F0i{WiDiEYfNf1O(x|9H+
zBb|gEN+|F6-#hoddGpVm|IU4vA;Zqe;q0~7UgcZgUWqr<*QB9jrvw0iMq5kmApj8B
z{C!c7fmfn!3v>Yh@;SuV+)vHH*WSn3%g@=<0|0`u-enAUV8p3^4E%h=iVYvnwf1GR
zpjND{q9430!jN|3`P<;}ba
zxZ#z>`RIl2VdoS4K~T5W%~Z7VU7I<-4;~&Vv0C}yWgi7$$Q39YMeN%gl2P+Vd3?Id
zyt*3ldXUldcG?0FRj+y2$k&LgeqR#4>EJkjwz~bWD=yEpT!p~47hdfrtLx({AN6cA
zUj6VVagbME-+k8UuuR|mXTPt9cP?M)r6Nd~lW%qy*{D?<*KaklH;*Zua=!8Lj(M2f
z>ZZr`N_tUazQ_tI4f1v0%Uc*9nWWkl|2iq%$!Ei&An^G{0NdLyT=j;(?A>Y#_HHg2
zttHg!gx2cOYqe_xMDi7^Plz7A%T%;9H`?qUG_Aj%JfLdRu%p$KW2SlEw>c;NHj}~S
z@lpYdYg*r0!l#I5nhm~JjR($yem_xo8St_$=mGCHUV4Qk)1;r?2+^zKwj{BV&s+LU
z=47K3|K!tGl}6mvjR_~K=kVg=)6aGrRbAA&!bN<`4ew;}U4Yv3?F&vkQOo4MKd)wz
zs5!Kan}{pc@Tw-yTr|HABGx_@=T#uRy2otlmr+c$nSzkS&ol`h{i+?0zM<;XJ;lig
z``A}F_He?xf$<4toZctXd|Je4hK_5B(yf=Z<07Xs>a+o(ZRN|)LL(kblqCwwN-~LL
za-Gv0Sj~0)s64tINq3dD`_;VwmXx~YMm~Deg+EXB+2@nXjV)R?bn?)^xH?9qw6MB
z@sAd!$IqPd=3cYq3tPX``DIEmu$9{L)pD+Vx?hg2XXPwp=kAKaVb)%_?BVYG{8w_r
z-e+Oyw6I$
zcv!p^mBkB0xq^!f5hoWHb}W^2-77b)`w4D2S*UWiWSV6A=NrLk%CXf|r!0lw%R@s$
zWcvwmcliVNeq1pNF04I3#S|fh*aBdlsVOyCO6Aj5^f03Qp#b+QTc3fXX3-S?$@RJw
z*Y7{#RvvV@V%=vNe?R1|J7(Bck17}x`Y1$3$GtiKN^_{(k=E+HtaZkUVU%+up)5SYwy559M=&z
z%Y{In%t#Hl5wu!pxMI*7nabKUP4{!9xso{E
zn_YL=rFPr<<#Jb4tgUk%K6(_@5lgpWy|F#tQBqnu)SAM4cWT7{jvWyCu?FrfXa8NwnGW5mxIaV@rWjPzXK)(iwQ4=i7a>n}Hun121%FOlNt73Ro6)Nk`}U)u@w(95fs0d7
z&=6swBc{iGqWt+Og`+p)h>Y@-&O+B(P8XyvX5HfBo_ZgXPlR8xjq&XA4q7)R0#qB^
zoc-BcI39yz3}XIUjFrN3oar9R^`bR2x!epxl!P%ePA3G
z-<&rmTj^|94#x`Pmi8YXNZ--x*Hjx}kfoVRB-6|@yJtqttzcdt`5(6Gr^KI+A8`J^
z%rFT@S7(%V8V1}$Xb|dTn(+WREhJsvB^*Ue{v1Ki`|Rlkp&E(*heTOq+nUa7K}Y95
z5m`zbdv{)hq%_Rvb@ZWA57sQNb}#@X<3DdDNbZHFM!Zv32M$Bu%%Q0SD>wHyzv+doGBV@5J_{9@SQds%zF$;kdh|>-0
zM*HY*bctB5`k)Mf3>kyHlP^-OEOp?czIS#K0bgor^2j2_4nJ}$1Q}BEC|T|lAwxck
z9fVfij{imIwH`G~J@}+Fcsi-6rWV)Uu0jYVhCrCQ>hXR&Ud@y?fUI((L3wI!eU3ye
zIQxO1@GVM5A~p2`SAW#$DZdqrO-0c$E^)}|r-AYWzM^!fh0a~u(vmZUOTGxWckf<=
zhrgtxBydkn`m4Z*$ypRRT|!b4H7Lha@yTL-gyM!SqL>!TsAQ=`EdGn
zV=0(HS^{ZkFuO%1P+1JKv`BnYU5BeH}9c10N^E>=Ffq;W{xJ0|P^oB1=DH
zRN|#c%KS!uFlL$}qohJMU^63sWt9b3FQz9!^cS2k3hKY88m0pbgL5BG)bwA?YKMI!$liKs<>*-!b57P-t)XU3icVMR7~a?aJU|9A
z2AXNbsB8Q+Wga3#-%e9a)!5;@#qJ&hC5E#~o-paDx$$v?Cwv3_c$U{?ysW^wPAnzW
z`SHLg#rW{q2NyG<&!f{c?se9#ln->Kk=&eUT_&0PuzPFeb8e=ZiOv1zsY*Xb{H!;YH@fQM#jf(_
z*XMVF*_c0kN0b80zyH0U_b*4se|BR$YLm8Bkers2z6Uk4uwOlqu2)x;$||8EQD%^B
zqM{OMh!$a{qUBcTcJ=u9{kz(HWA=v+lWUb1QFKZ-02}ONoi!ZCO}_o6CYKpN*d0Gy
z`Z-}h<*4H+uZsKXy_=lxjKSApV=NCxMn<01ab3H9o&7gmVyB%No6CI{m$KIx88__g
z?TN-A6RY%N{6Oow*RT0S8|NUQ$}QNaE~3w5751wkkH(*j3Fa~Z^euMLcHz6)^KPYP
z*mpu^`5wKgKtv`_0tpaSTlDd~`VsyNOnwLJ5Ra^|0#^81P%$=(L;v0-1LVbhwKYu<~0I66ULAAmnK=+o2VJ^za=2Xx?D
zP(~FMm6z)cY!k5&vwZ#CyFn*w#p<9#CnO|DRL}se
zmpjB2eV8Z>=Z1q@aw35b2C60QN(bFE|0agG>zHtfZ=16xX0nO5=)AhLpYHd4ZS6~@
zm6n$PEdv8hEiDRDR2_Q+5*ijCAOFB^ftBb^&Yo-OGzIA)wUiqP^>}6L-4oxZ#;fn%
zzO@OqUblk1!|n=-S-xgM+(qE;@a1pSoZdq~}jf0*Zd_R
zf6?rJ&zp{Va1jl(oU*({dYLhOnKHzHMiOhD7Vcs3&d-F|_>J7t=C>P)hdt2F)t$vn
zjG4L#5uh|c*M^)9Mf^$d$lmpT>GjRd=yWr-TZ!aGPj8bo@dk?-6+nU9y?qlMGF+tB
z{+KWwI4gqv3axc|RZ>!N@4S;Js&|%{lk8
zr0XB(_EQ`F{$V-+1>W2yep{5fVKO@;zar{^=MQVU2vv2N75AVxU!-qWHbClUrQ=Ka
z>e4NT^xhMexI-!6IXnRHu-zK#EjK=}SQ4`ar#;Rfjt?hM}>ud@opv^cCnJ
zA4DHLdUVDAiKoj^S!FZsE+Llvdx&92poNX_NNR1hiOQL{WSFCsFIi2cToi(Dz-CO!
zG3kb@*)x%EG>b6+RD|)b)VkYmWZw9j7{3c=a=R)OcRdAXM`tH+%@SdL6@0zjG*JC{
ze&^|Cx#|z(-9HL>v#VxjS)(8HlmqJwLPkCHrcd-@M!v2OP*$GQL{`p2tU5?t^lz5P
zEuCFE3?kWNt?y5>KK!oZ;NWnyKWu=-Xc(yLQYF<@d2(kKgi@5xQvvYtv=on;7oeE$h
ztOK>#MzR2}xVEX8-{CRTZ5FyIFqgTGnhm2cHZ~3lQ%WUnbRL(sV$b{hxfgl9R-DVu
z+_ZipaBrNG5E$GANdNl96%GJHM4om_w2MXD##fdcvGbXGU76c+(ZdMS-z|u{C)198
zwz4EC_wAs!<6jfpp9;{fL9=B1$OLOz~k@Gd!f(io*D9U+{{sn
zK0&Vjxa*62vlhorS;0kxt1`q;`9$U@^Zt`?#(ul%xutX{zJv}d2}1O{kQwrSQceE%
z{O^C{(eWrTa;i7l-;a;^9J^@M%V~q{#y&sJ=f4migKfWmdy+lWd|QwTxWVn++A6Z&
zCfEo!Vb3L&>=kL4;wPhKjX)s8!HVe5(vmHv-aV$3Z1!>U-xBHSH9>;$BZ7XBjpWxwFDQ;lNr8x5W`%@~F_#!|HWixLH95I)dJb18`<3?Fj{Qu4
z%>%87D!$DF3Ui6fE0(^=KoT7kF#qcFX?M=ujH<11+eC`S+P`@&`U%a3YS3AU`hCGqQ=qtWZzlg_|Kad
ztHdhZ>pS!zi*d)Qs#S0&ryIMwyXf0p<26S
zo@zXD+)X-hEM@J6N9%#|t@tZf
zuCPizrKnHhPR30)+xM&v{e64u)-CGNs+g@ZlX52Ckh|^e?TDZu{;JC7XaO5r$x9;!
z_rF{FCcl&*&8t)n!i=_e8+i>gZ2y5zAUQZBAo?(zoWoEgseZ0oYcUUJ>m7HJoY^oy
zOpoJv?_qM;?
zLKt|q`)mCC`IGY3FcENjCTwEN9F_d%sr`wK&EQ?%af{>*beGN5h^{ZBx~BHczCZPz
zIdtg7q}4VD?UN+&$g-{kDn{=}5i^)FQUM62KXZBU1`C}uKjS#*KfCgz@F=HLS~X9$
zA2u0gg>QbYJjl9v))TOQ37hz+Sf9;0v@_w#FKolCXnsM#D;i$*doY-i>1T7>RVt(G
zlZUEDT|98L*RgDK2bo@K*?RY90wDl1>;i>n*ltO@7<5B*6BYQ;L|zdxjmyYjCDbP!
z&;I%IRKo5%Mb=$^O3<{-Yn_aW-^Zda6K9lgSybDp7dYP#=rH@#emS5T1x)E^`bhAQQA*si!;o_*XGgHAVTC_UIfC!U^$^=3Mr`fiUB
zswlg#JzFOg`x`rhss?dVuGVj6Qv2ry&km^oS$`boWoeJiw`hfH*VKVF5GJ;spSDuY
zWy=R9xoD#SpA_4#}(toU3HR(-QkE%{_DKi0xn;YUD)FslJ$I5;eXZ(Y+JS)e?^9pcy
zC@c91LEr@2;E(MBafMnyK)pd;aWn`yCEO?PxXrY%{Vf3mG?KQs$mU5XiQeF%X_q;RucKsC+^ZDvkl7!qE(fcPJ_9_x*C66DYW`v*hir;YWo_}Sc~Tcf(Cwbx`r@xuJfN(o0OH#K~|BXudpy;nWs_K}_N3pUTs
z776rsANeFv1Ybu%EML4q#*P_|bDvHhDq((3p5V2ip#jv^(o9pUo1jA)j
z*2%a}UOhS7O7)m-;=6fM+j4i%(+Ekp&3V_4q9cZ;BTqFJ5wv5ciacK)$gMIqF^ONv
z38f_>BCq)mFab^S~EcClkl^d|&8
znnay#CY`=VIuFKbZJEFAG3`}YMyXj=1^~+FG4_Wt^70&l`dMu((6HxUzDS-PzPtD<
zuc4{wGbr+SIWtCq1uWkeKBZf?*9<5nmX+PAat%?0}gog;;V&ozbOn=)=fYe0=5s`=P4q#1XS}Ta>^N@{c1mg&Z9~AL*Wd
zb(4AR(W4NZ@kS$U)S)#Iz=B_W9)9J@jjHk*m~?j5
zpU4Mj!OxSyExwi$j(2s2`b%p6F9nu=1+Sd8DvDpft|9BO
zvb=l?8Q67u11%UYBYAsge7t)2S+Dsia_B(5oKE>DJwxe?+iiTC`-7-wE0(qcO0Mx_
z-~W@>SWehu168HK^3lo9FfT8!SQIXW+r0J>&^D3?BLb$pG09();6!a3lh&kOy1Gf-
zeSQ98&&JigD4;D$P0xIr=vcn7Btl^m=bbP2dvC`a-q$!=8{Yaht|O}1fSZ=^`NK-M
z4Ez#;jkcc84%bAlH3@k=MkyUNty1^q!Y%ZiX{NNW9)MUNVPA5EhlT4WlU4mWx?bh-};pZS4-i_Fh*ccN3!>N!24@X$Ba<$uD
zf5S>^gZ&_72bMY3qj(oeei<3F$GKjt>zbhG^8#~d&n>c@^q!p)>@)ye+R)S2ycQDV
zJ>RTyR`QVFdx58+;6c0_Q%s0O-R8AC7>R#*XFPl=<)cSk%;+p)UU734#o{_+jdA*F
z+YzeqmK@+z+7%cJL(&mYr<5y)cLJ_sjhCOW$|=+ib(QuuP-CMCz+$|^HSLpnp0LO-
zq(`mUxg+NT+VIFVPmAplWjw1AB&F`d_w7yRHr%%$uW_jN>5+F85)T&JL1)R;vM^N&
z7-8w&DRbLxqpveLzvP3jv_)9gUjvd-WC}MEsb;Up2#VEtR`n`9N5cEmB5sHmo|id@
z#XES40f3+K4x~(YqTBL9=^-4uzMzHG&4tlvq;N*X!lE>K)`sB{Pf2uXige#c3TUQi
zU9!EWe+0RAvch)cx1;-4t@}+->MHoL;OzV=R{;Q!6H(s@m4V>zMhwTM30=B)esAuc
z0^>VT$8&WWC@`K*N{vSS;aQokI$e9Ojo%8GKjZ%s<^i@a}g)bu|qp;Na4bP?Q{N@
zj*w7)MtiZZoP@)z&hA(Cn?1drD3##ODz5Y3jPwud`yA8l-_<&1UL+7F)COL
z6&vv6!IIde9t8bfPC(^w35Gv)yqMennViUx&pOS*ziZvhO_T{0k5_nu?Er!CXt`PQ
zft4oJ#rdkvE3XNyAsJznQ$m3lO?i2fk6(iZ&r=1kROdKv>GA2x^8C)_i)2W_ND_vP
zg6=?aK!6^{rNjxm^xd{eBvgQy{qR-BG3lE)_A60P4WjAvCA&c?F+i*(f|QCm4$Ou6
zhbO7XCQ5Rs6)7C>hSjz8nXOv=u0(7zi8m?dJZWSoh^1*)Y_LvfZ+{e*$YG~-*2NvF
z3$$@~w&clHay)EFM!>x5GIr7@9x-bgB
zt1C+ia_O*)nb=LEd(P3Wx9cLxqEM#|A3p|Z6A
zi_zghJyJM3QO2CQ{w@Gg!1dYM+5&DwpJS?T2@6v*C#pBk)U};PYX3)GJqZcOCH#1}O479jgpc|Ah7_UYNj=!~ixFb#`8
zW^jJWU2XoFx^w75DP!mCt77}?@Hm?YwBZ5
zg*2{}n9$JQ7(C15~So`1YV0*^vqMsxZrY8|cyB1@hD=r*H^l^RY@oJzQPyP2K
zjUpbe0n`|)$t14ySZDjeFUyXNTL}<8wHp6|rzUqkYeL$phk=N>`z!L(P*;$G0hyD?
zq;UV35!2H7Cl858KIrC8eV)C+3Ir5RSkJluTUt+|W~aTJ3tpO_>nN>F+S{Jv{fRza
zL+Uf&o#^k?kOBZ;^Zzg3DuTGj3AE;z;{~dZOC!P$k2B=!8Q$5vHMlAc^Ugxm(B)
zaB)bXE4E62_!X60T#LvZGI`z+n+nJrkOM6(A&NP{PswO`lpm3}U@k@Of*IJv^cQh{
z(AQZVmr{L;LsFfcOdGgo
z$<5%s7FNRpr=AvLi{A7^snQiBqTfiIn5=}y(sE6@O>g&Wee6F=1IZWy6gB%CGS(R`B#Fm$Wqy(8P($iiXqapg(Tk;81&zm@fPZCkt>qwG}S3s
zGJ|rx7_}I3%AK3DZam$cPo8YKv{`hn;E-S-u#Iw?o?KrUfNQI%^<7m|o-LkpcG=On
z$xT{)_h62-j0b)y5*ZcB=VSA6*q$;ay~CxVO;5%O(#G7z6P88WMktL_Hh9kuY4ZEl
z$H2g`2M+q-7V#*EV?{$Z0ora|Adi|K0@jIyjxgAeOah#oV~%5JR-(D
zR(kZMb*tC%lwA6XBf$7dXC^74?xQ|mV*ujkLymK+rjM@aq7>Mnj)KL6^78rF&I2o?
z2kG|UH-m|lsFQ!BB8%G@Hhq0$SM_sLkEImv)AG%BjW5fCJz6jT+qoXpP{@i
ze^d@?HX=6UNK5J1gshnFpGKe3x4pp(m$@XuR6S24ugh8qm*5yWR*4BJhrPU
z)a!C{&D<@z!|cU?kKgZd@}ZY`6&0tk(k>U5A$ki0qZ-3zms^nAdigC=pBphn4$32K
zqw+yS<6Ay)oUCz$@*TE)J)P@{L_tq2uY9>B$d7a+izNTv_8~oSjz|K(_?u3B5wod#
zb($@u^P)Dpc#VrO$FQTJ0i}#zxJqU@$jC=zRV`CY!Z6Agw>m@|Jvz$D2V)$FS4&+Eo`9dnJv}F35s!0SDn6MYA1P4YP1SV!>bLYaqIL<77qrCbCtblR~cF3
zwutKDv99Rc
zu9kjlf<0krY0*
zDDBC##6>DT&i!$QWGzkP$xE