From 2600f23ebb58499ffd6f843173987f220d9da9ac Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Fri, 30 Jun 2023 22:55:14 +1000 Subject: [PATCH] Coroner Update: Pickle-Eating Morbid Weirdo Obsessed with Death and Perfectionism (#76318) This PR introduces a whole bunch of Coroner and Morbid related content. Firstly, Morbid is now a mind trait, and specifically, coroners start with it. Coroners also have a liver trait that allows them to heal toxins (very slowly) from eating pickles and drinking pickle juice. They also can...drink formaldehyde. I guess. Dissections is thirsty work. Coroners gain a whole set of special tools specifically for use in any surgeries marked as interests of the Morbid. This is determined by the ``surgery_flag`` called ``SURGERY_MORBID_CURIOSITY``. Currently, these surgeries are included; dissections, autospies, revival surgery, plastic surgery, organ/feature manipulations, amputations To fit the theme, TRAIT_MORBID also applies the reduction to eye snatchers. While using their special tools, and the surgery is a morbid curiosity, the coroner/anyone who is morbid gains a 30% speed boost! This stacks with the dissection speed boost. Otherwise, the tools are just regular tools with a special name (though the scalpel is better at killing undead, because, you know, you're watching over the dead). The coroner's special medkit, which is the only one you can get in a round, can fit their autopsy scanners and tools. Anything that comes standard with their kit can go back into it. Anyone who is morbid can safely retrieve the secrets of the elephant graveyard. The serrated shovel, notably, is a much better tool and notably better at killing organics, but not inorganics (like the dead). (Gives roboticists secure morgue access during skeleton crew pop totals) --- code/__DEFINES/obj_flags.dm | 1 + code/__DEFINES/surgery.dm | 2 + code/__DEFINES/traits.dm | 1 + code/_globalvars/bitfields.dm | 1 + code/_globalvars/traits.dm | 1 + code/datums/ai/hauntium/haunted_controller.dm | 2 +- code/datums/id_trim/jobs.dm | 1 + code/datums/mood_events/morbid_events.dm | 5 +++ code/game/objects/items.dm | 3 ++ code/game/objects/items/defib.dm | 2 +- code/game/objects/items/food/misc.dm | 11 +++++ code/game/objects/items/knives.dm | 1 + code/game/objects/items/storage/medkit.dm | 25 ++++++++++- .../traitor/objectives/eyesnatching.dm | 10 +++-- .../chaplain/chaplain_vorpal_scythe.dm | 5 ++- code/modules/jobs/job_types/coroner.dm | 7 ++- .../lavalandruin_code/elephantgraveyard.dm | 9 ++-- code/modules/mining/equipment/mining_tools.dm | 12 +++-- .../reagents/drinks/drink_reagents.dm | 15 +++++++ .../chemistry/reagents/toxin_reagents.dm | 7 ++- code/modules/surgery/amputation.dm | 3 +- code/modules/surgery/autopsy.dm | 4 +- code/modules/surgery/dissection.dm | 4 +- code/modules/surgery/healing.dm | 2 +- code/modules/surgery/organ_manipulation.dm | 5 ++- .../surgery/organs/internal/liver/_liver.dm | 2 + code/modules/surgery/plastic_surgery.dm | 4 ++ code/modules/surgery/revival.dm | 3 +- code/modules/surgery/surgery.dm | 2 +- code/modules/surgery/surgery_step.dm | 22 +++++++-- code/modules/surgery/tools.dm | 42 +++++++++++++++++- code/modules/vending/wardrobes.dm | 6 +++ icons/obj/medical/surgery_tools.dmi | Bin 8159 -> 10432 bytes 33 files changed, 189 insertions(+), 31 deletions(-) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index c5ed6c7e964..27384cd5f9d 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -31,6 +31,7 @@ #define IMMUTABLE_SLOW (1<<10) // When players should not be able to change the slowdown of the item (Speed potions, etc) #define IN_STORAGE (1<<11) //is this item in the storage item, such as backpack? used for tooltips #define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) +#define CRUEL_IMPLEMENT (1<<13) //This object, when used for surgery, is a lot worse at the job if the target is alive rather than dead #define HAND_ITEM (1<<14) // If an item is just your hand (circled hand, slapper) and shouldn't block things like riding #define EXAMINE_SKIP (1<<15) // Makes the Examine proc not read out this item. #define XENOMORPH_HOLDABLE (1<<16) // A Xenomorph can hold this item. diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 55dbe8c4499..5349ad6ea50 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -74,3 +74,5 @@ #define SURGERY_REQUIRE_LIMB (1<<3) ///Will allow the surgery to work only if there's a real (eg. not pseudopart) limb. #define SURGERY_REQUIRES_REAL_LIMB (1<<4) +///Will grant a bonus during surgery steps to users with TRAIT_MORBID while they're using tools with CRUEL_IMPLEMENT +#define SURGERY_MORBID_CURIOSITY (1<<5) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index bebb599bd9a..eca2380e121 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -547,6 +547,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PRETENDER_ROYAL_METABOLISM "pretender_royal_metabolism" #define TRAIT_BALLMER_SCIENTIST "ballmer_scientist" #define TRAIT_MAINTENANCE_METABOLISM "maintenance_metabolism" +#define TRAIT_CORONER_METABOLISM "coroner_metabolism" //LUNG TRAITS /// Lungs always breathe normally when in vacuum/space. diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 5668ca879ca..99f90c88e86 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -189,6 +189,7 @@ DEFINE_BITFIELD(item_flags, list( "NO_PIXEL_RANDOM_DROP" = NO_PIXEL_RANDOM_DROP, "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, "SURGICAL_TOOL" = SURGICAL_TOOL, + "CRUEL_IMPLEMENT" = CRUEL_IMPLEMENT, "XENOMORPH_HOLDABLE" = XENOMORPH_HOLDABLE, "NO_BLOOD_ON_ITEM" = NO_BLOOD_ON_ITEM, )) diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 0d35407ca55..45c59ee362a 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -217,6 +217,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, "TRAIT_MAINTENANCE_METABOLISM" = TRAIT_MAINTENANCE_METABOLISM, + "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, ), /obj/item = list( "TRAIT_NODROP" = TRAIT_NODROP, diff --git a/code/datums/ai/hauntium/haunted_controller.dm b/code/datums/ai/hauntium/haunted_controller.dm index 9eb18ed7f6c..0f5f08dfc94 100644 --- a/code/datums/ai/hauntium/haunted_controller.dm +++ b/code/datums/ai/hauntium/haunted_controller.dm @@ -28,7 +28,7 @@ var/haunt_equipper = TRUE if(isliving(equipper)) var/mob/living/possibly_cool = equipper - if(possibly_cool.mob_biotypes & MOB_UNDEAD || HAS_TRAIT(possibly_cool, TRAIT_MORBID)) + if(possibly_cool.mob_biotypes & MOB_UNDEAD || possibly_cool.mind && HAS_TRAIT(possibly_cool.mind, TRAIT_MORBID)) haunt_equipper = FALSE if(haunt_equipper) //You have now become one of the victims of the HAAAAUNTTIIIINNGGG OOOOOO~~~ diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index e4538b450aa..2a62d19452d 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -904,6 +904,7 @@ extra_access = list( ACCESS_GENETICS, ACCESS_XENOBIOLOGY, + ACCESS_MORGUE_SECURE, ) template_access = list( ACCESS_CAPTAIN, diff --git a/code/datums/mood_events/morbid_events.dm b/code/datums/mood_events/morbid_events.dm index 731b62569cc..ce3ba60738f 100644 --- a/code/datums/mood_events/morbid_events.dm +++ b/code/datums/mood_events/morbid_events.dm @@ -17,6 +17,11 @@ Intended to push a creepy, mad scientist/doctor vibe, or someone who is downrigh mood_change = 2 timeout = 2 MINUTES +/datum/mood_event/morbid_abominable_surgery_success + description = "Picasso himself would struggle to match with a brush what I can do with a knife." + mood_change = 2 + timeout = 2 MINUTES + /datum/mood_event/morbid_revival_success description = "IT LIVES! AH HA HA HA HA!!" mood_change = 6 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d2dd9e29ef5..a6436ba16a9 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -390,6 +390,9 @@ . += "[gender == PLURAL ? "They are" : "It is"] a [weight_class_to_text(w_class)] item." + if(item_flags & CRUEL_IMPLEMENT) + . += "[src] seems quite practical for particularly morbid procedures and experiments." + if(resistance_flags & INDESTRUCTIBLE) . += "[src] seems extremely robust! It'll probably withstand anything that could happen to it!" else diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index bc3f637935c..1d370c4fbbb 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -648,7 +648,7 @@ H.emote("gasp") H.set_jitter_if_lower(200 SECONDS) SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK) - if(HAS_TRAIT(user, TRAIT_MORBID)) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) user.add_mood_event("morbid_saved_life", /datum/mood_event/morbid_saved_life) else user.add_mood_event("saved_life", /datum/mood_event/saved_life) diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 2727547bf98..e14ba3129fe 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -452,12 +452,23 @@ food_reagents = list( /datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/pickle = 1, /datum/reagent/medicine/antihol = 2, ) tastes = list("pickle" = 1, "spices" = 1, "salt water" = 2) + juice_results = list(/datum/reagent/consumable/pickle = 5) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL +/obj/item/food/pickle/make_edible() + . = ..() + AddComponent(/datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_liked))) + +/obj/item/food/pickle/proc/check_liked(fraction, mob/living/carbon/human/consumer) + var/obj/item/organ/internal/liver/liver = consumer.get_organ_slot(ORGAN_SLOT_LIVER) + if(!HAS_TRAIT(consumer, TRAIT_AGEUSIA) && liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) + return FOOD_LIKED + /obj/item/food/springroll name = "spring roll" desc = "A plate of translucent rice wrappers filled with fresh vegetables, served with sweet chili sauce. You either love them or hate them." diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index c8eccd25407..d24c542b57c 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -61,6 +61,7 @@ righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' inhand_x_dimension = 64 inhand_y_dimension = 64 + item_flags = CRUEL_IMPLEMENT //maybe they want to use it in surgery w_class = WEIGHT_CLASS_NORMAL /obj/item/knife/bloodletter diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 70fd75c04b1..03cdb25adca 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -329,12 +329,27 @@ inhand_icon_state = "coronerkit" var/max_slots = 6 var/max_total_storage = 6 + var/max_object_size = WEIGHT_CLASS_SMALL //so it cannot fit an autopsy scanner /obj/item/storage/medkit/coroner/Initialize(mapload) . = ..() - atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL //lowering this so it can't hold the autopsy scanner + atom_storage.max_specific_storage = max_object_size atom_storage.max_slots = max_slots atom_storage.max_total_storage = max_total_storage + atom_storage.set_holdable(list( + /obj/item/reagent_containers, + /obj/item/bodybag, + /obj/item/folder/white, + /obj/item/toy/crayon, + /obj/item/pen, + /obj/item/paper, + /obj/item/surgical_drapes, + /obj/item/scalpel, + /obj/item/retractor, + /obj/item/hemostat, + /obj/item/cautery, + /obj/item/autopsy_scanner, + )) /obj/item/storage/medkit/coroner/PopulateContents() if(empty) @@ -354,8 +369,9 @@ icon = 'icons/obj/storage/medkit.dmi' icon_state = "coronerkit" inhand_icon_state = "coronerkit" - max_slots = 12 + max_slots = 14 max_total_storage = 24 + max_object_size = WEIGHT_CLASS_NORMAL /obj/item/storage/medkit/coroner/large/PopulateContents() if(empty) @@ -368,6 +384,11 @@ /obj/item/bodybag = 2, /obj/item/reagent_containers/syringe = 1, /obj/item/folder/white = 1,//for storing autopsy reports from the scanner + /obj/item/surgical_drapes = 1, + /obj/item/scalpel/cruel = 1, + /obj/item/retractor/cruel = 1, + /obj/item/hemostat/cruel = 1, + /obj/item/cautery/cruel = 1, ) generate_items_inside(items_inside,src) diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index e752acd237e..106a78bba2b 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -164,17 +164,19 @@ if(!head || !eyeballies || target.is_eyes_covered()) return ..() - + var/eye_snatch_enthusiasm = 5 SECONDS + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) + eye_snatch_enthusiasm *= 0.7 user.do_attack_animation(target, used_item = src) target.visible_message( span_warning("[user] presses [src] against [target]'s skull!"), span_userdanger("[user] presses [src] against your skull!")) - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return to_chat(target, span_userdanger("You feel something forcing its way into your skull!")) balloon_alert(user, "applying pressure...") - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return var/datum/wound/blunt/severe/severe_wound_type = /datum/wound/blunt/severe @@ -190,7 +192,7 @@ playsound(target, "sound/effects/wounds/crackandbleed.ogg", 100) log_combat(user, target, "cracked the skull of (eye snatching)", src) - if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) + if(!do_after(user, eye_snatch_enthusiasm, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return if(!target.is_blind()) diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm index c9e98b33b52..6776dc56b44 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -12,7 +12,8 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and /obj/item/organ/internal/cyberimp/arm/shard/scythe/Insert(mob/living/carbon/receiver, special, drop_if_replaced) . = ..() - ADD_TRAIT(receiver, TRAIT_MORBID, ORGAN_TRAIT) + if(receiver.mind) + receiver.mind.add_traits(TRAIT_MORBID, ORGAN_TRAIT) /obj/item/organ/internal/cyberimp/arm/shard/scythe/Retract() var/obj/item/vorpalscythe/scythe = active_item @@ -163,7 +164,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and scythe_empowerment(potential_empowerment) - if(HAS_TRAIT(user, TRAIT_MORBID)) //You feel good about yourself, pal? + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) //You feel good about yourself, pal? user.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/jobs/job_types/coroner.dm b/code/modules/jobs/job_types/coroner.dm index 0894b5907ae..7b0371068cf 100644 --- a/code/modules/jobs/job_types/coroner.dm +++ b/code/modules/jobs/job_types/coroner.dm @@ -13,6 +13,9 @@ outfit = /datum/outfit/job/coroner plasmaman_outfit = /datum/outfit/plasmaman/coroner + mind_traits = list(TRAIT_MORBID) + liver_traits = list(TRAIT_CORONER_METABOLISM) + paycheck = PAYCHECK_CREW paycheck_department = ACCOUNT_MED @@ -28,11 +31,13 @@ /obj/item/reagent_containers/cup/bottle/formaldehyde = 30, /obj/item/storage/box/bodybags = 15, /obj/item/healthanalyzer = 10, + /obj/item/shovel = 5, /obj/effect/spawner/random/medical/organs = 5, /obj/effect/spawner/random/medical/memeorgans = 1, + /obj/item/scythe = 1, ) - family_heirlooms = list(/obj/item/clothing/head/helmet/skull, /obj/item/table_clock) + family_heirlooms = list(/obj/item/clothing/head/helmet/skull, /obj/item/table_clock, /obj/item/shovel, /obj/item/storage/fancy/pickles_jar) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index 4ec58a92c7f..b613ca08bca 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -237,13 +237,16 @@ dug_closed = TRUE close(user) else if(open(user, force = TRUE)) - if (HAS_TRAIT(user, TRAIT_MORBID)) + if (user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) user.add_mood_event("morbid_graverobbing", /datum/mood_event/morbid_graverobbing) else user.add_mood_event("graverobbing", /datum/mood_event/graverobbing) if(lead_tomb && first_open) - user.gain_trauma(/datum/brain_trauma/magic/stalker) - to_chat(user, span_boldwarning("Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) + to_chat(user, span_notice("Did someone say something? I'm sure it was nothing.")) + else + user.gain_trauma(/datum/brain_trauma/magic/stalker) + to_chat(user, span_boldwarning("Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")) first_open = FALSE return TRUE diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 4ec3f754e58..748c14c40a5 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -164,18 +164,24 @@ /obj/item/shovel/serrated name = "serrated bone shovel" - desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs." + desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs. \ + It seems less capable of harming inorganic creatures. Who knows why." icon_state = "shovel_bone" worn_icon_state = "shovel_serr" lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' - force = 15 + force = 10 throwforce = 12 w_class = WEIGHT_CLASS_NORMAL - toolspeed = 0.7 + toolspeed = 0.3 attack_verb_continuous = list("slashes", "impales", "stabs", "slices") attack_verb_simple = list("slash", "impale", "stab", "slice") sharpness = SHARP_EDGED + item_flags = CRUEL_IMPLEMENT + +/obj/item/shovel/serrated/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_ORGANIC, damage_multiplier = 1) //You may be horridly cursed now, but at least you kill the living a whole lot more easily! /obj/item/trench_tool name = "entrenching tool" diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 5b7e5171baa..c5a4fbea5c4 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -170,6 +170,21 @@ taste_description = "irish sadness" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/consumable/pickle + name = "Pickle Juice" + description = "More accurately, this is the brine the pickle was floating in" + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#302000" // rgb: 48, 32, 0 + taste_description = "vinegar brine" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/pickle/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if((liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM))) + affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) + . = TRUE + ..() + /datum/reagent/consumable/grapejuice name = "Grape Juice" description = "The juice of a bunch of grapes. Guaranteed non-alcoholic." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index b8c64a40ed4..56734add996 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -638,7 +638,12 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) - if(SPT_PROB(2.5, seconds_per_tick)) + var/obj/item/organ/internal/liver/liver = affected_mob.get_organ_slot(ORGAN_SLOT_LIVER) + if(liver && HAS_TRAIT(liver, TRAIT_CORONER_METABOLISM)) //mmmm, the forbidden pickle juice + affected_mob.adjustToxLoss(-1, FALSE, required_biotype = affected_biotype) //it counteracts its own toxin damage. + . = TRUE + return ..() + else if(SPT_PROB(2.5, seconds_per_tick)) holder.add_reagent(/datum/reagent/toxin/histamine, pick(5,15)) holder.remove_reagent(/datum/reagent/toxin/formaldehyde, 1.2) else diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index c1e02ec8548..8affb1036d4 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -2,6 +2,7 @@ /datum/surgery/amputation name = "Amputation" requires_bodypart_type = NONE + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, @@ -58,7 +59,7 @@ ) display_pain(target, "You can no longer feel your severed [parse_zone(target_zone)]!") - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) diff --git a/code/modules/surgery/autopsy.dm b/code/modules/surgery/autopsy.dm index 6b3e7391292..e5190b91fa2 100644 --- a/code/modules/surgery/autopsy.dm +++ b/code/modules/surgery/autopsy.dm @@ -1,6 +1,6 @@ /datum/surgery/autopsy name = "Autopsy" - surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB + surgery_flags = SURGERY_IGNORE_CLOTHES | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST) steps = list( /datum/surgery_step/incise, @@ -36,7 +36,7 @@ /datum/surgery_step/autopsy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/autopsy_scanner/tool, datum/surgery/surgery, default_display_results = FALSE) ADD_TRAIT(target, TRAIT_DISSECTED, REF(src)) tool.scan_cadaver(user, target) - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_dissection_success", /datum/mood_event/morbid_dissection_success) return ..() diff --git a/code/modules/surgery/dissection.dm b/code/modules/surgery/dissection.dm index 96c0f35d8b3..b939a8d3914 100644 --- a/code/modules/surgery/dissection.dm +++ b/code/modules/surgery/dissection.dm @@ -4,7 +4,7 @@ /mob/living/carbon/human, /mob/living/carbon/alien, ) - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST) steps = list( /datum/surgery_step/incise, @@ -55,7 +55,7 @@ var/obj/machinery/computer/operating/operating_computer = surgery.locate_operating_computer(get_turf(target)) if (!isnull(operating_computer)) SEND_SIGNAL(operating_computer, COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE, target) - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user)) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_dissection_success", /datum/mood_event/morbid_dissection_success) diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 8f58553cc18..105afbf8d06 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -102,7 +102,7 @@ user_msg += get_progress(user, target, brute_healed, burn_healed) - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user) && !dead_patient) //Morbid folk don't care about tending the dead as much as tending the living + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user) && !dead_patient) //Morbid folk don't care about tending the dead as much as tending the living var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_tend_wounds", /datum/mood_event/morbid_tend_wounds) diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index d7fdb869fee..e29f2aaabe8 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -1,6 +1,6 @@ /datum/surgery/organ_manipulation name = "Organ manipulation" - surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) steps = list( /datum/surgery_step/incise, @@ -276,6 +276,9 @@ span_notice("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!"), span_notice("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!"), ) + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) return ..() ///You can never use this MUHAHAHAHAHAHAH (because its the byond version of abstract) diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index fb9f62f7b28..52473b0a7d4 100644 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -98,6 +98,8 @@ . += span_info("Strange glowing residues, sprinklings of congealed solid plasma, and what seem to be tumors indicate this is the radiated liver of a scientist.") if(HAS_TRAIT(src, TRAIT_MAINTENANCE_METABOLISM)) . += span_info("A half-digested rat's tail (somehow), disgusting sludge, and the faint smell of Grey Bull imply this is what remains of an assistant's liver.") + if(HAS_TRAIT(src, TRAIT_CORONER_METABOLISM)) + . += span_info("An aroma of pickles and sea water, along with being remarkably well-preserved, imply this is what remains of a coroner's liver.") // royal trumps pretender royal if(HAS_TRAIT(src, TRAIT_ROYAL_METABOLISM)) diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 821e1054376..1bf552ac37b 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -1,5 +1,6 @@ /datum/surgery/plastic_surgery name = "Plastic surgery" + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY possible_locs = list(BODY_ZONE_HEAD) steps = list( /datum/surgery_step/incise, @@ -65,6 +66,9 @@ if(ishuman(target)) var/mob/living/carbon/human/human_target = target human_target.sec_hud_set_ID() + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) + var/mob/living/carbon/human/morbid_weirdo = user + morbid_weirdo.add_mood_event("morbid_abominable_surgery_success", /datum/mood_event/morbid_abominable_surgery_success) return ..() /datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm index 736e3982b03..6072b28b9d5 100644 --- a/code/modules/surgery/revival.dm +++ b/code/modules/surgery/revival.dm @@ -4,6 +4,7 @@ The body must still be able to sustain life." requires_bodypart_type = NONE possible_locs = list(BODY_ZONE_HEAD) + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY steps = list( /datum/surgery_step/incise, /datum/surgery_step/retract_skin, @@ -89,7 +90,7 @@ target.visible_message(span_notice("...[target] wakes up, alive and aware!")) target.emote("gasp") target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) //MAD SCIENCE - if(HAS_TRAIT(user, TRAIT_MORBID) && ishuman(user)) //Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID) && ishuman(user)) //Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god var/mob/living/carbon/human/morbid_weirdo = user morbid_weirdo.add_mood_event("morbid_revival_success", /datum/mood_event/morbid_revival_success) return TRUE diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 3a5ed229c5f..68086d3ab5f 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -5,7 +5,7 @@ var/desc ///From __DEFINES/surgery.dm - ///Selection: SURGERY_IGNORE_CLOTHES | SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + ///Selection: SURGERY_IGNORE_CLOTHES | SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY var/surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB ///The surgery step we're currently on, increases each time we do a step. var/status = 1 diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 17cd10f9ca4..fcee24eec2b 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -65,7 +65,9 @@ #define SURGERY_SLOWDOWN_CAP_MULTIPLIER 2 //increase to make surgery slower but fail less, and decrease to make surgery faster but fail more ///Modifier given to surgery speed for dissected bodies. -#define SURGERY_DISSECTION_MODIFIER 1.2 +#define SURGERY_SPEED_DISSECTION_MODIFIER 0.8 +///Modifier given to users with TRAIT_MORBID on certain surgeries +#define SURGERY_SPEED_MORBID_CURIOSITY 0.7 /datum/surgery_step/proc/initiate(mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) // Only followers of Asclepius have the ability to use Healing Touch and perform miracle feats of surgery. @@ -86,7 +88,10 @@ speed_mod = tool.toolspeed if(HAS_TRAIT(target, TRAIT_DISSECTED)) - speed_mod /= SURGERY_DISSECTION_MODIFIER + speed_mod *= SURGERY_SPEED_DISSECTION_MODIFIER + + if(check_morbid_curiosity(user, tool, surgery)) + speed_mod *= SURGERY_SPEED_MORBID_CURIOSITY var/implement_speed_mod = 1 if(implement_type) //this means it isn't a require hand or any item step. @@ -220,6 +225,16 @@ chems += chemname return english_list(chems, and_text = require_all_chems ? " and " : " or ") +// Check if we are entitled to morbid bonuses +/datum/surgery_step/proc/check_morbid_curiosity(mob/user, obj/item/tool, datum/surgery/surgery) + if(!(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID))) + return FALSE + if(!tool || tool && !(tool.item_flags & CRUEL_IMPLEMENT)) + return FALSE + if(surgery.surgery_flags != SURGERY_MORBID_CURIOSITY) + return FALSE + return TRUE + //Replaces visible_message during operations so only people looking over the surgeon can see them. /datum/surgery_step/proc/display_results(mob/user, mob/living/target, self_message, detailed_message, vague_message, target_detailed = FALSE) user.visible_message(detailed_message, self_message, vision_distance = 1, ignored_mobs = target_detailed ? null : target) @@ -247,5 +262,6 @@ if(prob(30) && !mechanical_surgery) target.emote("scream") -#undef SURGERY_DISSECTION_MODIFIER +#undef SURGERY_SPEED_DISSECTION_MODIFIER +#undef SURGERY_SPEED_MORBID_CURIOSITY #undef SURGERY_SLOWDOWN_CAP_MULTIPLIER diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index f111ac5625e..81df2da70ac 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -477,7 +477,7 @@ limb_snip_candidate.dismember() user.visible_message(span_danger("[src] violently slams shut, amputating [patient]'s [candidate_name]."), span_notice("You amputate [patient]'s [candidate_name] with [src].")) - if(HAS_TRAIT(user, TRAIT_MORBID)) //Freak + if(user.mind && HAS_TRAIT(user.mind, TRAIT_MORBID)) //Freak user.add_mood_event("morbid_dismemberment", /datum/mood_event/morbid_dismemberment) /obj/item/shears/suicide_act(mob/living/carbon/user) @@ -563,3 +563,43 @@ var/chem_name = params["reagent"] var/chem_id = get_chem_id(chem_name) whitelist -= chem_id + +/* + * Cruel Surgery Tools + * + * This variety of tool has the CRUEL_IMPLEMENT flag. + * + * Bonuses if the surgery is being done by a morbid user and it is of their interest. + * + * Morbid users are interested in; dissections, autospies, revival surgery, plastic surgery, organ/feature manipulations, amputations + * + * Otherwise, normal tool. + */ + +/obj/item/retractor/cruel + name = "twisted retractor" + desc = "Helps reveal secrets that would rather stay buried." + icon_state = "cruelretractor" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/hemostat/cruel + name = "cruel hemostat" + desc = "Clamping bleeders, but not so good at fixing breathers." + icon_state = "cruelhemostat" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/cautery/cruel + name = "savage cautery" + desc = "Chalk this one up as another successful vivisection." + icon_state = "cruelcautery" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/scalpel/cruel + name = "hungry scalpel" + desc = "I remember every time I hold you. My born companion..." + icon_state = "cruelscalpel" + item_flags = SURGICAL_TOOL | CRUEL_IMPLEMENT + +/obj/item/scalpel/cruel/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_UNDEAD, damage_multiplier = 1) //Just in case one of the tennants get uppity diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 3b39229a4e7..34fb74fb24f 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -304,10 +304,16 @@ ) contraband = list( /obj/item/knife/ritual = 1, + /obj/item/scythe = 1, + /obj/item/storage/fancy/pickles_jar = 1, /obj/item/table_clock = 1, ) premium = list( /obj/item/autopsy_scanner = 1, + /obj/item/scalpel/cruel = 1, + /obj/item/retractor/cruel = 1, + /obj/item/hemostat/cruel = 1, + /obj/item/cautery/cruel = 1, ) refill_canister = /obj/item/vending_refill/wardrobe/coroner_wardrobe payment_department = ACCOUNT_MED diff --git a/icons/obj/medical/surgery_tools.dmi b/icons/obj/medical/surgery_tools.dmi index 594f0a8d43fcb3e8b43e434b24370fe34fe08edd..baa24ca1ad7216e0aeeb61ad4f89b70c8cd20c6d 100644 GIT binary patch literal 10432 zcma)iWl$c$((dx&?h;&s2X`k}aEAn!puycG!7T)WyCk>8bgQ#-po-P1D9(_zYr(x^y;NB{t!evpw+1%KPY|11PJaQsAPq6Yv__@3(8&Jv%U zOdKukoh|Kb0l+=&XIzI>7b{Be=$TsRbz?O1B3EK8yQ75x1zl|l!4z+wquh#bNJ6Dp zNJ}aV*~aXPoX+i>pR2S5dV0fm2{JQ_wWqsob*&TUK)4kvHHCk@AM6y=)dS(U$0=F< z5~=aAU=q4>O@BC*ue(pJPKq}jb`)o@;F3v5+a=D)G3yAOWqO~lOt#&tYr`NN$;hcJ z^2FK~w$m*1KFN{?@0K7ga)t6n(LOtAt1E|>b<6GGp&GpekT0GbP$@{orBZ(xVXVZHkg=IeG=ySqYrj&CU!KgjW8Z2%;w>_I@gzLTw@TGFItq`jWS1Y)fbJjC znI3`-UH2bP5@ReyLYIzm>ZX(;i$|aY{&1g_)-f53NhY$AkaIHn_35>5fT&zygqD zkFd}QN7SY=1Hhu#HTh;HPcnkVU>h$vic#?+EbzU8G0yqQPjF#9&XB}oOces$ih05% ztK`DI{%<4r0jwkFfa1t8;NO_y=tLYYdD_`d@RbOv6@Cm_?CfLIAg)lSavbq{MPJT2K=1{hCsB z46u`cdqbWP07}>wNyrTN*WFBEUz?l6fr7!n!M$g~g8+G|e5z`3)2-HFe}0yDJHY{O zRgP6CPtoV4*|8H{A094wp~keIzQv$YQsqWcLLO#$)>aBlDo9Mx)%Zn%Y7gI)84o23 zA;!k4eAm!4?7b#{%1UEY26YtaC_L10)?FNSTSo>3Ob9C(TW3(UTC$hm@2XHJTex%b zUEEPL6JOzOZ+Lt`Mv<~`N63!OW<1PRoaTKw)eKuZ5;7-?hD+z~nLj&_on!D51C7OQ zeoZZt?+6N?doM*I-jy2`GV6UgC2<$UqxpTc?j@Y4jmUop`U3>8hdxz^TYorY`(O`# ztHJq1^l~S!L@~E8iB3`RNl#-o!|U>e~KkbzPUZ zb)~*OJo)BeHYlr6HhgY4Y{*d|tct7JRS)G2HIDebHF967PbIZEG;Pi?CL{~AWLP1r zHmf;A_!B>&h|H*H=FF-{S^W32(f7*UcsGh9U$bsYQV^jb;lG!ll3M$vi>9L^{doD| zO;s}w;&U3o^wEXw6`%jxo!JBeSJ+{)Pr{4ex^!sdf5`QS#CZLV?l_yFaCaY;)>Gia z4jy|mAKzjQ0Mi<(xwNUA9SZYaaGQT!BTJjm55u&XzO9Oj5Z^yyRQo8|KiiF_Lj!+m zmOIzGLXuC|^G7mu?FTq-n?AarVGxok81v9V0MHvKgoQ^8ci?eMo@%?VWe0^n3de`t zCC;NtFB~(=mpeAD)4T6zi80}AtcMO#rwRImRglD4>jn!z0q1SP;SR=r0MgFQwR3k~ zzf*;YS7f_gHW_A=GqgYH`lF3a9U$6&2bCo-g05W&6kK?DH9`Q>pSa78&t(`mncZpi z_-y9a6x2uZw9>No8)u2zCc~}ONkY_#^R_O^0RJcR+)&Z+`xi`luTj?3xZ1}E=uQHM z{nT3>Lc8Y5Kol$_0T*8lDzqiMhrU8y<#;q{f{0&qXPbs zLa9wpU6Yl*+#)i#>%(IPjAC7-X^#v{5we|^m=Kzd@ubC%77?LWO?>Df7II{jzC1wt z;vn)$Mwx7`aIkneE6H2J={?t)Ds}+fJhQ>pp5ZZpz4FPRUkGUAd$|x;?f70^#yUu- zPaIJ#w#bhgpn*sZioo|h!~gFTFWG>B1RfZzGCc!wx9J6?C(+n@Bkx3}(Z zG({)qX@Zs}@F*dY+}xzq0O08ftR73i-ZA%Mam8B3of00qv%tn3bYmWcD1S>mypSzC z)sfZrzJEy??Vsp%nA?V*fMpk514mXDm{1ks(h4G4XAfk|7`5> z7F-)qU2dWG5DQ}Kj8b+e!OgI?q52H>mj~AUw(dPZqW*=Kb-08MhEI55S*=ADm*>nI zz4pfbl{s%Vc)yfOPE+)>)4m}@jIdynqecQpwRgRss61Paf;=`U3%;OVw3}4HBfY~j z?9d6m2lWYj>&YV3s0o z834df6Pk^rAOfIJ?_HnxTZP=vRxgZhqhsZ^Z$ct=q zYB!DKgnK<{+6#>-gLjslrOfmBEfU_|#O74uU>tS#YNY&p@&;7n*`2v%U!TnOzoyA% zSl|)wp2F3MGR_1T;1eq?L4j=upSJ^J$m#WYXTu{^!Ox%BWxt5GrX%d%y&zl=5)edA zO__orlFDS%><{04hvuMU5Ey?qB$v9X{GPGL<$Nk_SB-QNhu%|JLT3@AH_<1)*L1p1we#{c7Hr-VJ$=6n+pFZKRAe^=<<8sO^PHBFGUV(+ zt7OobHXk>oKd(hqHT~}A00ka$^3^oY{u=vI*u03BOeM!0E-}=w8$a1@Kla!vs#`b2xfX>m`{x*?ZZ{wZ z2x|{AIT7q;)#^E^ar8|x`df!TnVR_&T$5lKAX8DEGhWJwxY(67{A@U-#>F0Cr z>}=wg3qa7jTFZg^>g0A2znxQ{5j4x6Lcc`mW#c@I-*BCC|0>q2HD)d<&MPRU4~eU8 zT3{3)&Ju@ArDyOX0XY9i56(mKv_ulLc(OD#dn^ZM_2wwET7K+nByv({>h^p|LiiPSfeZp;I1tL>lOxnUo{ zrA>X23IJf#xbtx!V7eK`D6U=^7^KrMjvPy7LgOcW*5eZyV?)aGjG-s_oP~D6XAL#s zY8POUMlOyb94aW|=c2^c>e~!rk4&nVjKOgns z0Qw#TNwgMxu@wa8_6IV-aHFqVyq{)mF=-nZcP((WoB%hnxwy0?-CTYBju9xZ^cW~6 z0tDsF3Vp(;lL~^lXN1>(aifa{iLzby&q{Tc$z#t}_fXdp-AN z6wY*~%!FK!H%Ue%26 z?>k>Htpeg(EKE2cWdtVT(TBX4pJEG;zcnF_oRcN88bRihdZCwS9)A@t_ z%v-~K92><8hK;)fK4f@%~;PEVR%+$&x1yRyyyg^78ZNfE)EW z>g^aFMitM-0RJwwhr1^7_Wg+|; zgpAKVi2qJE^f`x(fT#)X#9PDS&+6tyBh=pu8n-1|+pqEq1=sKZC~YLKEl=ILuUtzd zS_n4(FqFJXX1d(N2oZ#*=s4F*t!RN=gY-{)yX*HHN=|0joWkd*9ENi>fVB2>woI?9 z#(H+_X8a^}W-L5B97!f$b*a$>xi^N)Ts$ufn^t_Xm;wbcRDA5$?CBkbWeY)# zk%+(R*PD6V%vn_OCz3DYj>Wj(k3-YPmTP*i`J-)a-P`6di{38WPq2nEKGz2NR}}A# zpOQzXx9ZONI=*~`$tiyVC+AgBB?=aLi-l`rh==rxk6!4&x)pez(Zf1U_v@K1NVC?- z?M>k1gY0TQUk%&KkIP*=;udZlpZEfwHoVvD$Q=@)B_8)I__Ro@995OR?H8p1}V|c98ch(boh}*y4 z9~O-$u}Q$(FT8ANWHKu|_}2OWIs(`MFF)K6GZ5R!j@m*>svyG(!%4g@;S=0{-cB$} zi>!TWoGCKv`B$o>+E;-3prTLRbxAYu85z0ypM55|_&lhyy+uYo0dB$zYbReMTqu`k zip`7;k~@Vz+}wLVp`EwJib`}FR1X^CZwoXi{b9z=2tA)s z6q-R#()E=j=R}mpwzh{0^pak%VRu#CI`5p+iI2kvk64srY>CK=^7Mxv6Z|Iaq-W!t z_wTXS2tOi&jvslUmDw+*dKtmbg*SCq!}o`Q$98F~(f0OqeaK58Q1-(I3UwGlC&1O` zIw|@ySpFnmjVh$V#ai%Qo12PL6Gk_eU)Zaag~q`n1|{)XzvZwpLD;TUa==>nUDZ`3&1+ipvqH4&9NX(fBIMdnDrbpPtnYyAN-x z2;QyZP5GpUoX%bm5gM4}$^zVc?rB+e9C^9E~+bom#x-y8BF9k)B{lBU!`j?kU=;`TiNBy329iFC(wMuu`3LCRxs;xI~&o+sP!_Hn8bm*k=VB&1i zGq){QjtEMB=7mQmo!Zax@BF~UW;R3sh#DIkCvyKeGTH2j3M8F|cE*39IdSDjwnP*X zRWb!9(=%>3?(P5z3{e0Q_=dxb6*3mo+$>m{n12dctK{XjS&%qhYPi^(Db;zfTdI#O z;C}#R8K0WEvp;DMKo7A=O-cEKlqDS`Dk$`|r$;J(bU{36WLK6PM;{Qx>s{;k>aa6H z0)+GGO>&EgiG5ohD7NiIE9S?BHXw-T-LQ9b?93AT+PGvpl*C5BVHPO`Z)as?JmUtJ z34MBLbxZ31TdNEC|2?$J$WV8D(@fZnx-Ny)2c+6>aLL#m_Hl;N>JYF#RP?8hEnSx) z`o2vvq5fgG!LJ>euxgvFuNj`5Gj3sPB_$yBC>+QDg1w^0vbce{dx+70u zyVSS&pe=p5hX7?ujR9Q-1e#>iKmN1I=CiT4!5Ia&tGKe5ay=7cZptb_qg^Zf+H1uX z>3U|GHfoob!`_`eK&G(qxLvWjG*xn?4P>=wM3XSIfS1g4!~%{#LAvS~hno}m_#0mS zwpbv_02a~f;I4|K=vR{e!2!4DvZ&mTn^d_1BKX%n;P(J$yomkl!_(i4zkfyZJFQR> z-#eqTv;Tl?oa4D9usI~flb@tUpn($BVj5=QA&Hyj+A`3{XIX@1Ir|F3*gP9{U4I$LNhJkrG$?-0DCny1dT^MRyW?gj5}?>* z1rOjW5+CFG+1badnD~lB4=1RsX#xr8;tD1MSJ2I`j1xLPCdnuEEQC}Z9v~f+S8tUzu^n=(cP(r3&Z7sXDhOl{h>!yDzVIOdXa!dB5Pg%e6$a@QhokBL1wnqPzcjN#+5i1a#a2!i|Z$ zxobIfPxAXMg}vRBERi%HGU<5Doz%|>v!J!oga>=UFQ(1&Y|&x3h_}@x=&aCTEFxMK zKmlHFb@40QWY-rcG>(wNM*}1MGAiv9cVpzuwdsGk`Z~>PN$M1{#KK_Ppe9IQm2f(J z>8m92Ar+lQR5`xv{Ks?O!nDo|+?r>cSAZ(h=_+qfgcJ(dU(3i3VS=jS{ zYJ=gdGh6A#aAS&|ZivrVb%&$wX~ZzXpI<1b4X*(HbXlipACxS_aOQF5VA}@RI2qimU5u4b(zR+1YKoC$+%vP%H>~wDL*+JZ=OI1Rd zbw?xT-kf2PlolPyiV&8r!51A+c6=gbM=p+tM=#5(k1k&!XyCh661-a?h1EfekRIwX*YBi8*qLud)kKVsAT(+?v_kUz+5@ZD zx3~*L`Mu&1oUz*X%AXYiHDxPkuV6MW#TaP_L|oXdtcj))h$sUiBTYMYGV|FeWfT;8 zUM&wEGcY^2dwJ|N$>kai;LR-^&XH2_UNu1h{(gwTqK}I)p`V(YdqYKcsBb%OGzv<8 zQrK@10si3&Qk)3}P(c1x_z@xSD0cES+l3N}Tv!;5>(Dr&nSpc0W7cP6I=0Q*)06vZVK15n86 zFv>cM{?E1DfdB3dHv}+#ZdI`)YJA+9=TO#RpqXbts)|n!lX8QYEZ)R0(!{iJl7T!C2!R6rAZYwWe?Ow5LXyg|tI;Q9{b(;7 zocl+|Z*wbU`klpW+T@f#@^- z4E}XwO>m%5F(PoMN%JN`rsw|}Q$%MliOXccW2qrm7>>XU4cqpjSTX^Ig+3(LHN0%) zz}oh9FnAaJ6i@Dq7BHu%VDhw`P>J#KC_wXjr}GX`?4p9uoVC~yK_Es90n&oP#X<=^ zh&CT_3f0lX9O!4B_q6Jt*ZBcMLI#zq6HM*%2O7Ms%P);wm^0eGusKj@dUkWDnsE12 zG+fx22W}=H#`Q{HfIO89$QD(nP0h?S0XQS(Ja;TZ=Zz6$Uu%cJ%ER-_MDa-Q;^=|5 z_g-Fl>lJ_kC;~|PKsZ{P=`RSU+PkTs7`%8W;R1%uXLC6@)XE@RK003k_ z+atXMYpag5sqQ5ffa>G=%e0`BNZ|ToZWsViWBL8~krD=)9mIi+vHo>K8JQiR>KYvM zHqY3qqlcA@`CZJK3S7-=%Q z8e~|srns$iU;bjdN?}8ZN{8T3f)Iw{DQi9peIv(T& zR0@_0ZkIqi#9ag16)c2%!Il{j05B;S@af|l@Z1xr1n#qzI!GdC6w{`XuTUy0u5Ag#y= zpind2EO%5*TtlvAQoM_Q6lQWJ^XL(WA@F-2m;8yLygK&glsY*Gkxl+mFxl@R;-Gc+ zD#8xzB4M2=|Mt;!Ym8SNC-v9Wtm%vA2kLNiQ=)0xR{)fZ3|=%As6Ls^>aVVS6eD^? zQ1^+#Ln`Z0wB(ZteXqT&`7Zt`-Tze*JqxAs$-t7WQ!CMdS=I6m9T93@-cC&~Bjc8b zfq(F=FFQcv^H0al`vsv@%8&*#P_vL;R0_dp%mR%}w2tIlsg0x&L1l7=;e^Da=ZC!h zFLzR=7$D&btX-#+fT%49nFoL#%CW9Vr6u1w-M9GNl^p$*A8ja1_An%U*voDdromCB zJ|05)I12#q+ONF;<MJuw$32FUD&pexuaQ2@oBaNkM!zZ1bF0Td5iW5v#->)u{_0 z&sW19;$g=#vABB;QnY7|Y-6s~l9gGNdX_$~=NJqaj_$=0J5K8yZh@~PK^2##gOOfT zGb%_upMsnh$ZAea$D7QD*SvD8;L9UTz=~MZr&xFA_qVD{XIZ{S$y(8J>j3=>A!w=$ zk{Fh2GL^<>bESR6^YvA#*oKp=9*lmRG3yX8CVa0n=YTx!tb-R)R#!zswCL_q%8qq3 znUxik6MRxwpg!s(Bz&Vu3OnZ&paKL5a@_rmK;H)bpeOIkfkgGj(N=zf!BpR({rM%$ z-`0oVg%{=D$0J>QmkiMlb-SkB`2&l_v1#AKw*s7Cr|$MD3i#48#mT7aURh9(wkXl5 zE0d1!Uq-G;rGVjpQ%8sg4RAY@ZusZqv$Bf?15C=}#LW`vr<*enjf=oz?(C1-QFsiCA#3a7!QJsvho$bGo+%F)o?I=I@ZcQW zDl~x%xYg}_X%oe%Qv&>AY=5g*O{XQq1fLw4y@j9u+fd=*gip?x69E~6F)0m47aPj^485YSYI*WA&0pxcvqMX$Za3f)D?$p%cFhK&quq^e= zqrS_^^YykRLA9JD;IZrI6fb8kAY7W1RZr_0Sco3lR!N-l0fC@_$?OUNToD$qDAD)bT6U)T@Xu>a!%zlsaIE-0plLDb;qQLiDF5lfw%O zBu>DTQ~9O)(>L(SoZS1dlCY$GUwxU8;+H1cH*jbTxv;q+wM@j^H6i7df{g)mE z)uI$p?5(~&x@z3>t#QRV*sT4>AU^4&vA<(;X+2l34Gkb!CJqv7z0pT(fgnM?&h)2y zfX6%w)TnG;>0g|FGqCZ57uiO|CpX$*pJdSl=2Bm?Ey$OE-5V#4?qbBQ!P%N1{^)Tp zEEUWVE%@22JE3AD<(9m0nt|9+&R=&*U_pNm+S7P#oah}yHm<~ATup-l3SyNyLDl#1 zR;G^=N8^1Nc)6$R344N~LlShEqUr>tfq-8bD&abLOo-@!7z+5UoKX=lsQ!Hp=J(SA z(<26%2%?i2nfSzr^Z9%RI_t6*=1e(q0H_tSrfD%KZP1i?he9Sem}4g`zRO)9oy$Ik zN?`5)n3Q9`0t?P}dV+|eY!o$L&gA89 z^z)`VC;m?ZL8gBWglqj^y`lcCz5OD+Va;U3mQ_KY_$;8L`W^^=+PN31>LO#KOJ_BbqosB z|Emf%ADue~<2fqh2|ZG0@Ky-Wt+T2}zU=T^F>#{b>=Hw`c(_a&Zz#7zexH@|5sPYm zgep`YLGddpJK3d)WS4Fi@EaBXO`TNh3&cwpD#E`8hRRgz*D4rnO;OgPfz9%srg^X$ z_Vv+05!SqaiaJ}qqn>Marhjc~Vs~2Us_5-ev|zh(0gn}%A7~pcOfW5tJG`kjqI^ZF z2;^>?fg!oy5Z+6Dm^T#9h!3rG@L337nY!=j4;QJ^)0Qi_T!R))&B5Hd0Wzw9=xRd% z$cujSv4o#(A!PwBax{RDl?ZY>82+^pI?@SqX57Be_sOH6P%45>VMG zqz`OMT4U*+T*5Co`6!*%wLO1ZkQzh;S$wcH!Vs*5&1Y99`4HYkNA;eM@uPU&J;G80 z|7HhcjE8?)mkdDd>O!G1|w#*i3mN4A07mV49x86HKX`5!9*d*n}GXCm-HQc|Haf)*%6QYacqu;NgP6?Z4NyGwB?uAw-A z1_=`6@;%&#Z|2V2hut%C9?s0}%-R3h-#=7aQTVG?W74e%C1 z2*zPI0WSGxGvzp3kg|)-&(*15oPmpPMwK~6@<-oYv-+QE@(#TRDoZa@fm)w>b8P?6@^>Q{h2CK(_c;7a1(Q!dv z)jj$Wb=#;^^l0||Xuj2E)ovA3U7^tR_v8BN@Y+i5g>g57dB?5c?el|k^y2*X^D)ut zlY^_)RyLRA%MsC&q@zu7(N%7Xp#*_kZ3*QU1@3atZ!TF=l9|L&;$&a90rikM_ox|Nk)#)ebSRi^NT|_+s{Nh_O9lw_eAA&PNTf}Tl4i@j&h8SoG zId$OTRR}5fo-K<@Z5fw7O0xN=5STYf#Y@J(&M!lJczW(>!N#98bLGXM*QMj#fzF9R|Xk|%eGvXZFe zsKofQz+;Cx%O# zk>UDb+G=Ui64|Q{hidoGX+e_T0X;CM>>B(K+e0$4+VyVmIC8^&Vou~u-~|ZC)V^Of z40HIi@6zib!Od$eNV2Z)V6yruSpr&>$4LM(pYG`2ojqTr6=5$0hgasB4b4>ONS!t8 zenLxE1KBb?$F!)i9Q|SBRJ4*&s)cby44?$3lb@17ANDRk;_fCW42w3ihIst_>D1fb zK%M|v3?7JqOW=kRBLe_E=Pb`Z`CpXvDRC_k*yIj3n6X^@9_b79sn(QhYRJs1Y)pmn zCNDiu;_lf@7ffH*UAlWpv9BMgvO1MSr&k2N8YRLl1)t32KH8f*d!8&}FJtW!`*6!s z{e4%=Qw});*hy^tBuaWgTcLYH?DH|6x`3;OpV`4D^z;ZGSwL*-X|GKXj(O0G?>{HR z2Ut8+t=Q)q&|T+QRi5fw|6kGTN?a_nd&O_24-KI=d znI`fo-Shx4ArX+eNXO#ViB`5HldP{*%7KFW?(r4huBGRX*E#=&Tc(GOcdMzVk*UxV z^gIp+meKP=p7Q<0AM^2f+JME~yZ-uPZaGJhLF8jFA*C|Gn227hVf=1PziG`9Yjs|C z9qu8SrD2;iJ^yv!o8^YbGP9D&tq}6d`_4io@RAXuvs`HXV|x?FE9wRa5Dj~c-SZOB z{b$sO&ObRfere@AkA+`%D{wxK6aBykKih}Cqvoj76kidfq9k4>MX%2xz0JM9P;DeV zKdkJ+^rDaB9jf))2kf7GCw6x>)_5bE$={Z{&e|(g(%Zk*F#z^t)D-jg^1YA^-IDhY zs55{OzbFM|kYkv$kIy<~*19bmR*Qh^OC4X3T^k&wqQFX){VW^YER7&bZzb=%KD;i} zmjtpkJQN6$xz^!b?d&GS&=GCk+Yh9i0%gRnvd)B8+prj6gwx@9rv#(HQcA|WK{8*?tZx@@;CL&RSPmF0YJ{$0DZCrn}I-{JD>M>z@^qqlIMV56rgID8x z?BS%$h2h4Ei{{a$-L=Rtw`S8f;l_>H0qt*0in@|pmdS~h&2x{PAcvFxf?$+uWQrag zgRiwly9{XLqDVFiJ{0Q?ka7VKOE_Gjgsl7W|mZ>Agr%+7-P(*X$&vIFYZ!&Ch{o;$269hI&c92{}Tg_LK0loWA@NU^3Ok}kf{ zZEln#q*)g3b0?P=4_d2$MsypR_X|fo(B1%bJQGjc_@IJ%)cJ&XsQ&~yARKkUh6=FgBr%z&P`byAMD=HS^(?sR^wua;3$k}m+}+%j6u zb&emv>^-;~bDrK>QMequ9?TsHF^j=Ck!8=OT_B|olY<84ZZ=!}s6$IyC$kE~LY%Mp zHo8q=l6g26%@CT3;IxN=7`}n@2`*+x^YL`fRt-NZio%U8&07QW_KaJKRn5yv{ zy)Pc>gT)wBrNIT(0@cdoB(dXcyt0#L$tz)pQyK@wLi?y3CVXCjfi)kN%Xt0QIaN5t zq^EW!QBOrh?G|cWqI;qlMOB!efBwY)X>xrcU|2Jduu*N%ONxMQ^i9{;y%V7jVUuu% z6H+i)HMPR4?$xG&kYWeB(O>js)As6S^9H%LD(?Fw)XLYo)h8}UaULQS8R0JauX9Mw zqn<$M1)3=OGQ1d12VvV6!8l!_C&bYt)PDUo0KQo7q_y1il{#Z*$F>W`htb+v2iDs& zpZHSw+fU_3UYN0*R16~%ZTIn>p+HMnBU3gMSjB40|Rb?mXE1*dG`IOe%*nYjYt}s74T(36@ zAZJK1#QdY??Zi?>4f9J=4Y1QqgonO(zM(b|`!CF0OLh5-@Vdpht8QPk>-wI!My^jQ z%BDJmO{7lC9fK%6>LzgV?GK@Ht}O>4E%*DKtw~xQUv^ftBJ&O}jEur0v{nkf-CTvv zk%Nh+q8Oa9VH?xt+5&sOj(OkA1Q82szGqJ`vHIf8Ca~srtGL{D4PGd>UJ(it-T84Ch4_Hfsii!LS->j=P;A7qtex6vJ$ZYVpo zQ1WyiS!F~V3aJ}qmIfsqSpm-5TJ!_*hUSt4lz8ybTs5K83F!EkoB;PuiHqg33)%D2 zu3_~!rpsW4U}Xd#8_=s02MEAO2I$62D9ce=Ihc`M*UJ5kP> z5+9S)DLiODIX$Z?E<522^f00*Dg;=8BYz&k{|Qq6p!IYupvJ88WLmuW=PxH+xU#V@ z_*yo>MOKtoVIu;3ayC?_N+vU`?s&DG1g`W+F3B_T? ztULdN@r$Pbh^E>G{Krx~dW^6yt4AKO8~Z&oZnV84y}5&)9yFa787PEzdGhUUKMr{9 zG-OG>bCl_g$LSsO%D%YY2kUl3=jfiHh7OvPQA)7ZkB$FzN#EX!=C|1>xJ}sIJ=9=$^*0RY<>BSV59Gxp9=6{1pa2zvm zm*yp0D>^C<=@}c=!xvqjd_)CaxH&%E{3c&i^b^7){P4L`ZeE^21vduQPd>25cef|H6)_>{Ro@qrF-9>@PjdU-9KeOx0 z)$)Yi^`u>*sZSut2T?*$SV2QvX3(vPto5JW*5cNehj6~fd#_IzIP+T8Y z_v72}ohysm!`M~ry~UN)p~kgz??aJ4pq|+(l(nmJ_yP^BN!|d_bg54a*2QyQrN#pt zRkU2zXqB8X!mBP)0VAn&cp`ah`0@k>-1GH(R&0P$Sis!a88%)$%OD(x1HkwSnr3#l z7=Diq=Yh4-1naJmO!3PK!;(otGcRJ#5i*;NOTV&DyPti=={f)RC$jg#yE$5$z1<63 zfx{s~Oy1Qs9*eW-$#8doK>0b!@c#hjllO~+*zrag32m*LJ?u!BHJ2LcU+orHUdT?D zc#&=#JB3OCV8dU#kML>OI?d44FZN=xmR=vcDl1 zxxK;q+prLmrKlLY-n_@fxG6Q+p*rY#a?xKVTSay8x` zcL_KYI-Xtrn80-vdatHNyKxzM)AIpX(o+%tQvigoF)dMrR~r$TTkb*{X24zpEFru& zvfj6L$A0|Ld%jta5$f3h5_VL9brj%mkFJ)REH*1rlG)H?Lm8{gtor%8N=KM&JL4R2 zQ8Yc<8rtat0|WmgWH~tGiN~qam0mP&Q7}Di@L29T*js3sTV4CBfV29*%k=fEfrutC zj$T_q8DWkvL&Fm-ZZImxB!oy8#Qlygdl^MUO7(y)h2P^KzyR$BHx}lm>w^-ikyI$a zRtT*BrZ}~sn@aD+?hvZwKND2sNo5Yp@>WcxjcJR#&zclZA3rZ{xU;^}m7R0;j6c1E zBY>rrg_Se`GGZaZhhGwDt%imy6jJ^;e3k`OK>m@>&9b7h1L|NA5ZvE4UVZw&0Xjv#5R{KOf72N7ta_J`h7jpJ4SoAal&v+qgK6|*O8YiIr-Xcz+QXQx5qW(ay5)BvApau)X( zBcZH49vy#{6&%q?kyu!xDV=s^S0KQO{$Q~9_-PKU5=$RvAp0*ahX>(jfjC^Hby9s8 z^Pt+9+2%!eDmw7$x|sqc_@6!Qy1Mi-T0#|;74OQ$nzeL8JbjZ4@Q4~KeGNn@|)LqJRJL7N_n7pAihOx?&vjh}v`A6v$z&RAEJlmpQ# z7z%rVR?v;1+?_uuN-$XD@&`3BW(vUQt-NGkdm%R`_2ZK+d&@U= zN69Bo1~;yyy)om{Mep9!dbhzLe(i@_V|MHA;!`Zr6Ae``mXT@>0;n;(M6W#m?s{9+ zG*R(Uy6wtR{FBiP*;OazmAb6(G4utmaU(*Hc5i9#qgUn@wx;nqQtUP!UB|-L4l6bWl z-kXb2X4xIaG$Hxy~pr%%A0?=%%AjN1- z6A-CT>3Ia7$af+0OU+lGKl7V-?dE-(Rpj)K=JqpZ6VeM5Dt^`2rPDQu$2$uC-|tIY z#jro^D95ZTNln{5#v?0q#_zPY_7OBC>A1*8wMk+TawOUu@HIN_f^j$pFti{QeBEC? z-R|zY=$oV8Xr?UpZ|D_pIm5Py-Ju#jXYM3q$k&y4&&QmjhlHBX*(6@`cb7LB&8G|C ziM<1BQZj&H7x5ocx1!6>hAYfBR78{x?x}`b<>oz+A$6NFty}^Oovr^P5Lij=YSD(6 zqW`dccXNMIfuGu};%wa?fQ%ItGjN`x zH~0||&zL6CRx4^0m?>D6D%e+W?NiL4>HXh0gLJVDdqoVrq1~n?UL}B8IWBzgHL%e)a z79L|EcNtaM-WCh^hp05JFA$t#*oIeU2j^c$#*iO{32YD3OA;+kubknKiwEyZ z`{;YD?YB$b5J#OSQa>sMzrxyNx^$PC$0pv`D02S#a3 zejH9dqFbL6QMBFfb4Sdzr2HVTRrZm9#}c^6-n5~a^qgLPsI{eF%IWQ1&GaeDu&8lc zSu=W_GC7m{DI+MbJwE(+;LIrE10upA-h`RBwiIB|(XiLcXKpaKvmVMx2>V+}Z-fEX_XF0$bNUP+#w$>S%;QE^AOs+WoY#parTwhzCy(fy?hzyPj z=Zt((6en5{>zo5pDkOm?VO|W4NqSFKVeo@YjA6ZwZb)-ZmQLP zJUiG8;+ib9cbUNCiyaMyn4nxx9oh?tmNRm_LrBH*aBjh-!Z1)4YXYc&DpskU*c|ZU zc}tT?bSBkHGefvB_(6hg`8O&B1hBs&&8N~wJcdp7 z1Dq->d9Ba=R9Xa&E?^J_S)tQ@V}lGKvr&YP(@R+2)jOs#yyWWA7Uq(ZfmS+wt}K;d z=@@+a&OOj1pXD9YZU0E!iqiR*#unRYwfC)h4NHwb9|!L}A1XT9?eV?i+mg2erL?dq z*>X$Vu}~`nO590%8LPg_e?5`^M$`#_ABBr52GaAdl(N|rb;JUGDl-qaNlpNX$>tC? z;v5~_kb)_1@Mpo9^WXbC&ke$3y6K`l;g zL#)EA{n&u*f^&yg&YfK*1lP*e?!j5h35~f=A%w^i0J4Kg=fkcu2@3ebvg@x^_SwEH ztuCe32to3%3!1f`(Ab*tZ)5efGR8b>WXX{u>U<$s!N!B9?p>6E1Du~%i=riEl-|-4 zo0}l*ijG3x*-Bm^qG3%h+&|JlXbRGRmrp2BSU_ zw8*iM>&?~K)Z;hFfAs>{0L1&^cU3p<3+ADF*fyVD657sAg}7$(RGM^g_O5&C5i&P! z7oI4%NvPk^3>8K9tQBy=py%fMb0dmy4+yPG}?mt{|D`Q`>A>j zA$`b?antWVEBTX_@>Zp&1`dL>GDI3aEBt%=$jx>~Cr%gs)2etnRhnR#5>*30VmR7N zf_-ZdJ|RMNrg+bMzp}OZ%70Zie4%GxKt}Q#FQEo-9H{fzEfnm8qX0|VES|Wrap7_3 z(6=TLc*KK?v;q%CIvcT(zpJx}A7mgOtLr@W^HrYCzo?d-_>226j#z+m=MjNLtbnNj zH3T`_YPhM9Q#c4VIu&xKMO}E1)#kif|89A@2{PZ$%IRr(q53p1kAL@E={KG{iSy~N zM;tAFY+C}RVyl=~Gj}Wql9%H2P<>TbKRLp-J3&#*-d5HG7XL&~@=a_)URa`&ux~&~ zmB5*|RU-xyx%&3Ci(c*Il63#hm=W8D>{GwpM+Dq2>l~#;+9Z7nyuXFdIP?f_?@$^k z>r8`|41mrA+oZPz8>tCPcLBBWYZ5a7B~LMXOVC9m#kDlE`(eGTaWakr~C zw>NHYA9#e$J)IA&$DEvD5V^bCTI1Z4VtSGNMi3li05(WYcD_m%a(Lw#fK6bb>YmxW z%{{HApF}-7=6UE9G+tc=?)ELIQJy;V@%b*jO(COP`eMHXOO_-)&} zDy3at7Ss0Dse`NsaGK5FUOa^{_dHqdm#mdzzRp+s5T=04^4rUkgxruB4wTOP<6I-C z#HEzf%i0EwI%dfQEd#Wx5;9Y@wiatVFCeEXhOhI5e*nt{j$|tAsDH z8oWa4vmXw!{AU&1tqw@(l^neYZgg7a*lP7Fbelqa36ittwoN>B~z zvs)U$*JS@%zuHmOV-C2gns`4HH#JLN^jJ2=OENg3@Hd?D<$r}Px|b}v$b;elES@I( z(!yngwL9%Y(oW~ex~}Z4R;3vQ7~oOztKE{7npzWm+3P@BIXuq0bU|*R6{KpAjX%|z zLo6gjU*hE3o4V&jb+Wn2Zanj<@$5}M@mQyI@WJ#OZr2|dF4f0H*p+y+5^FBxZaXOs z(Y%T7^{uVL~yK