From 638cbf8a8edb38ccdba05eaf16dc4cb012a02965 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 6 Apr 2023 03:06:22 +0200 Subject: [PATCH] [MIRROR] Replaceable Traitor Uplinks [MDB IGNORE] (#20350) * Replaceable Traitor Uplinks * skyrat edits --------- Co-authored-by: Sol N <116288367+flowercuco@users.noreply.github.com> Co-authored-by: lessthnthree --- code/__DEFINES/dcs/signals/signals_traitor.dm | 2 + code/__DEFINES/radio.dm | 2 + code/datums/components/crafting/crafting.dm | 9 +- code/datums/components/crafting/structures.dm | 14 +++ code/datums/components/uplink.dm | 39 +++++- .../datums/looping_sounds/machinery_sounds.dm | 13 ++ .../structures/syndicate_uplink_beacon.dm | 114 ++++++++++++++++++ .../antagonists/traitor/datum_traitor.dm | 15 +++ code/modules/mob/living/emote.dm | 6 - code/modules/uplink/uplink_devices.dm | 56 +++++++-- config/spaceruinblacklist.txt | 15 --- icons/obj/machines/telecomms.dmi | Bin 22336 -> 25530 bytes tgstation.dme | 1 + .../tgui/interfaces/AntagInfoTraitor.tsx | 26 +++- 14 files changed, 274 insertions(+), 38 deletions(-) create mode 100644 code/game/objects/structures/syndicate_uplink_beacon.dm diff --git a/code/__DEFINES/dcs/signals/signals_traitor.dm b/code/__DEFINES/dcs/signals/signals_traitor.dm index 66aebd7ae95..1728ef8c679 100644 --- a/code/__DEFINES/dcs/signals/signals_traitor.dm +++ b/code/__DEFINES/dcs/signals/signals_traitor.dm @@ -3,6 +3,8 @@ /// Called whenever the uplink handler receives any sort of update. Used by uplinks to update their UI. No arguments passed #define COMSIG_UPLINK_HANDLER_ON_UPDATE "uplink_handler_on_update" +/// Sent from the uplink handler when the traitor uses the syndicate uplink beacon to order a replacement uplink. +#define COMSIG_UPLINK_HANDLER_REPLACEMENT_ORDERED "uplink_handler_replacement_ordered" /// Called before the traitor objective is generated #define COMSIG_TRAITOR_OBJECTIVE_PRE_GENERATE "traitor_objective_pre_generate" diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index 9644a1c09f2..e75ff9ea9eb 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -90,6 +90,8 @@ #define FREQ_SIGNALER 1457 // the default for new signalers #define FREQ_COMMON 1459 // Common comms frequency, dark green +#define MIN_UNUSED_FREQ 1461 // Prevents rolling AI Private or Common + #define MAX_FREQ 1489 // ------------------------------------------------------ #define MAX_FREE_FREQ 1599 // ------------------------------------------------- diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 51f74fd389e..1b50b4e7b63 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -605,10 +605,15 @@ //Mind helpers -/datum/mind/proc/teach_crafting_recipe(R) +/// proc that teaches user a non-standard crafting recipe +/datum/mind/proc/teach_crafting_recipe(recipe) if(!learned_recipes) learned_recipes = list() - learned_recipes |= R + learned_recipes |= recipe + +/// proc that makes user forget a specific crafting recipe +/datum/mind/proc/forget_crafting_recipe(recipe) + learned_recipes -= recipe /datum/mind/proc/has_crafting_recipe(mob/user, potential_recipe) if(!learned_recipes) diff --git a/code/datums/components/crafting/structures.dm b/code/datums/components/crafting/structures.dm index 4a56852ecd5..2cbe2c35302 100644 --- a/code/datums/components/crafting/structures.dm +++ b/code/datums/components/crafting/structures.dm @@ -60,3 +60,17 @@ /obj/item/stack/cable_coil = 10, ) category = CAT_STRUCTURE + +/datum/crafting_recipe/syndicate_uplink_beacon + name = "Syndicate Uplink Beacon" + result = /obj/structure/syndicate_uplink_beacon + tool_behaviors = list(TOOL_SCREWDRIVER) + always_available = FALSE + time = 6 SECONDS + reqs = list( + /obj/item/stack/sheet/iron = 5, + /obj/item/stack/cable_coil = 5, + /obj/item/beacon = 1, + /obj/item/stack/ore/bluespace_crystal = 1, + ) + category = CAT_STRUCTURE diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 50907528ce4..eea548a7551 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -65,6 +65,8 @@ RegisterSignal(parent, COMSIG_RADIO_NEW_MESSAGE, PROC_REF(new_message)) else if(istype(parent, /obj/item/pen)) RegisterSignal(parent, COMSIG_PEN_ROTATED, PROC_REF(pen_rotation)) + else if(istype(parent, /obj/item/uplink/replacement)) + RegisterSignal(parent, COMSIG_MOVABLE_HEAR, PROC_REF(on_heard)) if(owner) src.owner = owner @@ -86,6 +88,7 @@ else uplink_handler = uplink_handler_override RegisterSignal(uplink_handler, COMSIG_UPLINK_HANDLER_ON_UPDATE, PROC_REF(handle_uplink_handler_update)) + RegisterSignal(uplink_handler, COMSIG_UPLINK_HANDLER_REPLACEMENT_ORDERED, PROC_REF(handle_uplink_replaced)) if(!lockable) active = TRUE locked = FALSE @@ -96,6 +99,19 @@ SIGNAL_HANDLER SStgui.update_uis(src) +/// When a new uplink is made via the syndicate beacon it locks all lockable uplinks and destroys replacement uplinks +/datum/component/uplink/proc/handle_uplink_replaced() + SIGNAL_HANDLER + if(lockable) + lock_uplink() + if(!istype(parent, /obj/item/uplink/replacement)) + return + var/obj/item/uplink_item = parent + do_sparks(number = 3, cardinal_only = FALSE, source = uplink_item) + uplink_item.visible_message(span_warning("The [uplink_item] suddenly combusts!"), vision_distance = COMBAT_MESSAGE_RANGE) + new /obj/effect/decal/cleanable/ash(get_turf(uplink_item)) + qdel(uplink_item) + /// Adds telecrystals to the uplink. It is bad practice to use this outside of the component itself. /datum/component/uplink/proc/add_telecrystals(telecrystals_added) set_telecrystals(uplink_handler.telecrystals + telecrystals_added) @@ -236,7 +252,7 @@ data["extra_purchasable_stock"] = extra_purchasable_stock data["current_stock"] = remaining_stock data["shop_locked"] = uplink_handler.shop_locked - data["purchased_items"] = length(uplink_handler.purchase_log.purchase_log) + data["purchased_items"] = length(uplink_handler.purchase_log?.purchase_log) return data /datum/component/uplink/ui_static_data(mob/user) @@ -277,9 +293,7 @@ if("lock") if(!lockable) return TRUE - active = FALSE - locked = TRUE - SStgui.close_uis(src) + lock_uplink() if(!uplink_handler.has_objectives) return TRUE @@ -321,6 +335,12 @@ uplink_handler.abort_objective(objective) return TRUE +/// Proc that locks uplinks +/datum/component/uplink/proc/lock_uplink() + active = FALSE + locked = TRUE + SStgui.close_uis(src) + // Implant signal responses /datum/component/uplink/proc/implant_activation() SIGNAL_HANDLER @@ -459,6 +479,17 @@ return returnable_code +/// Proc that unlocks a locked replacement uplink when it hears the unlock code from their datum +/datum/component/uplink/proc/on_heard(datum/source, list/hearing_args) + SIGNAL_HANDLER + if(!locked) + return + if(!findtext(hearing_args[HEARING_RAW_MESSAGE], unlock_code)) + return + var/atom/replacement_uplink = parent + locked = FALSE + replacement_uplink.balloon_alert_to_viewers("beep", vision_distance = COMBAT_MESSAGE_RANGE) + /datum/component/uplink/proc/failsafe(mob/living/carbon/user) if(!parent) return diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 9287f927333..1e8ce73e992 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -132,3 +132,16 @@ mid_sounds = list('sound/effects/bubbles2.ogg' = 1) mid_length = 7 SECONDS volume = 25 + +/datum/looping_sound/typing + mid_sounds = list( + 'sound/machines/terminal_button01.ogg' = 1, + 'sound/machines/terminal_button02.ogg' = 1, + 'sound/machines/terminal_button03.ogg' = 1, + 'sound/machines/terminal_button04.ogg' = 1, + 'sound/machines/terminal_button05.ogg' = 1, + 'sound/machines/terminal_button06.ogg' = 1, + 'sound/machines/terminal_button07.ogg' = 1, + 'sound/machines/terminal_button08.ogg' = 1, + ) + mid_length = 0.3 SECONDS diff --git a/code/game/objects/structures/syndicate_uplink_beacon.dm b/code/game/objects/structures/syndicate_uplink_beacon.dm new file mode 100644 index 00000000000..f4d4ea6fe64 --- /dev/null +++ b/code/game/objects/structures/syndicate_uplink_beacon.dm @@ -0,0 +1,114 @@ +/// Device that traitors can craft in order to be sent a new, undisguised uplink +/obj/structure/syndicate_uplink_beacon + name = "suspicious beacon" + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "relay_traitor" + desc = "This ramshackle device seems capable of recieving and sending signals for some nefarious purpose." + density = TRUE + anchored = TRUE + /// Traitor's code that they speak into the radio + var/uplink_code = "" + /// weakref to person who is going to use the beacon to get a replacement uplink + var/datum/weakref/owner + /// while constructed the teleport beacon is still active + var/obj/item/beacon/teleport_beacon + /// Radio that the device needs to listen to the codeword from the traitor + var/obj/item/radio/listening_radio + /// prevents traitor from activating teleport_beacon proc too much in a small period of time + COOLDOWN_DECLARE(beacon_cooldown) + +/obj/structure/syndicate_uplink_beacon/Initialize(mapload) + . = ..() + register_context() + + var/static/list/tool_behaviors = list( + TOOL_SCREWDRIVER = list( + SCREENTIP_CONTEXT_RMB = "Deconstruct", + ), + ) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + listening_radio = new(src) + listening_radio.canhear_range = 0 + teleport_beacon = new(src) + +/obj/structure/syndicate_uplink_beacon/attack_hand(mob/living/user, list/modifiers) + if(!IS_TRAITOR(user)) + balloon_alert(user, "don't know how to use!") + return + if(IS_WEAKREF_OF(owner, user)) + balloon_alert(user, "already synchronized to you!") + return + if(owner != null) + balloon_alert(user, "already claimed!") + return + var/datum/looping_sound/typing/typing_sounds = new(src, start_immediately = TRUE) + balloon_alert(user, "synchronizing...") + if(!do_after(user = user, delay = 3 SECONDS, target = src, interaction_key = REF(src))) + typing_sounds.stop() + return + typing_sounds.stop() + probe_traitor(user) + +/obj/structure/syndicate_uplink_beacon/screwdriver_act_secondary(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + balloon_alert(user, "deconstructing...") + if (!do_after(user, 5 SECONDS, target = src)) + return FALSE + var/turf/beacon_tile = get_turf(src) + new /obj/item/stack/sheet/iron/five(beacon_tile) + new /obj/item/stack/cable_coil/five(beacon_tile) + teleport_beacon.forceMove(beacon_tile) + teleport_beacon = null + qdel(src) + return TRUE + +/obj/structure/syndicate_uplink_beacon/Destroy() + QDEL_NULL(listening_radio) + if(teleport_beacon) + QDEL_NULL(teleport_beacon) + return ..() + +/// Proc reads the user, sets radio to the correct frequency and starts to listen for the replacement uplink code +/obj/structure/syndicate_uplink_beacon/proc/probe_traitor(mob/living/user) + owner = WEAKREF(user) + var/datum/antagonist/traitor/traitor_datum = user.mind.has_antag_datum(/datum/antagonist/traitor) + + uplink_code = traitor_datum.replacement_uplink_code + listening_radio.set_frequency(traitor_datum.replacement_uplink_frequency) + become_hearing_sensitive() + +/obj/structure/syndicate_uplink_beacon/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range) + if(ismob(speaker) || radio_freq != listening_radio.get_frequency()) + return + if(!findtext(message, uplink_code)) + return + teleport_uplink() + +/// Proc uses owners uplink handler to create replacement uplink and then lock or destroy their other uplinks +/obj/structure/syndicate_uplink_beacon/proc/teleport_uplink() + if(!COOLDOWN_FINISHED(src, beacon_cooldown)) + return + COOLDOWN_START(src, beacon_cooldown, 10 MINUTES) + + var/mob/living/resolved_owner = owner.resolve() + if(isnull(resolved_owner)) + return + + var/datum/antagonist/traitor/traitor_datum = resolved_owner.mind.has_antag_datum(/datum/antagonist/traitor) + if(isnull(traitor_datum)) + return + + var/datum/uplink_handler/uplink_handler = traitor_datum.uplink_handler + + SEND_SIGNAL(uplink_handler, COMSIG_UPLINK_HANDLER_REPLACEMENT_ORDERED) + new /obj/item/uplink/replacement(get_turf(src), /*owner = */resolved_owner, /*tc_amount = */0, /*uplink_handler_override = */uplink_handler) + flick("relay_traitor_activate", src) + do_sparks(number = 5, cardinal_only = FALSE, source = src) + log_traitor("[key_name(resolved_owner)] acquired a replacement uplink via the syndicate uplink beacon.") + +// Adds screentips +/obj/structure/syndicate_uplink_beacon/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(held_item || !IS_TRAITOR(user)) + return NONE + context[SCREENTIP_CONTEXT_LMB] = "Synchronize with beacon" + return CONTEXTUAL_SCREENTIP_SET diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 2d57748f754..486e6e37586 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -18,6 +18,10 @@ var/should_give_codewords = TRUE ///give this traitor an uplink? var/give_uplink = TRUE + /// Code that allows traitor to get a replacement uplink + var/replacement_uplink_code = "" + /// Radio frequency that traitor must speak on to get a replacement uplink + var/replacement_uplink_frequency = "" ///if TRUE, this traitor will always get hijacking as their final objective var/is_hijacker = FALSE @@ -47,6 +51,7 @@ if(give_uplink) owner.give_uplink(silent = TRUE, antag_datum = src) + generate_replacement_codes() var/datum/component/uplink/uplink = owner.find_syndicate_uplink() uplink_ref = WEAKREF(uplink) @@ -82,6 +87,8 @@ pick_employer() + owner.teach_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) return ..() @@ -139,8 +146,14 @@ result += "Force add objective
" return result +/// proc that generates the traitors replacement uplink code and radio frequency +/datum/antagonist/traitor/proc/generate_replacement_codes() + replacement_uplink_code = "[pick(GLOB.phonetic_alphabet)] [rand(10,99)]" + replacement_uplink_frequency = sanitize_frequency(rand(MIN_UNUSED_FREQ, MAX_FREQ), free = FALSE, syndie = FALSE) + /datum/antagonist/traitor/on_removal() owner.special_role = null + owner.forget_crafting_recipe(/datum/crafting_recipe/syndicate_uplink_beacon) return ..() /datum/antagonist/traitor/proc/pick_employer() @@ -258,6 +271,8 @@ data["theme"] = traitor_flavor["ui_theme"] data["code"] = uplink?.unlock_code data["failsafe_code"] = uplink?.failsafe_code + data["replacement_code"] = replacement_uplink_code + data["replacement_frequency"] = format_frequency(replacement_uplink_frequency) data["intro"] = traitor_flavor["introduction"] data["allies"] = traitor_flavor["allies"] data["goal"] = traitor_flavor["goal"] diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index caec685729f..8b4c67ce3cc 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -142,13 +142,7 @@ if(. && ishuman(user)) var/mob/living/carbon/human/H = user var/open = FALSE -<<<<<<< HEAD -// if(H.dna.features["wings"] != "None") // This was our check before, leaving it here in case it's needed when someone gets around to fixing this. -// if(H.dna.species.mutant_bodyparts["wingsopen"]) var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) -======= - var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) ->>>>>>> ecbcef778df (Refactors Regenerate Organs, and a few organ helpers (#74219)) if(istype(wings)) if(wings.wings_open) open = TRUE diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index a44f299c04e..5106401c4aa 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -23,15 +23,25 @@ /// The uplink flag for this type. /// See [`code/__DEFINES/uplink.dm`] var/uplink_flag = UPLINK_TRAITORS + /// If the uplink is lockable, which defaults to false which most subtypes of this item are for debug reasons + var/lockable_uplink = FALSE -/obj/item/uplink/Initialize(mapload, owner, tc_amount = 20) +/obj/item/uplink/Initialize(mapload, owner, tc_amount = 20, datum/uplink_handler/uplink_handler_override = null) . = ..() - AddComponent(/datum/component/uplink, owner, FALSE, TRUE, uplink_flag, tc_amount) + AddComponent(\ + /datum/component/uplink, \ + owner = owner, \ + lockable = lockable_uplink, \ + enabled = TRUE, \ + uplink_flag = uplink_flag, \ + starting_tc = tc_amount, \ + uplink_handler_override = uplink_handler_override, \ + ) /obj/item/uplink/debug name = "debug uplink" -/obj/item/uplink/debug/Initialize(mapload, owner, tc_amount = 9000) +/obj/item/uplink/debug/Initialize(mapload, owner, tc_amount = 9000, datum/uplink_handler/uplink_handler_override = null) . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.name = "debug uplink" @@ -44,7 +54,7 @@ name = "debug nuclear uplink" uplink_flag = UPLINK_NUKE_OPS -/obj/item/uplink/nuclear/debug/Initialize(mapload, owner, tc_amount = 9000) +/obj/item/uplink/nuclear/debug/Initialize(mapload, owner, tc_amount = 9000, datum/uplink_handler/uplink_handler_override = null) . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.name = "debug nuclear uplink" @@ -65,19 +75,47 @@ name = "dusty radio" desc = "A dusty looking radio." -/obj/item/uplink/old/Initialize(mapload, owner, tc_amount = 10) +/obj/item/uplink/old/Initialize(mapload, owner, tc_amount = 10, datum/uplink_handler/uplink_handler_override = null) . = ..() var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.name = "dusty radio" +// Uplink subtype used as replacement uplink +/obj/item/uplink/replacement + lockable_uplink = TRUE + +/obj/item/uplink/replacement/Initialize(mapload, owner, tc_amount = 10, datum/uplink_handler/uplink_handler_override = null) + . = ..() + var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) + var/mob/living/replacement_needer = owner + if(!istype(replacement_needer)) + return + var/datum/antagonist/traitor/traitor_datum = replacement_needer?.mind.has_antag_datum(/datum/antagonist/traitor) + hidden_uplink.unlock_code = traitor_datum?.replacement_uplink_code + become_hearing_sensitive() + +/obj/item/uplink/replacement/screwdriver_act_secondary(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + balloon_alert(user, "deconstructing...") + if (!do_after(user, 3 SECONDS, target = src)) + return FALSE + qdel(src) + return TRUE + +/obj/item/uplink/replacement/examine(mob/user) + . = ..() + if(!IS_TRAITOR(user)) + return + . += span_notice("You can destroy this device with a screwdriver.") + // Multitool uplink -///obj/item/multitool/uplink/Initialize(mapload, owner, tc_amount = 20) //ORIGINAL -/obj/item/multitool/uplink/Initialize(mapload, owner, tc_amount = 35) //SKYRAT EDIT CHANGE +////obj/item/multitool/uplink/Initialize(mapload, owner, tc_amount = 20, datum/uplink_handler/uplink_handler_override = null) //ORIGINAL +/obj/item/multitool/uplink/Initialize(mapload, owner, tc_amount = 35, datum/uplink_handler/uplink_handler_override = null) //SKYRAT EDIT CHANGE . = ..() AddComponent(/datum/component/uplink, owner, FALSE, TRUE, UPLINK_TRAITORS, tc_amount) // Pen uplink -///obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20) //ORIGINAL -/obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 35) //SKYRAT EDIT CHANGE +///obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 20, datum/uplink_handler/uplink_handler_override = null) //ORIGINAL +/obj/item/pen/uplink/Initialize(mapload, owner, tc_amount = 35, datum/uplink_handler/uplink_handler_override = null) //SKYRAT EDIT CHANGE . = ..() AddComponent(/datum/component/uplink, owner, TRUE, FALSE, UPLINK_TRAITORS, tc_amount) diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt index f526d8170c2..4101eaa9e1e 100644 --- a/config/spaceruinblacklist.txt +++ b/config/spaceruinblacklist.txt @@ -29,11 +29,8 @@ #_maps/RandomRuins/SpaceRuins/derelict6.dmm #_maps/RandomRuins/SpaceRuins/derelict7.dmm #_maps/RandomRuins/SpaceRuins/derelict8.dmm -<<<<<<< HEAD -======= #_maps/RandomRuins/SpaceRuins/derelict_construction.dmm #_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm ->>>>>>> 88677006367 (New space ruin 'Derelict Construction' (#74308)) #_maps/RandomRuins/SpaceRuins/dj_station.dmm #_maps/RandomRuins/SpaceRuins/emptyshell.dmm #_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -53,11 +50,8 @@ #_maps/RandomRuins/SpaceRuins/pod_crash.dmm #_maps/RandomRuins/SpaceRuins/russian_derelict.dmm #_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm -<<<<<<< HEAD -======= #_maps/RandomRuins/SpaceRuins/space_billboard.dmm #_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm ->>>>>>> 6ad516e53f1 (March into Mapness: Space Ghost Restaurant (#74182)) #_maps/RandomRuins/SpaceRuins/spacehotel.dmm #_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm #_maps/RandomRuins/SpaceRuins/transit_booth.dmm @@ -66,28 +60,19 @@ #_maps/RandomRuins/SpaceRuins/waystation.dmm #_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm #_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm -<<<<<<< HEAD -<<<<<<< HEAD #_maps/RandomRuins/SpaceRuins/medieval1.dmm #modular_skyrat/modules/mapping/_maps/RandomRuins/SpaceRuins/forgottenship_skyrat.dmm #modular_skyrat/modules/mapping/_maps/RandomRuins/SpaceRuins/shuttle8532.dmm #modular_skyrat/modules/ruins/maps/space/dangerous_research.dmm -======= ->>>>>>> 18eeaf06509 (Atmosia Asteroid Space Ruin (#74164)) #_maps/RandomRuins/SpaceRuins/forgottenship.dmm #_maps/RandomRuins/SpaceRuins/hellfactory.dmm #_maps/RandomRuins/SpaceRuins/space_billboard.dmm #_maps/RandomRuins/SpaceRuins/spinwardsmoothies.dmm #_maps/RandomRuins/SpaceRuins/dangerous_research.dmm #_maps/RandomRuins/SpaceRuins/the_faceoff.dmm -<<<<<<< HEAD -#_maps/RandomRuins/SpaceRuins/prey_pod.dmm -#_maps/RandomRuins/SpaceRuins/travelers_rest.dmm -======= #_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm #_maps/RandomRuins/SpaceRuins/prey_pod.dmm #_maps/RandomRuins/SpaceRuins/travelers_rest.dmm #_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm ->>>>>>> 18eeaf06509 (Atmosia Asteroid Space Ruin (#74164)) ======= >>>>>>> 6440c2489a7 (Abandoned Interdyne research base (#74263)) diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index 93bb9c477aa946ad70cd929fe4cf8004abad6df8..ddce8a96a933b8f7d490869f13b7e3c1e697afe4 100644 GIT binary patch literal 25530 zcma&O2UJsC*RCBx6G1^x=|x3RX#!FNF@Pf2z(y|t=^d0_5)e?3sz?!(U;(5CM0yEI zQxHNAJrwCBlt4o2zr*vs@AnVd1M5EnKV%0#Hub&X@XYS1i?^?fmnR4m_`WiA()FhnPc$+m zUjXkfeQR(y%ksU@Sv=g^1Bi#K>VJ+y4&w_^(D)MFnD z>1e~3~3RhRFdaEuC zja5xq+GRiHZ%9)l6{AB{>{Z$8r$N#>E%KVCvqM8O+B zIk%kR+IYl_>Sm8ys@*Fe`CZA&CLUiqf-*JP@to_b zQM#>fCu(<6nZNwCo||ze%gRrCg%`j=(m;Y5du(k{rY<0m1nAZc?Z<)d*BZloj}yXh zbZaf9=Y1{auU_k`rR6l;Y;CXA5uvjrM(aly?5wT>(SabiO$D*>?w%|SsP&Z8%%ebfy-_8Q(`sXu0x$WMR%%_ zIZngQF@9NfDLedcN34EZ)HT>vK6K;w!O<(fhe&*X{u-B=Q5;i`<^MCO@*9%k8dhaW z3LJ}ZSYllY@!i4YSuZhWtk7nFsd)Wv@Nf@irP|z66=uj0IFMFyOCCWuOvMivLO8N5 zC(D#-$!0buQ82C%56ZKN;`sB#J0>!i1%zf9WOku`DIWnN#r>8awq1TTuSQrfTlO@g zS(c#gSyY|d+L=0&Rpov!bAKm6Fhtj%(ym5%g*D%+(B zHRh0TZ!dZo`MNnRiXW;8E*HB^sVg{5XUm1fj$=o@DYxUQKF!o|k|wg8A_kTVz&(vY zCy8;%WFs$l)K%CJ3gwDgS?8{#DWM7I5n_T>Njr<(JSL!pZS<@telI`>W%kGa&C}t= z9Nhuh7JUnQrhT47*Ms{Xbq0A0ou~iokH=ja)<^ArfEbLeUo2b4h8-n(fZ$ATafb?^ z?r>IESoc5;pMET2-mnqUI`8#l@=nd}vmv#eP{_#!@0Y&t-Yo=d_Sdm6@J0ICwI?j!fz$Dzg)bMVx62e<8ZL%G&(W5Pbu zy%kHLtSqvKbqm`?X?eCs32QI_u#{(#|bf49J-LY-LlyK{gd}DU` zsZ5-^f#-hbIs9H@WB|=$!dKUFznXG9KqMoACW`*FV{(mzbTjZA^}u2SmJ6$x|8Aq` zeaElS%FTkPSW=I;l-uWL6f8{!E(5=o3IRF0x!sW~YCIMO4P;BA*Yod?pck+&$Mve` z3G}WHzsC@hkyA|pWlm_ZF3FsI=6Gx(y?MjwJIgnhuHnB+=#X-U4o$T(vf#wt5c)2i zhSiMMppD<`rjKE16?;wFXt^vJ72>mKSiM%`6uC}3;RS!UyZ|XO{G^ySkOnE==|Vq_>9@a zUKEIt$mHFPRQZL3wZ_#FxcGCx~?E< z$&oc#0fB=n;Lb6w=19p)KNTC<2J99lP-7VGOD3Tu-TS)3ahzrV#|dTB3n>$d7X?M9 zj0fUsm*-U<-}ISHEsaON3abCR%PmZ)`{xix5)I*@gX3F9Q~yNMQ{`mHW@GfI)2JA1 zG<2k~(pa^ z4QYEFTFjg9qaxLmt=+#xVKv*4wEJW;8W2}#r}vybupYUq+Sb;>{*ivQ9?2Ox~%U z49J=%w-WwxPLJ4Aw`^Zz{|lQ@%gt*nxI2)>unc$ zR_K(0Du{|-#Y)rYG`EUMW_c>UYkM`_g+5@2GK38%*wjmp?$wVgm#19wNA`*zg@W|j{$y2R@=syVLAl(ULl|M))J2>2?LXltZ&z|@#wLL8!6LbRR5JN1ga*xRR z3;oVvDhWL|);R^;Que>S}{5`9C_qi4?aSEDuy_KGgT@%$*r z;@lz5BNe4i5vD!H-hp3{Nc4W)2*>l4#Jb8nHdW2Nj6HforcePajKcWgAxaPc5x6J3 zuPXdtafr-;r%x(KEoE*tK&iLMk7h8)m$y+TfRj*_C}-X>vsFxnZ;5#aur>8RJ~(dG zOZw}U&zWh}r<4*Kdka*MBJvNhOhS)ys6iDSz8&F?z43FHyt1;Q*kk;KvA^Xn!+%Ik zTb7tniAb8JJ1f7`e!J^Qne$AbhN&!5@%0uQ74{sY`FWT91emuW(!YBOof;CM%uptic4bu>pN8 z?FmMXaDaEy)0va5g4ZTE;uHGBRUkQ4ls@Pn3?pUhG4@S)zXV6|c?z&uM7FJC>fLC} z5dZ@>5=4k~bqGgKOjNufD#)A8_Bdv`ZwW%K0SPr@eZEW&pL=n}Q{k zkHlDVTwb4)pnQ|pdvgr_gY5TcbmH4n4p2_+CmnK^uA5sCQsd)7(v99HOSCVL8?d2& zkFYp(H4dPvIe@$-VY&u?>M|2x)W?$6VO^@fjJf^)ZeRAkL2%O&!s|oWJ_MH4?Z9$s~ zi5zqK&b(ogH2n-x&+g&j@mn)w&y-D$!tM`wcH?`XDloBDbjWM##PKGQVDacTF{d7n zmOE-!*Xb)xn`8gLku$CJ!*76tS}NH0^wfcu{^<^%9;^<)CgC-bQ3rAY4p7>kF-SN8 zlKHa(qQXf(g@91^LtzqhW&h91}eAP9Y<(!9v60*e`g!8flsE7n7u|cN+h) zn>+9#+)Q@5<=Nh>vAtLzlf6i&A%KzSV(UnPaG}pCM84CsX<=_@%&9d%W^ytPIPnSV zMvrLN7exE2$6h zS=fi+!%BsmvT^KkV50K$Jq1yw%}_{>jmg4xT!B|3K-n1?1BjJ#VNK$~NKZXv!U;uE z#N&rQ+Xh$RK0cW5P&$gX>-*STwS=(?9LNCA_5!3k+$O{8gw5q-D0stD6=lsGdHP|{ z7@bt01%Gbr;d?Y#3CZhoZ`d!;#r)z$8MhqIQqF@IfL>O$e7P~`6)d{hUNqiEZq*nu z4LP%^G;NO6DA;J5xl{8|@fG2P{KroVm`x0oFjtMlrj}D)be?D6I)jH!X3)gg?TG=P z#-H@{yYv(y^c~I1ket4*e?^lFJmO}k@P`A6mZ8>KbN-vQGDy3K6FdIpV-G&{o#&0c zvF8`4(qXe^%`fm4{)O&wqsZ$M5Tcx3VSfmGe+QY9SpqiSjbQTBZ_+d)dtiWG3!yObh|y`lU+KgV#`lKlM2eBP8q=nV(v}%y+UHy))()^o@FA2RZu^ILL{RHZh=qB=g5R(x_ZTQlS|V~0Cbs_KZurw>iV0N>3v64?622}grNl+Zslw{8c! zZ;d4g%8GB9NwGtvU=qqk^CqIG+bEjM5`gdf3+&;grE-srjU8ph#l&tpIONU?{Mp>} z?!krGt{rutz2;t+rk#mX*w&_Hp_i#9x9@B{aJg{Je_yekkHdu)?dO*nurc2?MtIqV z3?}oxf*K0I;hK4{NrCUe@SaKqvAes)#I{MbNITQ5xMjW&Jnq@p`cgZ6Az+a4CiTMs z9K2M&mQn+NT*Q7zaPWO7G%2t_eIEu2f4G z(_hcCoTYEmJ^|CQydc{>vOhtBZ*@JGpe|x&W^ZhiUi?hAOPBw=Ro<~#-j(j7`w5CO zI)<8(hp{i23uu#>a^^Q@25~tyK-6-3Z1$&S6C+qMcg^bXQ zFgY&1QA@xwa1d4}LX(?aaQvxwFr^Q;`#k+tGQCB2!!I9%lZN%d2Kji$YrJaMU<%^KH1s%NJ~q&sh)28V_!d{3u3~J7d6YPOEUMHF5p+On(#-5+dRBrVj{B z(Q_CnF{-xy3%a>3Yd^;!twQ04#gTuAZR%gQnMaQ>jn3oDb))fE2!Gpbz}s-Ua?@{> zmCAEwu~LTFHy%AoQDJ?U^i(|<{}m@30X%dx9_70yBP1+*EUCk%V|)G~Rops2G*J`J z6aIMn^*Z}tJNFkD9S+A>-KN^g(c3l%gRGMS19s}H;dyy^&4#@>2-+nw`hR2LB~P$? z%l{dMJ7Mr4T3H(X-88}X%u(u*?QS0FV~+!XB<|%X-0j{G&;ChCm^JCQ^fwBL=oP%C zkPA~<%18B5BM?z%KcCZqP;Gb7d5=Vf{&>y{Y6kd?2~=Hd z`5ZtviFYigk9}V%<+v-!o2Uu~>_A-aeFIEkvK@YiAyDP?#6l2RGmx_9?7X_>nS?t9s9Q(QC` z5)YG@m`DAhmhx=^qznQ9+WZ}5`Ms)&RCkPVQ#oe=^8QFpq4De+r9()X`&N@NXNtJ5 z-n*mA3V>$`Qsh^I=_r!(^FMcq7K_Y7)lf=tQDlbU;GTel0q5Z2x!sMO0qKvc%xEL#GUfv_l&V4{DJ)%;y+qraeo$K4D*A7X*&~Gfwop>b+)TX`zIh zuk|ILTC=AYv0dt?t9%+#oj;Nc7(&f^|2cE6+MQ`}g%h1DOlmIqngKrnp(N}O#|-mu z1@AaX9;Ar(n2(GX13v)GfDN!r3=KthcHRaxr}jS#eQf?J$*L)S>jpSAH8m}4x}~Kh zP5RRI50MGDy~53Fzp$&5!0G?iS5WxOjI9go7)tB}tzjIh%9d+SX8-F%QRxz|rpM!p zrfAW#7$rV9{k`h!(n!rQ@zk`_wBGB)uiqbAlp>jY(FA1KgW zr;Y&pI9~2!*Y2iBISr%?(Gc98;kmvC=9xlqdwpIZ2iMr>#IB7J<~}D?+3Zm(6x7sW z^cE-Ae&c-Ugf5&v9dQAswZ12R90j{LAiqkeEi`>YWykDdwBI90krkd00v_9ReqmC zt*QnLZqlso{y0Pe0%+l>cqnvZEsg%;hxYfX?Ax*$L!j^Am!N6)@OgO&R2CI-9yLkD z8bWL;DCqk@rYB!SF*|4TfSEC!R$-yur^HL`14xG>I>3X&9O&YsdNOHB7g5st=ucy) zpww{5^{$x~U?mmo&ivYBF32rGwz(`|z+;ceGWxCofLqwTC!Yb|t!^3jJ)@3Wq z=$B^Lu&YxEXY`IPH0;DMWKv?>ON9CLyh$U~h+&@(&7-^b#6?7IgoTB*^O^F-vQXc2 zV(;QtIp%OksYCFaoHahCf*e z_-iIsvL!Oy{g@>MH3w$`7Ll@v(OHI7w7(VRIYHlPB0mqA{&oaT!Wp-%N`#R) zY4&Kbv*XasbPtc))QD@FSuh<($x?B>^ZMd=GGGq&&7XQc zo^n~uA((iK_R~|OvenLXl|WzieEb-JC4RuZZldnK51v0^e`>D$PR##VZ1QTGg^+ra<5HXfY7?LA|lxz?Od!zC2f(P zo=LQf`EbdZn-Q`mU_O`ltVTf(*)*=jm_L9=Du(Nj|sV7jIafg%9DAXKay(XC#78O-A#KrIf>Of20-?dAA!qr=5KyoTu zNeBLOlHq(}Y55B3&K%};KMz|Y_KotX-Xze0ygNSGx;}(>9loR7$N%4)r-FzTd)}BE zy$>I}u6$_VuLB4udcK zC$wWwE{Qo2dZ)RzXQ5w7UHz4Xv0R_O4yd^~+$BBPsJof#U&A5jln;qhbGtToAk>SL zY{Ux|iN(OXr(ZV%Tcivl*$=#^O6`yVuO=-B6^!8^rlsBiNqio^z(4!g9d-0yyJfs~ zKf+?o_a$J>xuc4@lC5#qkbc^J2TH+{6!1AeUynR6hf$7Ytau>R6ELxETNvX9ycP%( zV76p+qid5#hW^oMb4pt#<@w`uWErmDzO6M zHn1y4ZJK2JyI!flBs6YDOg??UvgLGkI2pPfP{7TTN3p3l>^zX zxMc1Bq=7{e`;@aa!`C|Wc6ce(V7907Pl@>ES*GCa#aA6Jwcaa)0&oT({WelS&1?+m z!*w2dWaRL{iqT}ix5KMA&NHc>4rf`40rBQ|931!xc5XG|_igtJ|1Ejnm@Pix<5}MF zVkWYWl?0V_$uNn^R1m2^#fR)x4`K|V0sF+c0eOM+xZ%pJ#&(Qo|7_LJ2A^zuO>0B5 zJ2}H6?nxq6K(AD-J1u1Q&QH8#ab2DITVNMaV`;1LTZrwaHiV7A;{`(AVPTDX`A&de zV8J|t=YK8!EAYu7D&As$J^RpS$m^~(_z!H@8C&&)j{0W?%lSasnkGAKsd2kqm-zW} z0r^Q{BKX+qj{3y~Xd5?t?rPH>-^fa2K1!bwUP9jP7x#pKilsw1YvD@dm6Atd17q>14k6U{+FEJ+N+U% z8_4%B%C>dLLE8gQpXx@Hl^X2yG=`d)QR;2ZpZ<3*K=9$GT4h%$+NWmT}tUzsJ8670*-O-*P_$Z=@&As8M_ud+L zt54735}7tCAR^NGdB>A2xiA9m)lv`8)zDt2ACUPc-M(`SzH|xzsEb2LLSZ}5NUeVdlo{wWMUK1E~N7lbI*P0LULK1z0FTD03;8M;Ep$DDkrwiKjE><6|yyl2H5 z5aybP=C9fZ@_ll@AMYJHswj6|AIh!X4A9?*MM*ng7u)~_We_@)@- z*4`o3!dR0NlK`;nP638Qg*EpW_wnC*^74k7-`o}rxUw~+;Q&Ih`;J4tY{fCZGUId8I4JqV@ivWyTV?>~7r+`{-i(h$q3HKoY4=XwuE&~B| z7xhDrkJD${1Q*#w-02`Hseq=bNO5FOljuThDH*eDy|*JRo6Ml~n?I$QThs>zJKZ%z z3QVPNR;zv=CU*>AeOP@@Ob^b%Bha6(4Yp_r~+EXVDOjS zUZbp{K=rAlq$JHLRQK}(5zXMsWeGrxJUBsV6fNiczj`}j!2h&@u>K9Z{OZGE02{}@ z#zEgeIe@b>GX8|<32#}VEuG?OMZe@R(ltOt-mRh4In6^yfgG#neC(11jDN=rN+~sdAv6$a)Yahl1b|n7Z z0rdBk35u^X5la;Q6%TDa@+FT<$ghg!LM7ECBFNb97R^+75i;~pCwzmY;n^a-VTr_} z45qq?nVimtUZz%ievqTI`*DuRPkd4d-ORa)(h{%Vs?4FbW3?P9r#*c@Y5Qbyd_I;j zK~&i~{M32+p4|0*{;TDud?k4~ZhY=5hE!;;NgRFtkYZ7t*)G?OgmS-w^{s!Fk5Q!l zbh--a+#Z+kh7cedaN8-mqxU{KNbn($gx-Ik&^W!-!8F-YJEz7CIxjD;nwpxPu91|N zOnu>(yrSAF*A3ruPctcm`cc}k&|IkBzR9|3@%8haz)Y4|3%j5oSQiUrAB}xSXdw{- zkE9(uei*6cFOWPcQD>bPy8$?6vJPx`f4OV^cdV>F%%`0FCk@SqxWils&rdQB73TbF z`D+K@@pqxPF9`5})0cUR>^xmn=MVal_f1UF0~|DhgV$Q^IWaK1P_4baUzPt& zMAx>8@XzRTH2wvuyyQH#j@A9@x|L;;(_Y=^Q%>I4D1Ywm_X6^?9v{{B#RMT}z?^Ek zQ4^AY^F5Y4mPYKrtekQ-g=wac5_{ob{YL3J4{0TQ z-dfT&S>gU#dMstkfSQW-sxYks((24EBUD58p(`1*e5Xf$p*UTQw{3aR{TnFmhz*a4 zZ3U_(id@O?d*=GDb>WV~erFXqpbU1+wR^Q)jc z1yg{x6Qzn;zGd2O9&S`JeaCRk^F~B`9i(kUd%^h=hdRGpKqJ)(*{)ffa;pPGQ)Q!xs|Y*%8dtJ)3{5-K~6lD2)o6&6o?VW>($K8F@A}XfO1}4+GW&H=85;}0bk1X z{v?>OTjyWb z;+`nJOuKUX{GYon*I-viYhjJN@MlIwf_3$Jy z7PN5i2>sRI{~n54pOo9*XSXG_tOsJhScZ}58z*FuBh1`6jg3~fw%0|3f|XCk zeLVQVXw9UK%39coSTJ#v^F-~=9pbnE&fNLl&rA@9l>U)7x9&DFa(G240<{hdTp|I} z*YenBK5RpmehT5cbiws4CKM6+@Ll~gXJ_|5W^OH`YNy5C-lDi+^5=Q_C@XxrirLlzPSL@fEdXYt>7pRIcC6xB_eqw;-)UUr3sNI`=vblR)KIiF5H zo0&^uUj8HA5d_i-3aVZHQPt2eu^a5P?`IuxoIYA%W?cXq+7gBXsAF&#ep#rJkPD3J z|J-AIdpL@DYjyY(^iJSS(!ltXfnjreJc@@x-eb}Vq=uKImA#rvasbmPi?~1JNkBa` zM}P=twQVKF3L=!4N8^C{Q<)nEZ&2ozE`&m>ZF6&d-Hr1=c0w-Y49j;SF2YZ_!x0xQ z!n5a+T)_U8^_zmgd&6&9(y_GUJcT~T8#~DO(^ckVFIf7m5q{Lm+u^`>#D#!&QI0qE zABnAFZ7$TMn0>N5H*kra>m6zE0$WIVid+#}( zKM5LG(W4bj23mAzWgX%<(6^`t82c?#$NhAFd1s$bi5HjTkD^k3a)SVXWzv$SJbLsf zBQvvebE?`kb)8v)+BVN`?X#H+v4lOKZIk#%L)@RQZF`NePWBC?1dS#%uRRr!AUD=w zEPN~9+&CRkSNF&Kc`jD!>VAU4;rMZFnE|-txmNj6FZYN5$rLR!!AmMH7VLS^wEO_? zofdIdoQHD_>jyhKEk%wSr=1JFHZKn#od#ptl!N_UXYu?QaQhqNjfHQD&)|}uO6=}P z>d?9NP`kqxg18SH48bf$t=*&urdu>(h;@lKPJf)dt|m|VQVpl$5j170;@s2!u8!`t ztckPSAUzr*tMklh5UFtN{+WkrI;M&ZRq|}wcf5Rg;<;Hxf13%W(Z2XtT!As4ADHS& zt;1E}SBGEI-mUX*yn9T07NE_Z3=%!21^#|di=$V?VD_@bH9i5+dz0SwzQ=(jR0|{d zH2~8LTrH{IT!RNYk-~&{2QDq)iW79_t_eRv>+H0-UAPLJ<6 z<~dS!<$_{ha_iir+S9)_!cAd?>0s&5437!M-x9aCC{L;FmE9%F59|UqjIcuvSOzou#Ga-?Vz) z3vTR(|IkBF=}&1>xO?a>JiiX5-GgU=*aFn~?Bsu9v1^Um#CwK66^FsauB_18h<%6m za;Ep+Jj>)J#kI({tH#fXSyQ!WLJmE+lL1g(47RrB*mEh=W>5`Nx5<4S3Sy=z>cuO(K+vg9{2LYI*2P*Pl%mtQ-A-xz8A zVP_X8sC!rsKCEyp664L0hjDXUN+ybmfSBWeD&}=CUKz&!pP@g3*W$3u28nQ(2>e@p zPIMsI8h_1O%upW64H_w5d$1-Kbd(#e7Pj}!c}u`Tr=9uRXXeY)k9+^v=s)n4nVCW! z*A@d9w?WjDY;K-SUnT(em4MX+<28W_)UWM-?nY|^hhxp^fE=t%&BvL?t_zQug*H5z zPnC=0dmqXbxT^luPuo0!DL8`WO=hxLAFIsk+U5Uk@j;TQc}F0}3Du#X1)U{aVq3DH z$aMf$fT93DObpGm*+^k_g~6!}f3R3)|3rA7^I-Lyp)t7X5p#KnAyk#Y38pVC|JDhT zJeu)89Q!^Eh6XQIKjZU*Qcki914WGrpmG4!2STRQ<1HX_IXl(ciu>WUNL*ap>cGn^ zSt=(3)tvVlggad)HknB+tAyYJUPdy8;hetb5@fHtGDlxbKXb!YHOf6D>`C(lRUfGTZDl1g)!X)^7=l+Z{hHny@ly3yx+TrWwCp~ZfI zP2Pq3#I0sm&Y;QVG!p==-kqjj1a09j$Nw9q9(O7If$7AAT$P&EHN3Xm5nS`>|H3qX z8q(xX-4JW?)8^B0JgGf}&jzAEz`O8-$iZ1S^{GbWq~}NA;*mRscL7IH-^Sj)m3mv~ z>({SB_QiIu9XRBA$gp%b8R(xCQ>54?K`_Dg_pOhvO?}8D%_B>Du5|x&1dKHs4Gm92L&M?A zb`ET8mY7yX3gHL)v9xr40c^VSHzgxvU(s9+$_D!WUNcKUR8&;AmKJVewSLoS1rt&{ zd_4{8swsf7MEPjmjBueZoiBUlYl1wh_|zW`D$d6j;wzCgIKVyn{6SU*e{vozlC|Z;ba11XLzKh zGHHKQzplmLug9*Rv&B-wKi}4pfU&dx5EMk+hLa*jZdapLuvj}@xe*2ZXh!i_Ad<_1 z68-e(b1W@h!A44hK`E53C*xIv+G^;G!FW7wJU#P;GEHX_H_q<~Nq!yW!Qt!8^$pZ6 zaa{zi{XSA6giDQoKRf-`7PH z%p~lRPbH!xdbE?Tu*sAa-iu4^)CIPZD2xC4(+^QV%>Bv&z(_2EPJUHmu@2z($F}&N zW3Tg82}NG6rO7QZr)(ZfH}ctP5=?TWuAXt9tnRNd!@2 z&v?K>%su+evtk*~6YY6Lb90yU&oSiiI#xd?Kc8JwQ!}Qco^b#u(feA~MJ3|HlnfCt zQGgCQYg8U+9Qqppi-Zy;(_oY8{g4XkPtnKwN-geO-azZkfZfwNg&Ho&csojN#v-2JzG4s!h+stJa3SRZ5JpLhHq%tF1tSbKM;pF#v#Nm!Sb$^D9g_cOjva; z_WpP-e1Q~g;kYj?FOMdzE-(K$0%-ZpliF$N%E~c>NipRKZ9*DpPnN#8nX2EKzG1R8 zdD{9jVyi2G{=#?u+x;q(34Eg>$4|MSz@9hX5S7Tvc^d@s(p2{f{_`k(J;CnbEL_5m zr;L2#FzNNyB)}~TurLo*-j5JTm{!1P;*b17(_lOA%_+g9N zINfy<$`wBEJCfk|1g6)Acw%!t&YWDYyazw>CsTQng@4YVU8shLJpwcV9JS7);nfXt z;ohW{8Pz7Km~APbL0J!I4I$o!Lyj7me4bx3^Ob=nD&v~s_^_07!&mq17uY+yBJ{*= z8Ql%FSzfQ6YgI+X%3q^irom=(x{(M+g-g>Gs$XL0adUG-atN+1Qwq@<+ZLC*-y()8 zr!04UFimQvo;gFj?IC+~clTrNCooWB6MR$+_&-;bm6a#kQg2e^UFVJ*skXl>ENt>= zu0MC#4bqm&KVHQYck<)tk6TRH6i4Q1Me1ynFjZxwQo3R5tB?oKh|JX-U<#W{T?qVYj`YP#>gpG9>NaydUN?NB1@l39 zUJcVTY+TtCQY-RKct3?y)7H>ZaUW3rHr#XwMUhHs&1W2M-$s;%>+g_bw$%0Q0alwJqVWbK}pDY7x*uj(3%ZMjspJ=)S^UE(5LRA zNSH7bymE%j`V+Al^j(|OMsHvLL5$qZvZ8ZlAR>99AXvI56+p2)>as;BZZf;Pp_*WO zP^R{H_chmPXjoHH3rZ2=wfPryHMQeTGm*qlFirb?O+09SmLRCWHaaqu7%1cD#nr3V zDv%>URU4*LM@I8pfjNK(YKs)vq` zKvQ*E)Xk7(@UAqh+A0Uuj?3d5#Qg(%4u>RTwz+>%sbQ^w^48;a;nzsJVnw^j^VQ}_ z@d}$Ds%<<3)0mU%0naBquexOn_Haf!x?K(<$`eiB*no4b5CsLn zuULIR3+K>8z_~`-qn6Ej-7uxfVHGvW^od$1Tirv38rO{V zNC=QHNG4Y@I3SfAF(_L3nBg^T0wPq#VgT?})|oRu7^iD}si=6A7RTrZaJgHb12l9g zp0@@1!KTJo8U0d*hd9{Nsz14Vc(k3J98hiGO}OcUUwSZ(1B~*r{by%kg0YMgBz+Z4 zRnyUlc^n^$b!lUCe#wi$%Lrv>fHHc_g)0`#-@HhStMcjmeD1<<-fsYv&R@S`ygt2p zb@=YxyJNw?r)vJWT2M#0+s@VT-k#4H4HG?afFHY1J-%HPQdKp;r_byQ@GUdU+i@6b4D@?L zcbaf4z&;vIu6myz0G`#C50N|!QxM~|Dp||`kdF}38JR|^KbQMdJc&dqb~(w+?B6tY z@@I-0uw9>(yySw9%mG9q_%@xnK7hRU_AO8h<9cke_}+2Gj$-ZN>UtPI=E!g| zVxpqmp|meEwaKK#2*>+Y>n^#wu$kWsps8gL(oR;1-V3GVxMt<$CxL0R4;Y5-lg;9|0n0!78X&?RZ}33cGY@_Thzt zOJI$`rT@fX)18fawXJTiC*3KAv#qmj&R0TCigu;DO+FXo;vx$*O>y(UJ%7L4h}?Si!=?Fc`thwpjMvt2tGDi!om=ed*5NuaB#xgGt)K?o5ib2Y;gdYEz79?(t0IdGS?& zfrT#fPD^-_#B2SW(o#m%Nd6M4LScG2+Ppez)Gt}F9R!piY`GNQZmlkGs>9HB&7&IB zoq$S72q8(d)awvJU(y|WDC%Gq0aw{%c_%Y~^Dy$< zmgi-a(i?_`N&c||!kE*|R%u6*2dGXu!if#_0HN9ca}r2 zXHB%p0qdEGg1@r4?@+Y%R1Q6&kiKyr*WIu76ZIZJGRwX_kc0l!oU_*K4K~`b3n#vd zLd1gR%vomTBR$6RxK-K*G$>#J@wuD@H?mVPWsvJtSI?Ndv_)EbFT6t25OB z^QzM1Z(XQSm9mJE)$j;!D7*Q2jJ9yTZ5(vjua_6ed=mdfeh2)}%EqH3NpCDsJSjA| zYUZg9f-lDoh34oj$1bugjo_Yveb)$AnAG>k??IyEe`4Il=F;}?N;%a@(=yq#p6U$IF1UyKzzYXD7@MWNG)A;E`3$mG8mO!KalO^^ksJt%!- zZ?(R@yG|=|&!TPJM_4TpTgZ9Y8I{y1UP^I9)plT~USro(O&-unUT8g?4(2kId8W=* z>psd0((=LuX}ESfh(rz|Q&JSvs$mf|G~+6U&IK)(R9jBQjmg84x8g+UozGb_G!&R5 zhFGhdsH86$kkUJUVN%Vx2?<(b(!Z90`^xlN9)E?+XE{F$G<<~_geO)r?%ij9=L%Du z99@n#N3gUD755G2%vDoRaBErMuhT}|oqv7#Enq(~rHTC}#nP+{q~*wOI?Nur1|A9leuGI{#FHmjFE&(BulYy3B6buNu6e=5>$R*r;0QF6 zwD84avJsyX~#F#GbwLJ@R7{=Uu})mk(2x5#Zh3caJ2L zap0LDtb1mc%(M@kPZtZfBjxP{!;z zaA$7w5=iV?0O3BHICXV<>Pav^d&u% z?WK|{PbS|*nQ`i;iC^*pTI91TwH)?2ZOL8nKomSlnDub?(z|-HB0%1m^Zk3u=}S{_ zV?aVnOdx0hwFNG?>0EUk|M&UEuVH)jz&Gr`NQ3b+GcyfXBQrCXkje1nllpUy3?06Q z12%S-2^Rcjp8b!777#Ikc>tyMuQHGve{xqMc37Z{X5CQL0g^3yw*0aWNiZ#WDT5jc zwvUfsU*fi-)NZiKdXP058Q1W!uqbELyO05Xe)Cr1X9Q(=u5)T-LMFG3jzMyyEe_8D zWy&GuGcDXv(y#zD^WO5BqsHH0vC{b6UqSa%%f#Zbq@cl|bn<$7tN7G-1UtgB&okBu z$mz;LJ71-DdsR*7?`wvk=V`G^<3&xj)+WJ20<(4os z-4JyVa!RrMpJ62RpYDbeV~xCC9R})0z<9X~@h>NwIRtzT=t;S0e@2wieh}|T#+5(= zC(9a6UFxM#e*QK%=vF{>BH#G-H%iblqMTIn?3x{9 z_r+U|O9GRIPz#-#HZ08hS1ChtRK-bofB!w~=!E5GIy4XQtL-vVK>R(-Rg2E2I4*0k zP0S+n@132a_Jg8BK*`h71HW_`U zV~5$Dc#1M1gTWx{_4iWBG>MD8(Q82I8~BGq#zM{RymPvB`n48N@?Iw#)TfHJUn(pg z?*C1AzCjlfyftzwx|7@FBf}29=yqX%#)8HU%`UUNxN+K6NR2Ti_^JJtyXvFEF_2N& z=`!0faAHS&-$)HFkYEEDA3LbQM;5#k@Vxc}C_M2_dU!;{L>fa&b6jvEC^r+=(JGJT zrm%O91R0+xZ{@N_zdQ?*2oa9D01F#s|M`d(w)avr^;Q7T>@-ZiC@swd@euW(2fl>pl{iEdYX{9XgF+js>jsS7w7CQgN^a_FhQBt|acGg*~ zgD=#DZ*zoN-sxY4j>ltffaOt?Z_ChOwe_Fp7jSBz$C%ta&d&mIR1nDfdiP;aFD)IY z#c0sp8(#0nXzf~Qd0D1BGf^FfAuPfZssCST-yPM|_HCUYMZ^n=LVzp80^${EdX-K9 zLGgm1Tq!n!h=QO3A{`Q{D4?PsMWrZSkRrV)B@_XX5*08~Ly;OFw2*|HByXRn_xp`+ zjQ7SHCsvD2`v{X@(iH=EFwG11P9ch1d-o4e%L7v$nS-jIc~wApfP&PjT#d z>Sewjcl_}sRx+ZQI?U+#yK9V|!yvOhv-z|-qAETF7m#`~T zkCteQ6f4LG1nD-Da|P47x!L$lJtSv~(4HER2*4#zWVm17z(lr%`-a^3l+9XU(UxQ? zBSi=<%ziNQ*fCGXw#WIB8S`ZH;srrtku&5Cr?yX^)l@}9J!{y(9JaL_{;u}e(!wX^ z$!$fi{bgDmS1+r!YFrone#V$bP7cF-PbSjAyKOhfhPvw)Yn4 zZc{=beWg^(&gFLN3{Bv+1w}JM)OODyZDY0BW1Hw7N;-ogC8?(aB{fIt&980c#vFr>4 zt|S8_bK9HvsgQR|Q+WuuiDxywv32hI>y!l`E3j}y7(TC8G92zmhvAy$7dg;rTx#RN0u#IAtU_jhGCo$VvzM{iiDMsRH;Xr-%W2 z9{@9_op~YwFq#V~{X+8_eJ3@B66kt7P6R23AZQ*E4C&3Yoq}E#6cltwoc)2qdPW2y zE{bw^9OOWt-6DLA)iK9%&c3>KlV~?Qz*0kGRQPyik*CPumcg_sJJoKLX>dH9gvIr( zs^+B!UE03ly91F+vFeUI9ovjUAgW$m6+pOf2b%M+e$BTznX*=F0SSU%@C$al2=oAJ z{^WgOefm~H*t{x@etgYm?H#+=H*nS+RIAqXW5JrdBtvm{Gfcw`aFh z0Vfk>Ty`s2S^}TOCYA|oM!=<}M~)yeGcyqxY%0Gh z=d;@iGL_5KXKu*hghg}NX8pG`HJgY;Mstraj>9QoOD`#X<5=PGPVUZmIkJL6LZABs z_S1+zSMm%=#$!{|spy8x@NQ-IbUFqD%87~tSeGRoElyVzV`UDXDEzHW`jXP{wRu+^J)GS z92LA#`-hlV{MF`kH}0X6^*%x`kq*7N))izo-)uN5YN80uRn`MRbTX(Zew#TVfy3&+ zr+rZ*>S`eGVQFDaIqKT#6??dH)ijSS%HRk5S}_b{^34k*@kJO~L{RozBX1h5E~r?7 z%|@x~<2+M6wRlO#wQD(VsKv}9pgQ1!p+=bSR+iglzu_AH{a@kJCRikObi!E#?tnRM zU<0~th|I(BI8YqpEi+IdlXoa>xR&y3?b|_*y1Fd-EI=YEzv{7>_p+bi^xrJ}3wO2y zh3dgqKw`DEbmG_Il_dB`TOE)ztEi|L`|^)j=*P^@`yR;YJuT<8+rbfRj`IQMc^h|a za^U-42iv3+$~g111m#yGzgTt?_H%RuZS6+Uw;dh7+?M|FwpOE>(|h^$zOu{7%WG!_ zeA1DEA17=B5hW)lSD}!XpU;n|VXqBT42vN&hHn2oOb0siZG<#%4&Is$e-tye6M&P6 zb$B1wtJJmFiP~DR4G32^lrwIoai1FQTEOfh=_%hTdy^@83LK(AdbWlH&K*lWMB)MF zcEkw8!~(Mj{58TFMV_-0vL7S7Yk_J$=AiTw#@$oh7BGLRv=(Y|a@O4@DYU1|Ti~CX#ok1`d;l^lW=_t;tEqkQJIgfBkT|87M+VilEG~c{w?s zCs{1k5{E^-JoDurX{!2OOzXE;(1Vu5aK8VlB}oqQk>)IlwUkZ#{TMQ3q3gKgeyf30 zouc*cg}}BXpAGG(fd;LI6z3HkR5>|i7#$o-xZaH^1VTme6Hjp{^gl&r`jVL+Eeg{T z%`tY>#t8>6i4F=nfPT+UC+A0^@T>jM=ECdvV-OYlC9$bR+NZ7+U54%(=yRQoD0d@0 zRUtjhJY#F?TzfMS0@Ix^FZnv25xyug*dpe%0NoTbzR4~7e~Hw;GTA;&}f^}dECtkQ{2o!1DzB}?lB^Va-y-&4rNF`=GBg5%1wijeuQ z2>zcaF(`&Wz}ebmS5zS`)3$;vMX*z8caPO^0j66%)$C^N?@hUauI4z4^Dph)>h0N% zvdde~h-4(QOK&TCjHVwxI8((pqRn}9BER+pzZ=2ku|<%=xx$d`coSiJoa()Df)-j8 z<13*`NHV8y(#%6t(PHF6ga{Y2tb?rDpIalM%ONe=`80tW*}!@d>_I;&6|Y}cnHDP~ zFWlR5_3$aoWAsR!;9L~h3_=|A3DN+S)FGDheRB&%P8nYE`EN+SXuOlSD%VeYlrr@X zL&-P>t3fT|8)?Q^pFTJ=zH3s}2H}*5Y3ILAcaZMM8Cs3%rcS&n0L_YA~#u zgZ3J3wdY6os$d}d@zx9)Wi_gv8|%o$?qAD$Kpv%n-Xc&(JYaV!EG;dqro^vifGN|@ zuz>ZEX5iSeheQgz<#&&)N;nU^GKy>jJ-Zm6SPFd^Ev86MLzko^*7MlM4Jn@%SKB^f#GdGto zFAov`qle7Qqp&t#d>_v|@n5#*nH~O%TydT}sQVZP(v0IBiSYJu7K+&N)+K4zk1Rt; z<>I^Tuho7yCY=>R0{FwGrf=De{=Xq0Dg<0ZjF)JDvue{v7QYgWUWV|l1dgxaoZi-Gwj1Fw1CbaKt-%Ja@n8H^iPdZ zWK*pc^nx8~-{RXnwSe4^deM1-%;954PHPY)11qyR6;u;UhUw$D1yz)&ZAi%hC%H1lb;uM zX1+9jiqCz?|F?vK-{QcPekj41Fw)?jq~-MmtBDhfRqW(CEg61+EG1X=OyW!Iq|~{4 zB2UHvpsDsZ%>>*VUC`|epye5ECY-F&gyuBZeXWtLSqGuy z+I3c&n;?(*^5o%h0$m^B)M2({o8T}%H8t`XZNUeIz;IK@@&D!)8c6$zCsDPMcEw2q zM>?y4)NU2^gdklVU6|C_K#slmWKzyDmxhnyKk_6CBHGtQpZv#baqfyghq-m6d&O!# zS401KWA;>M)-*OU5^#kbW{bhg>G2{m68rF;XN8{rdmI@w3#Gl5tciwrmXs z?5FszA70IG3bDl;+grSLM?9Z>?u7Qz6U_zWA^`D*cB(@0n#R=l#8ko91pV=h9D;Rm z(H?qP&K;?2FN?NxO<}8ib5z0O8218K-vq0xRtq_Jp4g9U#UwY5JwAIEzf%=Se2Ac0 zSX}97UqGsLp>BzVO#C>pyI6pU|B@?MKwcV>0cYt{_bA8VCWZSu8E zWfhf${n~cb=7V-$*QV^H|JT#ZS05&@X7NqkzJvU&>dV(D(8-6W2lgL_Y!cu!U`jFK z!*Ms{!-v=ll^&xs)r7>v{`Cyb4UmYH%MOT+kE2K_%5Zki3%aEV3%lN4(g4mK&o#j$ z0Fc3lf?!<_b(k*IV$SvhKpz>^)wd52J{vjw_}>V&B)_ zA8nSTA~1XJSf*ycs>@fy5Z?1EV}|}RI&}iP81y}yfwRzjwLJOfy8hyzPq=@(sR9#d zgjQKQ&4DE#OH0sv;~#$kRi}A2;uDa#_$6t>os6Xd@WZndidUVAXqch*anK8Ai#cB( z5hooJn+OV@)ij=6F2G~dpSxb|1O5;EaoTN>z||-We*0E`0>$-tYF=KR$oI$lfpb(h z)v$tATK6`}pKvCpI&a$hBeP-J=Y6bR}$o_z=atdvB0b zAP=~@7zsAod*VO~=z+6ut#mf>Ap`|OW@q#1(cu}g)2jCPTN75sT~0|uj*BRBzP0e6 z2EpJEII)yqoD}5*Oo6u7jHJv@g3@cth=^= z=a9ZLtXuIblu6DZE;vMF?{eF$^3&AfM!x8WnzLb8jjMn&36KDZPtdA!O$4QqTxaw5 z-HwZoJYY&M?u-G9$#;bEz(lo%N?B*w+agt0o z9VHnibFNt~f7O2Tdm_%6V<5f=kPpk!xNN&bE74*+E6#gB_)&?YjhpsLUKZQW9zRje z5qn&p^(BGZ*KS*!b6Yg6_5cxs;R_0|pXI2y2WduH5}!o^Kzuxjl{)=9X3N4dwKtu5 zU=CQ*g_DTBzLscyZ_1-Q0VBK`jxDv1-31Bs@d?hQ7HxI zRmndI8AqF6@@zZs9^;V~GPFK*Jj7Qq`{3lz>ZU3hB@pqx=9zt{qcZ-c=Pk*KI@+Zj z;q4^87wH_MWueC*w8Qoq>5H~*7=o=5!GQgGaQiP}K)H0A+5!CqJ zG^*1TB`PZFxOm58QuV=utFhS6m_uwl zUAUaH!Fu!onL-t_Bb)4#xevJA2^;0=wYg`(`$h9)rHwJ-}Lm=B;aHL4JNxu+7J159Yfryo0AB*jnW+!)rM#KKvL!H#lwB z2>mE;AJ-jD{al`n*^s_ykFPpu^-d! zVdb$J@Ca`nf&Esn5N=%RsS9%^KHZPlic)P^TvWSxm?>9E(Rv6P#^|$~GqLh|*0@Kj ztMK6D^@5k5%%DzKrUzL=ob~UNNH)6Za17cXkz=ULvu=;8@CLYoi zj)_|wn?5iNa382_I{j?M{?+96WIhkmR02K`O>>G79S3y14e9@35qbt3p8?^pspt5N z_DGP}h@{YqjB~&k0Q8RSdQ~M19dPMY2AQ>3DHv1LcJ>uhK$NEHW3NR5K!LzuR(_iV zXjV&RN5rK>0w;x1XW6Hx!9w?}c#Zw__|ap0T^cs!4u-Q?B2(4XT<%&|a^7-q2{##}uVXPgxRuN@y||lX>10Mbe2oSxuu=_h^DW5di4KM+8`Yft=7(I8Xzpq5oMh@^D9)p z0l$$B!fl^Bg`IoZ8jIVEpv;65c3F$t8r9xAcxd&eWE8No7RzTeA`4Fv{s@|`1PM*Y z-fco2rM-NJvhbap_RC&gr9FmsL9uWR=&RH39T_vF)fZe7LOytCIc6^%H<+K1e_wby zo9qlGTE@I)TjCi6LhXXT6hYAb;*Be8k&tDW^F)XVCPk7ob1k_6RJSt%ap3Te1=a>5s$9+^g|ZuHj(B5|+Mwx{k^Jo0 zQK>sK-bDg|MJ6PZ2Nc!*@YF}9_jZ5Jjn=}hiiBdsv1W}ubi3X(4 zqPyjgZp+fVDE~|FZ4RaIcLYqm2`?Wdo)>a$0>hapyaN_ga4a(D_U(v(+O&1u=-oXO zT8Et7c9XXysWh4qHu}fZK|3pjpzrO+gK*HFTI1W=q%&N_t_#%n_n({9P3;OqkRS_d!M8EiMPQ-9u5mUhdRKJ+0Kf141ICR2BWEgk@mq}|)LiIfGdC8MvhKu{v& z@TF(L3;iALQ*ZM5sUAWT&WU^&&RXJ_m1 u|NcSC;~P_U#Ujl&7H`;)yamq`xrqHJr1M$B8+<1R;)IEXae3v(NdSQJ?2|UccAx53`&(=U%S+KG*wwy|3$dYHew@ZR@VB003+|Wo~*N z0ALNAKfW!{k)!)Rc|%{K125Y7nBMeux_{ft=eDN@0Qjd>y!`3$P)#hnXzoJVth)=~ zyB036BUU}Nx&!X2D4m%as&gXN6DN>(;=q#$&9mm_>@^Ii3#hc+b+O-ldC=DcU7KN}71Xx3M_0?emhio3`HtDK4Yb10 zlAWwi#VzN@Nm1^*vu5(uFQrcvd(_&7uxl)yR00a%UP0Pyj2w(z)fC^=N?lkR9&Eof=Unk|KWp#r zOY344Ne*tJRL@qK6S3KCi*?%qSWeEC>sJ`&OFgfg!w}6^{-9#I-R=%QX}uu`S&aqA zw%{e`BkD>3AP<}}J$}(YZLtpHbCDQA1b5gS6WjZ)#Cf02xa9G=lReG$yJh5dw-|r( zn2a=zs($-JYh^>(@X$M7+m_#=H7#k6AN(jBDX=>A>PD41>zGGn6Th(N!PkYc$}QnX zcXjV_6PS;DcKQzgX=9|da|728w))zYk{R&>}EId)vn(4j4f{6biR`W+@!s{QT@Oe}b@aq*F{? zed@4)GuOVy!Xl?q0RG*NwZG<8Xw&e)r>qT1`SQ$x0XQ$T(X@;k^Aw z9r%0E1mCkM(>-F{sVPigv*Cc^1s4CU8>$JL?eE`1)7i=O=Ju)0ujc!%b2_>amH5tT z?~#uZvq~@zx1qGHcaG0yW6^Y%=SYizZI3#8#;t%)o$bk{O%9d!pKLHQ>uRDOUQwgZ zWn(MvuD(~}l*85$qc1R)=QmRVay|*G4bUs1vZ5>!o>^s!MD8dEAGUu|Sf-7O7 zZz77_rnk1iK`%RI^HH5oW>af@Mu^980g03&p!^+wfjt&%DHR zQ9}`7RpXNJp_MZBM~c}e_SyUp89#L4)@;YQmWQ^aXG;h@wkTd!KgTLG+OQ_r0El7d z!=X>oqIXd(Q*t)%s19?~CT53AX}trbg1jJ5!K~onSYy7=O6A*XX4MT6JGqN?+2xrd z^K;Nr!$gzTnojYk+LfZwoAP4x8Np&cL7(Jxz zlQJu1JgJCrc!^CU{2&p2KDtn}?lg^;OS!iaJyqqu@`DkpeIf!(bZE!AhWMIsBM-%8zbLpW7(EksC~RkgH@BTTIUi)5Wq0{->lI ze`R^72jdpA53?>!lf;~uhnaPawg!BQ_bPbX=q+>!HII2h*usO`jdyR%@0g@$T^Z5c zJ1Nna29&-f2C2LadWyP5d;NCH?n`~sr#*Rr^>uVYXTC|J-4)qJGgU-JKHYYu?j^{L zqu^0ZW~x?r6!gPSt(ww$rMG(fi!k5E`hRR5atWbhs<#{9Z`D&SAlO!g68>l(5}DRf`+o(V^Q?sYUiwFbmusOwL-&VrSZV zHvKxol)81FX*J6vXfi=6>Gule0ui%kk|K=jSjFpZ^&xh?Ibl#IHx=wk`{i(N{YRm4 zYdm`?!boNrw;@}i9Be=<#VH_XJnBI zm#FIB&+e!fDe>I<9DRKZK{-0&Kp1WJ!_5ABX3Qs*kBnYS~fLM~avs zr7yEJKTj?NQV-X%m_wH*otSAu9#wb2GQV;6+Jb`MXX}`=Z@|F;+;xw+?DCgZl~{5S zz}#MlQNpkR%kknqYTJf{F_RQ>`YQAIOWaMa9&q4QjT8Wo^K7|+2WUSD!1<`*A`T}G zB=|3=01c4ErBy;z!Ls$d^#$8{HI^rir4Nj$Fb@M`<28k_1Y1y<^}G#>_QvJYU2H&d zEXmCg+XNi%_?6GLwx|R6$$(4(2tDkZ^R6PdLd%%--^Uh;PL?o6g^lp?$ zml=wFzU}k`Ki4xRkp8}4+nYy^h$HMR6qtzdE#=%GG=aUIZ9vw4I3ZOv8Z{FY)%K+> zC{xu8>TUXwDozk!DT;Uz$Hr(;mB)abS9%%~b6WcQjaVuqa#6-Z_0gOrEAw|=1^I$M z#Km7K?z;BOKm8zVmgN{^gzi$17w4A*X5wO~QA6Fw)i|)8*csN3zCc)xc9!IQFN=9` zPj^b954QWsjKntFJ%KCX;AQ)r8vKA!pyV0lhz@F#M$Rhtoi@TJY5L8SLu7(4SNX!C z>27{g1NK4D_?8O=1qG6_vVAi$dJhC+V`B%!fEy)}LNdBy{(G;@U|8$7d;0tLJ~JPC zE3Wi`u1fIVD}>yT4E32*9YW;9%9(>8$YwKM(rx;1sY^sdBV+wvBO~s*yrIp_&0Pp# zo!7{8TN;lTgukeZUhlQ7z9 ziDa$ggK>Ewq38CaG@MGKg<73|{UqMGbEh=!QUW>Xoz$o&*NaAvGay|5F zwBHJ2%FJCL2vYQxV6V23o)XVVvZDi;Win;nF&&aJGEFjhNv=w}fiY%4dafd|?8bh< zUYzUp<*CGmO815VN!GbF?mL|8hh%v&JUe1z>CKft4zYU72jGw0Anrw{SFts3P9wJF zIo}e;<#RuDZnDC0pSfgsTqE_{w{On=W?y6DvZM$<&(Skx;XQr0olAbcVmWMb=}RTx zTF5QM5aa;#F;rDXtbO~|2mBq1XnV7;wn*FaVZ<-;RbrjRZBaX4-SN}tG zd5A*3Y}Hf1-!@T`*}Hd;8xVP#IJ>meCmZ-sS0M@wovZjH?)mfedUN_!hWExMue=QL z#N|JA@YppNfL! z|4ZabHhhO^pB2-Ln~NG}X&iG+_mLFXod7d;Qq>1n4|fg5#}f|S5D){p2u0f(d-{t? zS&r7WE$LV^pu>=#^CRLdLLrCy5kKM$-&mrq9RE4_d!SP136?B>M9wc{?ucD?rBHUK z$Cm}|&>FL1L$w&~G&Iw5I>=ALSEzR5^$)x(^VEIz|W z^z9&rFpYgBFr<)MmUn3)Lpim;LJ+U{KRaq^ZQkAN4raXJuCDrwqy8w} zNIYvj+H0O7g<1PS$=VU}Kc5DY|{0!Fxs`V{Yvt zH${7H0rEfBz&PV^+0{4Z3-}$*>)C~^f+;%&d+YK;WL64Uqt6TY>IHg@RbRDx3SZsP z01=dNOJ}X%@65twKCs2t=F=Khscfd`bIox^95wdlVb-~LR3>U4Qh|K|TrIMn_MAg~ z-lO#KmAbn6994QRs}FaNU{bGQO`k*bpf0{Jq-&NTo}>NPX*{3C=Pyb7-;`Jy-sE81 z=2}so63}4LVK+Eh+~4!t@?{V`V_R{()RtZXow}}VC!c}SS_`?-P;N#=&9xkI!@tGs zmg#+i&HMVzmsQUhNhRj?AKi5!RByQUiHUicrN-f3R^vaq=jJ|QXtqF?<3ctU3#I`v z;&%#+gTDBww1^k)GV?p`3-q)HoLld+6BvkWSnZ$$DlZftUY&Tw9lZL5NL+N-=FUuypl?^#k=1CkZuy+`psPWh(r-i;J z_FfUwGYR!1#~TRoyap!F)!X}Ib#*n3W@2J;P*t^R7_OCC7piW|x3K;ECz)xW>I zBj!pQW<{Y6v^d3Yc<9gS~}_Ot^zqGdlM!4 zUVzMyU*hTN>PlGCtE)q9NmzpEo_z>(m0ah(EF|5Pg=XGdE1JOfVh!wauzco*SWe(A3lZNKXZI#wa} zq@H#D6 zdiAQDIMKBuFYOKXSTJAoEoA$YCqi7UK%caZz}I6Ob-ng&Y+ zF626mlmfx`ot>5v(JxPGo`)E-&0YWDV~5e{sJKni8i+O0g++(>l>NY=Sy?^5GOJvR z3O0^UH9~X$c1l|R6aE1$2AvmTz23g!u*e<#3WaxLf(HAIu2pZ}GIfl--oCaVa}w{i zR)oTxVi>TZT)(+nS&n^xLH?dTO*c?50^$ymKf^=5u$5oFPJ^jLc`J0}U}&vw!CQ>;^8 zLP>?+y(v1s&1_E9AB>hdc94wwIhfl+V9@YEs|<@!qw1A4h7^p-P#PTU($V&Jd?IDk z`-~g@A^FK@(H?Y(AcwEo(0E%2!53cc0+unIN&;_$nf~nHOg3rMKjSW%I5~jZuWDa-Z&C#fZSk4>RzNU>sfPFN;166=7OsCpWnZ~??rO7Y99~c^MOd8 zE*y@}n}_8r(LSE^W#+OTo2K5qdDFEpCue<-d-ajIK0vo&)OkeK7;gJ|JDEUIA#Fwv z0wYD9RI=0~4Q78^Tf!*-2!(jH`%dR()uiJu<-U&y`_22k1SVJfb1N#2E;ycTiIXvL za>_Wy`>U!{+h^8#?1>RX;<}3{I5b^zeqrI6`93dvl=yj8vS;n~2)Q6Z$eziI@SbMG z2N1+yK$ZmyJ&!Hg-LMi=>j~jckkGfzoZ5YMeZv2 zrnmRgS-)qq0jWx0`|AHPS|pA@Ij%-aDA~^$v{^Tjl#J_>y9qJuEA9JP(_ zkm;3eVU}mkaG8^wFT$WEp?$Xwf3gq~dJ0bYz!eJJQu!Ia4o-Ki`NZo;h$;f{W7(PU-)UQp3J5b|f{V52*rs^~ULX z^X#nalFA$&i~p=rhu)pGX;#wU|CfZ;&!g1fUsAr41t5gpx%AA411*}YjEuQvKc5%u zgLD{*jQ8fMb?OxXj85C9ZWL!g3)f}LxvS6S4aJGna{o_Uh9q*j=VOvAN!qSBX0K{sjc!Xng7MqT>W<7?bT7+l}BEKY;j z$USH*O+f)Rqt|jn^GF|~v(J>8-r} z8<&}LFl628mY_CjOXb%xg4)LEzkQl=`UFElg<3-E(j+Fnle`2|*!J_bS3yYIWba(i zIvaXPU{`cg!kGi!_(m`7E&9Je!y7hL)6w`hgeFNfR#_J!rvL*DAB-V8YygYRH_E0$ z7Xu_8meOoj9uW*9Aef-P@_3-VAq5RCK1I&j;eVUHdiAQE-GxV178YI{zdSy10%+*! z5^ig6S7`}_oV&8bwW(je{!?QrlAm8-dMfhr1g58_b=JzPq0{N{Ww_i+* zD*|wJb^RUy%n34y3rN%7%)9^rBgSHkZ6*pOq`^|gL`-8X-er8)SEs6BgqvJNwBo6C zy|~Zba$gj%<=2!7Huerpxn>zCoG%V)2BdqD01lY1$!1e6zAb- zJC7iT=dI%}>l1`pzuUI86)WV(c^}XEIfq-U=m*kEy}g!exo{e$OvuMlf0p5MBkSZg z;f@|}ei&1SdtXohn&AzDERq~>o5+V@+(jiivIFCAv@FG=z!;c@j0f|5_|3bfPUoUM zZ(rm?6AT*S>(}>Z8pwT+GP+n^as1rsf<(K#R0vl}Ud_S$t&05xoE9#AQ*FaRD0be4 zRz{Rqd~0jRhLo#2?(Qcbe3{!jt5=)H!D9|qBI=nMz&fhk`!ro`R$5vg^|NowK?@)d z7saE@%oVYMnZ0F!xGl*v2&otR`^(cfwTFFa6c&E(HbE9jV>xy#W>D9#S zUA-%L8=}Uwlk|huc^<@y($f59`TUjZ*&~jBJ$hZxWd{cp5k2Z@JD0*%tP|&+oM*EWM;eeO>0;-=EndX=|8?KQzfKa-S!A^f3d`s8RQMi{wjA@cL>A?K zH6B3NM7=#Y7Hr2QScbpXl1w1< z3g<|A+f+Ec_={|(*zQAFSkh3k<;nMEw?4shM6V!PJ%)}M@F$$#KwT)={3I`~!_V5Zs!9IAJAwG~g zhW=N$v3;~%V0y-C6R5ILu>|we_B+#YU;B^Xfog6~5p&g+_a~yyh?c3-#NMM$hte$d z#bV;(CLr~v90>!w*tNHl2NaLIKE8<~xLvqsjHR0XUKi#8Jsb8lp@$_q5j%)?9|!Ie z`wQq{RHqWVbVSwn^&msUGSmtnpEu+lp)Gbarv&v6*w>;H@r@0wUin*b**qynx4f}{ zWoANZ(B-J81oO0>=G?G9iANs|!Ypvt<&46UN;Npwv8`E-d^fPplF*G{qp@P%U zv1@LEWOAMxPND~E1U{dWV6g_(_%RM0RdD(}5V9u~rXk`Bg z^En=y2&~1X#>K^PnR`ANF1f?6ru)i+X=WCtZy>MGMf!zsUgX|18D+j-_*92>MIb?& zz{NVM@2-BpZe^(Xo7;x{B;y!b1y;Qi)9V>hE+!6haxyv>_-GGdN2K_A(7MzHtcyc% z7zaM^Oi5}z?e}n$Ws4y5g#Ma?8Yw5V-|3cpYi72!LS^^SquustPgJdka1)a?p zTR&A^S$T|DF(xN#F(IJZGj&GvX<`nnW z&fW(aUOpEIhM)`r!EgQ=Pghs(x2w;-d$+qi{p8`R5oSW851*Z;nO!BL4WPL97gONw zo$^ndNVb}Ak69g(aGkow1|hKd57e>KWaRwH!pbB()V5`*b)l0Y1(e?uH7JBgZBJj{ zoeRkC8$*u#Sx${xIKBQudiQ#?zy~L1(;%Q>_;dVNqSc@p<=JORNy&x_YaZ}~Q7-x# zS?;|X+onaJzvQ|}-^DDHT-8?GJoSlfFNk0Dvtxf0)3vbp#n{8Wu6GzrV8&qRLL?~I zx{GV1!#@Ot(jfLw95TDz;P5ja<^iNQdg#ZqByKndyvbI`SkC0dM}q7l#&0#J!?$ed z8VuAoAo7XPJfmY&<-0GBNuHKp12?(Ah~f9J?(As}8ECl9I1)W6v90>IaQYBkOH=c)+_nPX z8llnRK;rDe!jX`o>T2DEirITlL+(ygsPF!K%DR+Qc|%f@@4s3A{$j{*ocJ{3ZvXq~ z23U;C4Drw7-q_<(+`$C;R@$jjttDx~Jw@^EBA8wK^af8_$KGK8GF2q>gzH>+8ji>(E#+39& zv#_=em;FYQ)I4f88B?xv6;H6g-r_JTthMr$J{wEr+HesXSZh|Sxf z+jn>UMc4}ci32;L$GhH{yc6FHOrSF&=7_=vp&AAAuRP{Z@xya9C?CW3bYFn#Sr0!4 zp`Dv90%}Fl?m)xSr>(WNV#1V{rFxfJ7A!6PddoRPH`ZG$hg$OV>8Ti1)bsjZpLW{V z*bR6KL4i@@ysON;4{?dSCF@AqzTyDyjR*+gD%}$&`&)3gMT^K4krb2MiT;c|=t4{wqih2fWnv{IB~^y32&$rqeP`u|H8-Dxe94SK zcH=J$)hh|{`q(rRor4}9u9NZ~3tPXNy7KxSwOAj=M)n6}(zM(yih}97@-<9*Fv9^{ zYan~xD#C2Qzv$DZ%Fo~?WDL{LcwQ)X6SsAD3l16=qO0ifYb{8vunm^4lh&A&xW_#= zw=^=R@oZY+CAd8PXNz?b!EWQm-HS7z>M&Oy=-LAU<8<4U1#Ae{aHWdOpP3(X4}~2v z7#o=c@23mKU3%Z5JU1K%(BtCM@<-6yt8#!F_Rh&TNxF!`<5FgGX|fD*0pqiPY4Bnx z)speF+rqE4tU&%P&s+E1D6#8obW_M8S-46^3k|7;%dCq-yPX=dEnOLh-U)Q;%9BB@ z<55^LDi$X^kCFYv{xM9(Z)iqB=#-wX95e&LX{wawfrNUc6%L->jNYNrCi>FA9{t8v zz6nG3iL=c``7-Gsp;++QnpDzm5fHh6n`S)A19Ms7H~GGLrUIlI(r7KJ57X>f{FmT# zt9E<70$doa@&CR6o*4CwN>3`H& z2&^;fjvY>T&HI5P1;po~?oz9kjPV)7<%uX?AXFg<`9!8kb#kTMWfsxpS&b9&gNf4B5S_m9NdJ!!_dhhZk%ko265l*irX>hLqD4DR@cm zdXSkvn3v!0r>50m)S zWaG0rp+o$qr%g8^TP8miEAHN8d5Sm(MH>c=VsLFlch2$WS~QY=aO2PKjD0j;A)$Kl z_?8kEyeyP#z3ul{;c>$6liqI~@659In!TV^yhWWj@o^7smR7Jqm*P~DO+0%zOFQ)5 z+si9|^{3gpI|LLI|2Vu{==;)MkA!U&nwdYRXhzy8A8^vy#0Y^-&+wHo>6Ob!WJgFM zWWcI3p`xOR0jm6(>gu$-eH;`j#QH+_7D=zy@QsN9 ztPJ_xM$=gDMry*`hl;zL!`35tVQIGCq#=*zun6^4wJ!C{9$XV%r_1eozddO&lkk~ig<=9Zz@1S z;(+>R^iLpqT+Mz(U}Nz#2!C&O$!33xYIyqkP0uUGcA`tR%QHZUVsH-8CL8hZx4)Jgv*0 zyUIP!IyUV&#O-!SiMy@sm+ISqEo#ogJe@FLhstH=%fF%5sesg@;9R$k<41JwiU6)v z!?e@WF5H|6`OG8|e9^C)s%vQA)Sl!cGF-af)9RoY&SU2)na3p)d12#{!S!|?e?kal zhULz3VP1Oh*XOMaJtM6P0{;HwJNjUsL&L^m_bD&NgQM)wd(%jaV*%<#9d8!DHMuo= z6J2skF30`+`LmXA_CVs?Nq@$Jp)Gb%1Sb)}Z=}8a@R_RJN-$j=T94Avqelb$?reJB zyj6kx4Y^m(%+pLmSc-oz2cHrG-yK*mC^{914nW`T=MvY;wb=|Du?VeLRRGF8a{&b_ zZ(hCn+S79}i89`sC!+vBS&6d|MtT}V8=m9Q9xVYHsitSo#{S6OhGt!-&=a4Y1>y-=6w^Mh;t+(ash8s6ML;myLBvBejqYSVrf4psv7&+5ARFkOX>Ix7?(sHAW-fMu7rSns=}3JPi}69h$J`}TNoAc?S_4RNJd>{sq&mO>sDaK z$KAMdXRCr`?V}?uonsxTNBrmf3{%)?OYg;?*ahgeRoGqxL$qSqU91yt-nYOtON<4OdTnOX2Jl4Zp)>q&XK0}HN1QGu2#U-(NRdgu8HzQ z0;+NObk8U3ywqlkZ>UW=*GgFdR@uwXLb+BL=0;)7MHr7~p~fpxlT|di`yyk*W;0pX zKZCE1;`J5*a+4S6tvJZ65FwR%%Mhiey1JbBKH_=zg_VEJz57PG zVIp5nRrxN%B`)r{aClumP)N1V4i5O=pj{X^$JCI;1)pT(3`}TvJl(1EA#bY%CvGVE zjy-eWXMev7-O<;#Vqkwm zx%bD6e~ZvIR}31u4(S-zEahggBlI6QP_ui5$BVW3MozPspG(J~07Ed;KyY!_V^8G)>| zS;`xrDam%a+Sj^-_dsQ>qFjiWVpW48LsVD172mJiW$H_VGc7K8gY917qb zcWCO%@b2>KS{yEOv2rE){0rc4DBJ>%Ntr)>tLB6_0SPK*aFBjff&%+lw4&cy1LSz0Ib+(_v;x#}A_KnccC0 za}v#6Rqy)q=rJFnRIN_h%uBHPo7RKmqG zL8u?`=1mb_k$6bhTQ&hwo&nrSm|imUK>@ZuH1^FZhblOOMCHrTaRNKDv$W4G&xXaLPz;C$R zszT}*7-`)HE@w)te*Ado%-OTk%8$FZ8i5_F{ryGvXZ!|4m!T5)bVW41mul0Gp}Ra_ zB)$X`4jd?(g7oBBN!gQ7LNY5Ws~CL8@s~eGMmU}mI?(lulTYH2`M6%+B&sm_B~8b> zwDU*Tjy;HViAvO`GG;ZNXQ{vG)=ng=tRHoajAj4sXHVfo&SWiUyL3vsF<(2}V=Pup zZVY*vT^*50IpQJ&fk?5FSzy#~jB=KxKp6WgS->v|MM-U7RSzgnW@9$!zPPJ=|5~yN zwXp$yU2W&|oqEK@Yo=po?Yf@a2ZEdoZ>9Tbt7o!_yjl28iJ~UsGiT1|M!jZ#-N5R2 zA0QqHWB8WXH(P;F(1ot)nn$wku#Q(C?fo8ck~|j9)<@Qz@_?)(UNZ))yGl?oiMGEN zc1|3&=>g`lQAvc}fKX%k(tFUT?Yrr88^}n&PK=*;WH5CVdsI-;3KRhl_OZ+Y{_O89xD%%2?0DaW~sEZ#nFR)D9>C@PT`W zIAKypt)A&nc?KIau_7%-Sb2T+CM~uk=pZ+W4ScUUO8mq$=tH8=A)kZtG4+!a`z@O< zVa=p4qsin&L^_K$~^pi4kom1+cfL^XySG90eoVGFIibWxP{dXCS ztt=#)BoW~6UO-WH{jjfr{B3j@+3EpH)Z?6l%-4;G#dzo`ru!n-OiUgvN>p>uVb5uz z^IbV{d0|}qR$+fA2c9quZDI&|u0eUkZmS3GKVA{K*R+9aP{M4L@t@Z}xKfh?f7hhi zP0C>LYoZa0R{y#-V~9o)cy;*IIQ1|^`1Qu#-rhm)$?IA6F5`?GAdDJvG1Pj(@Ax%{ zHMa8zM-mY4Cp<@j4V8zS#mE_GdNT5C;xN|-$z<9(YA@C4&&X0i{KIa*UwM(!VYV8uA^FURrNa-&tLa;3<16KgNt|MXi9f$l93Q=X zotv)*(oYI3tzYo6er^b?l8qW2Eg_$Z+=aH%`nG?c@rp`XStD~EsHVKyx(aRcM2y2)&*1^O^;vOq_YNfyCP zM-mqd1t<5Jd-wh&!~{hpfnL>7gdQaM{q|x_(z7vyyUaMDhxQLBBa%!kDB8YMFGbXH zH-;wHsR=I|`W0mA|0l@=s-4$yra~oUBln$4{<@)EFL1eS4_=vsu6VPQV(1cNs>>uj zxeBhWs~aT+El~s#7 zjh&0eS#N}W-0)_#Ull6ETmg+o;NR7kxg@#cy_mcuh%@7cMx4W+*oTJUd|rZAXp;Vq zCsiXuu5G2jxH!k}vC3Yz{f28BTv&MU>P^IMC&B7;mPm8M-krFmfa5Ky*X1sLn8Xu_ z^kno`vZ`t!1-A9uKpFZv4^*0tW!^}X1_W#~u!pscNPOJ;1i2Pi|McYq^ zgax^NWFZDJW*nDmiKJ+f`WE!`#EEj}nLJ5u9M@53h2l~E>trjsVR5Mjl!jD<)`uL= zxvGf)#EzW(%}AG~nGC}-dZ1;GHRNTa3n-$Mko`C>&VXlM^DbZ)7_fOfveY3`UOg^M zs%7dXz3Hw~fEwG2b&Dtmn_)D3U51_`QiARQjs>9P=3`)eR5 zD9Ge0@Q)SRj#r%xy$O>(F$4dPCknLlq?o4(UiE}HY$$BOVip86Sh3>K>$gvyJ$rWa&CCDXDThtB=r)%VGgUI< z_C45_c&ewTNBe)>`JxsChvk_UgZLajYFnl_U zmez8jbwKk+ z_!Y*9F1&#YTi*?5c&m(fok700tKBFZC6{e~m2b#1roRP4YW2KCx!I2?(@2;`NLC`< zFjr_H<;Y5fuh26sck!stxc$9Q!{->!_MX5U>+h1<_KEA$2K)-_3WK{4C}hDDWb3uTKg1BZziQk&-nHZKRfWOD5~!{i}nqGo70&Qz@XTfZN zao<0PVy;MPi;`kmGA5M&`vn?2E%Zu14w^KPE@#BGY6CWTV||ST4fcyDyrFT2a|Ud` z7(XXG`^uZ>)%cC4PoE;~k&*&EZXzZWYE;t@=-EEkJs9kOX)y7++xe#b)eIS~&Ep51 zIgj#(3BciRppHzu=&OF>oc9S#5oVm%Zw0Q&oczp=CVnNo6Y^ICLn9hY5g#Cl>d4;- z?agDgo(kQ=T@>P|EKY3kO4VT(lHY0NEx|-RBX{==F>@p(bQzlVc!%8B zw11(pU1-K@tqe8^lzj?P}+UC;bF)RJ`gql?Z^}eZDvho*bGUb5@{hk{* zMh-V*pKCupdtcU>BEwl=PyrYkaMkPS0(3H{r6(A2@&yz|S0Y36bQ2PRg38cu#*sv` zKF_U-)@o%c^7d@00|%@@3I;pMHCX2`#Pxhm3woJ`cW{cJZy5mgY~zENmn+=e2FS_! zgTJTo5RJAPSa~fJ_R1ZWs;;T|!q(c+ap_Ljw;k750;-$r?B=u+4=p?M#z3lZl~ORL>aREimzUSR5ptxo(n!#u;TJPi zMO7T?db)5Ax))s|8!Cuwpq}_ub{c)1{-zS?O*DLtF7=fNlr@Nuu+8TN^wk689*E&$ zT2!(379Vu8A45SQ`|&tDtsne71{F5i=WNPVzyJb1Ec zN7}r8R!@;4RGFMRA#pGIe!}A4R~P0S6i$M{?CR>tIfa%5Ysxj5jcA&79P1#gb{f?J zSp#jeqUVnJx~g{-e7Fo%uI;W6a4Zfa-|41VdfFVvjMJX<7q0$9GFVR>!A6UQ^*pj( z0eGAWr4$nH*-RP_jL#TaZ+bY7@5xZDC?PJ5XTbOH@fZLQx8wX@fFZ^^r_XHD-|3qU z(l6>N*8_&bx*48R&^KoR2_3oiq-8bgBRJ*B{pnrM!;#p3T((X|1cDC@ht@$jBzLIP zyoBI_pS9-`Gy+j$^B3QB__8<^&EHf1^5Rnt^7LLh|L%Q?1Ea#p!g~-k+e76`cAbS( ziyT@iz<&ssfYL()48$Yod?<^qam*MhH9mnvJcN1?Idvu|)KYctWO@7i1|amep{>sQ zp-lOy?js9O9PT}%vsilBH{eG)ssJl&{QmKa-Ca*fUZ%#{$gaY;;*wa1>*5)I56MU>LJtqQAL^BTXuIUO z;tQP6NY&hy28nNGsb@;_b|8L3`M5}Z$a;ST5M!vq`_A3FFo5K!#I+u~yzM3s8aI9& zdMYpI^v(U3ulTrMWmI{>E8SpkgFFJae!#XbL)nmPn4WW~>*3+y(jkSlwbH;cn?cfp z#1)U4SST^sfBh98!FgJ+V1+kyW3O4%gF*+FQGuTdvSmC|BK_!bbxVVZL+J6NNlyfk zsW#B_E(7(1-rh_DRaI5^j^@yn@wr2+b&2PM>HDoQgpC^mblLApl&TMd@jhZtiDv6^ zg4(dp8ysiMAio9L8%nSpicqE=s;WIh$SW-Dd|RRxPP6*clku~fGnuKcpSF;e(p*4xi%r)$MLuShx?4V}egdE8Vhs!wo ziXe$gd3F6YKsFF&2@luw3)=Q>Jp|L)hrK@kp6-e1bh=%3-<%6hT`1X-h$3@NasaWMGPz&255=8Zey zx4Fc&kzVo&aDXH9&+bng!^PzjG!3LBytwW!BD7&Dc|~vy$FK~jYU2wx{TuPS)h!v1 zxJU=ulDB<#O($9o@S2`PlsUGq3KS_KCsp&QO~LkPCr;zEr^|mGw|4bSfj(!Er)a*z z5u4~8%0JuokoOg3_W6ESoe*6diZFC^VOx!#OwE{I7Fi0KjoDEm+^doGwn0 z`iuhfKpcxM;n)>;?ULDUF1}iL`OL7+u$p?`ML+%>aub}=kz3d-;Vz?1+iAdRW zb94a9xlcaM!`q^ZX!+9$^MYAv(D2O!aoa#GFGJYjhPtg&4Xt=S>^B{^CSxQhg(m9F z-G*Q*SOUVdec5nDC3FK*lP?whJ{%I#p!-5~dpD13A2;`}*kXU#KEs1~vMI{Q^ke92 z)kK$JiG%G{Q%4NZ*B8G&(W<*_<9i|JEt@SMDTgagf_A9ZsnAOXYDdyydaDS=bz>(b@pWz2f$ri7>MAl{JCVU(D7=GSueiJ_WD;AJM++Ce6m-n_;nM z)&J|`%HyHh+xS>Y(v2%FuWXf)RET@CWr})n?UgN;aYdU#mP>}2p>A&U8VS=PlL|N6 zgshWB#E_5}JJU7xC5FK;%Xxoi&|CNOzVBb>%$%8X&YXFk@9$Z@-$(iMpjHxl0frN%@orn zMohw3IZN9@?kOq4Vul!VTjAh`QPa&evx!aP&Xekw#-^sGVD7;1$srnf;ICiVVv?UF zh9`ClAiCa~8U#-{F+F!E6K;xw9iy*jsaPb2$Xqa1CIm({fR_C|<$J5dPgri>b4(kA z>9n36g_Uc7b18=>lHhxH`GyT+__>HATdW;PC_9d>n*@MVK>z<>%aiz9+kp zUgvKp`oMY*vu?ZpJ(Iw?i*j|^(5=d&jyB;H+Ba)ynnJ4QCuAu60`^i?2uU9GKn#XO&kd|a6VC^rXsQ5Tpk*z8>u zOtcFW9gkXEakihNM9+oJLk|}bLXTla2gX*!*yMI8X4Wis$}TgDQ6pdZlL|uH(D1>J zA=g!~{!c_g#b*TAqF=rD1-oW(S7~ZqrY+z-9`&7Mvf|e2a=J6Lzw{TMii*T+%tWUx zzf<`DkYoEK@iI2O7Q#}Ncw==lfjo&_nC?j;aq;jhTQ-UE5TYLf7Ps^KFuBFYh7`d~ zA8-E-!wr4J!=yOBCxBm|R6@^wRhfbXy;>BCIF1HINrU;hWJ=h9M*rJxB}As26W6bk z@|Z!Wjjg47Zlp2>^@dC<7=`hnq=aiL~!Km)r>mn5(0h=>M2d91Ie zH)P=i8mWjdh_|E^sf_R=PnWzRUY+c0qtS*}j8>nPd7FQaNGhkkk9F7Gt!QM4WxN&P zQo;J6S7pHpc0SH;Q3Eg8rx3W^Rwmye^g}<(A#i+@K7A!%8&)2JWTM>9Vt#3B&mj!6 z-TbweW>g3aXGQ4r^pEqy;k^;y5p8F-@kJe=$Yl{1$fwTVM0DR^ha>nS%>(2 z>_>-jm`P*;2O>vdiZRG(JE=(uX;BNeKqt_LR{)!QjrhwO3{#p=&aL6UM~A@i{F|!u zsN6LA*w~*>pKk{OH|xeZa=?7)G;Rwh;{5j|HW-`jA1WpD6ch!tv5I%QjPu+8<) zMpB>7lg|i6vULvKFP^*R{{0b7V{9vYUlU??kGkq8LxERU%Hu?*s7OaAW2GX#U>{a! z>Gsc*@*Jj@$b3#bxHIrq1y^iPE1P4+#Ao^i6xOs~l6ZeFqHpmn*H36=A4tsa>FjY=_iSO}t)E=Hs`KFWFR8A~*y21d4Su25E2hI{8|YV)fw1L$1MI!Y z-TQtc;3`*6NV2!n_tO;8SjM5^VVNBiRc#S$EuuTGn;RB}ddTicSt{sAeLZI7Olh3eG?*nb6A(~yKg zt!+m<`hy7KU3hGEZdiC6$~g2s&ao3&g_2CdjA9x^$Mjq`L|(`tUca<)<3??5?Z=fS zyk?|NrGE#yxZ3KMV{Bd>UTAV@9FK#ju{>;E7s(JqgeX97~Z7^SqxUn!?f897tf<_0g=`O8}6EiU})2J?cAclpSAt=UBN;d*4(kh28N<} z%5js~K}tk-|Mz}tn1s{}$LZ=^Tx|=GI)I6x(f!0CIkk1nx}Ga~p(N-eQ1S|xkXmuD zthn12@bHcsj1Zdlz)QQqe}jtkf}a3_lD3Se9YM#wA8Av$g5052@#h8X%QjVzlmTI? zY)wr~`n$7&Nh?Whn?A06;u2P0^yja*%>U;atA{L`zq@+2;9l%7NH$F^-rniwUl0%Q z@{$G=o7iA4uaCjXyjGAsK8ed-RL>F{ivjf3-ldwY3H%Ej@g1$TR-C(c5rBW8*Z>5B zK_g&oFXwONf$(XQDut&rEz}(8?YGj9pXWM{4p$aK>~{~3%ka)#d@#<<@qgF?Iy$P$ zy(#C~BqlH!PfxuoHebruT`E<&!*EuD@{33Kd8Cha6kP=ch0F9(tKfy1v_p@utdd@v z(T9>zu{Zw*qhlkOra{N!k$m~alml(A4IP~T(~5fs_2v|oU+~%7T@Po%jrNZylEKbV z&o)0|$;H#f7$@`9{hM~z@|R<^bY3SA^wmu)|HIusgZAs-m$^eh(x0lT5NF)*Stv!4 zS^xErF5)%PR%(IDZh3t@9FSO?c61!(d%5a7_)Okv$Mcllt69fD9kfMKeat0>I$=C` z6tU2vw8xXq+(l-FKHT)=vt%?WDKlq*9`9c3{4=QrY?DWn?Vc~7eiqtp^^s3F=uumj zI63?A#5Ml%i7HZ)714d+^RNcD=aoU&(p-`rRK2s9DRK#dx(EGXT0e=7KTqSAF+s4x z^Y*;`1uZO%YpebsKjlX(H^wsS%r*3QG0QNLhB2PX*gI{>67M3RSU3u^>13W*YTD>4 zu_;ad7K}9h5|SB@k#I34bZfp&686)uRj+!Rq0x8JSnQV7ob)H|&QCQB&vQo)p=(!^ zUxYP#6rfWTwa<6*^=s$$+LQhf1`xAjwn=DK9cz5k0MVB(oK}kXCkWsqv$o~)%Vn_l z$CwjoWa}yn_modc2p66mH-h>FJ4(e}O^K(e*LsA-pUHI#U1`-a*nO*h0)APR9;Em$P9UzC01HnlpmEvjq6h2sLxV>*C3F#ir7 z%s`r)bWSfR=~#d@2vVlpm*08xs(cmWq$DNjOHUv>=-4;3YCMR1e1F38$3S_d^~6i0 zqvPRnem-$gJwfwLnd=xxgpTb6$RlMMQH(SY4*(fUzTBrdpHQ)|u4CAjyc-E)JIOrp zXJTVM>DO`34F=xoz56IlO#Q_t& z@zprH3uHGAKu(F<>d`(I?neqD^gM{tu!?J!d;P=vXmWV5%0FF0ls9A6GT#Jq6 z{uYlMx-yV~$j_RgB9S<&EgYuS=_yHJL1`=SMW0w#d%L$GilXu~8;nchF=b|xKeAf* z(_M}c87xCC*mg>c(6AaCF7LPGpen*-w_D}cSji19kID&Ae$tBkt$|F)n)RI@`PAQd z3J9*^z<_{1dC>VdqLj1=7-rP4m7`q>R&8p?5qoAtpBbq=2RgaAEJObhVjCedz>2A; zcCg$I=fRtg!%3=V6{exbWzh?h=&HeTf(O$&4|^lw{`HH(!QrYn+7B-x*>%ERKaWWBjx-%pp_|Bs11xS z1Q?%k6bn(Qr*O=4)!1I$5!nCf)zo0e@qMmBjLC jgKRk*Xrnp2fkX!E(bnD^!yGUf7h!qA_ISRjXY{`TOK+yB diff --git a/tgstation.dme b/tgstation.dme index 2d0a2b9f9a5..2b27e52898f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2218,6 +2218,7 @@ #include "code\game\objects\structures\spawner.dm" #include "code\game\objects\structures\spirit_board.dm" #include "code\game\objects\structures\stairs.dm" +#include "code\game\objects\structures\syndicate_uplink_beacon.dm" #include "code\game\objects\structures\table_frames.dm" #include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" diff --git a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx index cd79be0621d..07d1e1beff3 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoTraitor.tsx @@ -35,6 +35,8 @@ type Info = { intro: string; code: string; failsafe_code: string; + replacement_code: string; + replacement_frequency: string; has_uplink: BooleanLike; uplink_intro: string; uplink_unlock_info: string; @@ -120,8 +122,15 @@ const EmployerSection = (props, context) => { const UplinkSection = (props, context) => { const { data } = useBackend(context); - const { has_uplink, uplink_intro, uplink_unlock_info, code, failsafe_code } = - data; + const { + has_uplink, + uplink_intro, + uplink_unlock_info, + code, + failsafe_code, + replacement_code, + replacement_frequency, + } = data; return (
@@ -149,6 +158,19 @@ const UplinkSection = (props, context) => { )} +
+
+ If you lose your uplink, you can craft a Syndicate Uplink Beacon and + then speak{' '} + + {replacement_code} + {' '} + on radio frequency{' '} + + {replacement_frequency} + {' '} + after synchronizing with the beacon. +
); };