From a0c92f064627a68ac8f5c44b1b77d03a63a49386 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Thu, 11 Feb 2021 13:22:37 -0300 Subject: [PATCH] upload files --- code/_onclick/hud/_defines.dm | 8 +- code/_onclick/hud/ai.dm | 3 - code/_onclick/hud/robot.dm | 83 +++++--- code/datums/wires/robot.dm | 6 +- code/game/machinery/computer/robot.dm | 1 + .../objects/items/robot/robot_upgrades.dm | 5 + .../traitor/equipment/Malf_Modules.dm | 11 ++ code/modules/asset_cache/asset_list_items.dm | 4 +- .../human/species_types/shadowpeople.dm | 8 +- .../modules/mob/living/silicon/robot/death.dm | 5 +- .../modules/mob/living/silicon/robot/emote.dm | 12 -- code/modules/mob/living/silicon/robot/laws.dm | 16 +- code/modules/mob/living/silicon/robot/life.dm | 9 +- .../modules/mob/living/silicon/robot/robot.dm | 180 +++++++++++------- .../mob/living/silicon/robot/robot_defense.dm | 3 + .../mob/living/silicon/robot/robot_defines.dm | 25 ++- .../mob/living/silicon/robot/robot_modules.dm | 3 +- .../mob/living/silicon/robot/update_icons.dm | 7 +- .../computers/item/computer.dm | 42 ++-- .../computers/item/computer_ui.dm | 2 + .../computers/item/tablet-silicon.dm | 98 ++++++++++ .../computers/item/tablet.dm | 1 + .../computers/item/tablet_presets.dm | 8 + .../computers/machinery/modular_computer.dm | 4 + .../programs/antagonist/revelation.dm | 6 + .../file_system/programs/borg_monitor.dm | 4 + .../file_system/programs/robotact.dm | 147 ++++++++++++++ .../modular_computers/hardware/hard_drive.dm | 6 + .../hardware/network_card.dm | 20 ++ .../modular_computers/hardware/recharger.dm | 9 + .../photography/camera/silicon_camera.dm | 8 - code/modules/tgui/states.dm | 5 +- icons/mob/screen_cyborg.dmi | Bin 27500 -> 26702 bytes icons/obj/modular_tablet.dmi | Bin 7608 -> 18914 bytes icons/program_icons/robotact.gif | Bin 0 -> 134 bytes tgstation.dme | 2 + 36 files changed, 566 insertions(+), 185 deletions(-) create mode 100644 code/modules/modular_computers/computers/item/tablet-silicon.dm create mode 100644 code/modules/modular_computers/file_system/programs/robotact.dm create mode 100644 icons/program_icons/robotact.gif diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 467c67e0c3..7dcfad01b5 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -49,16 +49,12 @@ #define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5" -#define ui_borg_sensor "CENTER-3:15, SOUTH:5" //borgs -#define ui_borg_lamp "CENTER-4:15, SOUTH:5" //borgs -#define ui_borg_thrusters "CENTER-5:15, SOUTH:5" //borgs #define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs #define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs #define ui_inv3 "CENTER :16,SOUTH:5" //borgs #define ui_borg_module "CENTER+1:16,SOUTH:5" //borgs #define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs #define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs -#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs #define ui_borg_language_menu "EAST-1:27,SOUTH+2:8" //borgs #define ui_monkey_head "CENTER-5:13,SOUTH:5" //monkey @@ -91,7 +87,9 @@ #define ui_borg_pull "EAST-2:26,SOUTH+1:7" #define ui_borg_radio "EAST-1:28,SOUTH+1:7" #define ui_borg_intents "EAST-2:26,SOUTH:5" - +#define ui_borg_lamp "CENTER-3:16, SOUTH:5" +#define ui_borg_tablet "CENTER-4:16, SOUTH:5" +#define ui_borg_alerts "CENTER+4:21,SOUTH:5" //Upper-middle right (alerts) #define ui_alert1 "EAST-1:28,CENTER+5:27" diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 93c3b63d1e..f54d229c5e 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -150,9 +150,6 @@ if(isAI(usr)) var/mob/living/silicon/ai/AI = usr AI.aicamera.viewpictures(usr) - else if(iscyborg(usr)) - var/mob/living/silicon/robot/R = usr - R.aicamera.viewpictures(usr) /obj/screen/ai/sensors name = "Sensor Augmentation" diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 9859e7acdf..6a9a670214 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -70,23 +70,46 @@ /obj/screen/robot/lamp name = "headlamp" - icon_state = "lamp0" + icon = 'icons/mob/screen_cyborg.dmi' + icon_state = "lamp_off" + var/mob/living/silicon/robot/robot /obj/screen/robot/lamp/Click() - if(..()) + . = ..() + if(.) return - var/mob/living/silicon/robot/R = usr - R.control_headlamp() + robot?.toggle_headlamp() + update_icon() -/obj/screen/robot/thrusters - name = "ion thrusters" - icon_state = "ionpulse0" +/obj/screen/robot/lamp/update_icon() + if(robot?.lamp_enabled) + icon_state = "lamp_on" + else + icon_state = "lamp_off" -/obj/screen/robot/thrusters/Click() - if(..()) +/obj/screen/robot/modPC + name = "Modular Interface" + icon = 'icons/mob/screen_cyborg.dmi' + icon_state = "template" + var/mob/living/silicon/robot/robot + +/obj/screen/robot/modPC/Click() + . = ..() + if(.) return - var/mob/living/silicon/robot/R = usr - R.toggle_ionpulse() + robot.modularInterface?.interact(robot) + +/obj/screen/robot/alerts + name = "Alert Panel" + icon = 'icons/mob/screen_ai.dmi' + icon_state = "alerts" + +/obj/screen/robot/alerts/Click() + . = ..() + if(.) + return + var/mob/living/silicon/robot/borgo = usr + borgo.robot_alerts() /obj/screen/robot/sensors name = "Sensor Augmentation" @@ -148,37 +171,37 @@ //End of module select + using = new /obj/screen/robot/lamp() + using.screen_loc = ui_borg_lamp + using.hud = src + static_inventory += using + mymobR.lampButton = using + var/obj/screen/robot/lamp/lampscreen = using + lampscreen.robot = mymobR + //Photography stuff using = new /obj/screen/ai/image_take() using.screen_loc = ui_borg_camera using.hud = src static_inventory += using - using = new /obj/screen/ai/image_view() - using.screen_loc = ui_borg_album +//Borg Integrated Tablet + using = new /obj/screen/robot/modPC() + using.screen_loc = ui_borg_tablet using.hud = src static_inventory += using + mymobR.interfaceButton = using + if(mymobR.modularInterface) + using.vis_contents += mymobR.modularInterface + var/obj/screen/robot/modPC/tabletbutton = using + tabletbutton.robot = mymobR -//Sec/Med HUDs - using = new /obj/screen/robot/sensors() - using.screen_loc = ui_borg_sensor +//Alerts + using = new /obj/screen/robot/alerts() + using.screen_loc = ui_borg_alerts using.hud = src static_inventory += using -//Headlamp control - using = new /obj/screen/robot/lamp() - using.screen_loc = ui_borg_lamp - using.hud = src - static_inventory += using - mymobR.lamp_button = using - -//Thrusters - using = new /obj/screen/robot/thrusters() - using.screen_loc = ui_borg_thrusters - using.hud = src - static_inventory += using - mymobR.thruster_button = using - //Intent action_intent = new /obj/screen/act_intent/robot() action_intent.icon_state = mymob.a_intent diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 593579c469..8d5847d811 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -70,19 +70,23 @@ if(R.shell) R.undeploy() R.set_connected_ai(null) + R.logevent("AI connection fault [mend?"cleared":"detected"]") if(WIRE_LAWSYNC) // Cut the law wire, and the borg will no longer receive law updates from its AI. Repair and it will re-sync. if(mend) if(!R.emagged) R.lawupdate = TRUE else if(!R.deployed) //AI shells must always have the same laws as the AI R.lawupdate = FALSE + R.logevent("Lawsync Module fault [mend?"cleared":"detected"]") if (WIRE_CAMERA) // Disable the camera. if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) R.builtInCamera.status = mend R.builtInCamera.toggle_cam(usr, 0) - R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.") + R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.") + R.logevent("Camera Module fault [mend?"cleared":"detected"]") if(WIRE_LOCKDOWN) // Simple lockdown. R.SetLockdown(!mend) + R.logevent("Motor Controller fault [mend?"cleared":"detected"]") if(WIRE_RESET_MODULE) if(R.has_module() && !mend) R.ResetModule() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 9b911e9c15..932a2fe455 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -118,6 +118,7 @@ log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!") message_admins("[ADMIN_LOOKUPFLW(usr)] emagged cyborg [key_name_admin(R)] using robotic console!") R.SetEmagged(TRUE) + R.logevent("WARN: root privleges granted to PID [num2hex(rand(1,65535), -1)][num2hex(rand(1,65535), -1)].") //random eight digit hex value. Two are used because rand(1,4294967295) throws an error if("convert") if(isAI(usr) && is_servant_of_ratvar(usr)) var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 291fc30aa2..bbdf80c308 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -74,6 +74,8 @@ as performing this in action() will cause the upgrade to end up in the borg inst playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) R.revive() + R.logevent("WARN -- System recovered from unexpected shutdown.") + R.logevent("System brought online.") /obj/item/borg/upgrade/vtec name = "cyborg VTEC module" @@ -149,6 +151,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst return FALSE R.ionpulse = TRUE + R.toggle_ionpulse() //Enabled by default /obj/item/borg/upgrade/thrusters/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() @@ -285,6 +288,8 @@ as performing this in action() will cause the upgrade to end up in the borg inst return FALSE R.SetEmagged(1) + R.logevent("WARN: hardware installed with missing security certificate!") //A bit of fluff to hint it was an illegal tech item + R.logevent("WARN: root privleges granted to PID [num2hex(rand(1,65535), -1)][num2hex(rand(1,65535), -1)].") //random eight digit hex value. Two are used because rand(1,4294967295) throws an error return TRUE diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 0659655da5..5722276159 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -354,9 +354,14 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( var/obj/effect/countdown/doomsday/countdown var/detonation_timer var/next_announce + var/mob/living/silicon/ai/owner /obj/machinery/doomsday_device/Initialize() . = ..() + owner = loc + if(!istype(owner)) + stack_trace("Doomsday created outside an AI somehow, shit's fucking broke. Anyway, we're just gonna qdel now. Go make a github issue report.") + qdel(src) countdown = new(src) /obj/machinery/doomsday_device/Destroy() @@ -364,6 +369,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( STOP_PROCESSING(SSfastprocess, src) SSshuttle.clearHostileEnvironment(src) SSmapping.remove_nuke_threat(src) + for(var/mob/living/silicon/robot/borg in owner.connected_robots) + borg.lamp_doom = FALSE + borg.toggle_headlamp(FALSE, TRUE) //forces borg lamp to update for(var/A in GLOB.ai_list) var/mob/living/silicon/ai/AI = A if(AI.doomsday_device == src) @@ -378,6 +386,9 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( START_PROCESSING(SSfastprocess, src) SSshuttle.registerHostileEnvironment(src) SSmapping.add_nuke_threat(src) //This causes all blue "circuit" tiles on the map to change to animated red icon state. + for(var/mob/living/silicon/robot/borg in owner.connected_robots) + borg.lamp_doom = TRUE + borg.toggle_headlamp(FALSE, TRUE) //forces borg lamp to update /obj/machinery/doomsday_device/proc/seconds_remaining() . = max(0, (round((detonation_timer - world.time) / 10))) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 22fb266033..a5290a5752 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -48,8 +48,8 @@ "smmon_4.gif" = 'icons/program_icons/smmon_4.gif', "smmon_5.gif" = 'icons/program_icons/smmon_5.gif', "smmon_6.gif" = 'icons/program_icons/smmon_6.gif' - // "borg_mon.gif" = 'icons/program_icons/borg_mon.gif', - // "robotact.gif" = 'icons/program_icons/robotact.gif' + "borg_mon.gif" = 'icons/program_icons/borg_mon.gif', + "robotact.gif" = 'icons/program_icons/robotact.gif' ) /datum/asset/simple/radar_assets diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 33a2a09b70..329fa5ee65 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -187,12 +187,8 @@ AM.emp_act(50) if(iscyborg(AM)) var/mob/living/silicon/robot/borg = AM - if(borg.lamp_intensity) - borg.update_headlamp(TRUE, INFINITY) - to_chat(borg, "Your headlamp is fried! You'll need a human to help replace it.") - for(var/obj/item/assembly/flash/cyborg/F in borg.held_items) - if(!F.crit_fail) - F.burn_out() + if(borg.lamp_enabled) + borg.smash_headlamp() else for(var/obj/item/O in AM) if(O.light_range && O.light_power) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 6a5338c1f5..b5fa78a3fd 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -17,6 +17,9 @@ if(stat == DEAD) return + if(!gibbed) + logevent("FATAL -- SYSTEM HALT") + modularInterface.shutdown_computer() . = ..() locked = FALSE //unlock cover @@ -24,7 +27,7 @@ update_mobility() if(!QDELETED(builtInCamera) && builtInCamera.status) builtInCamera.toggle_cam(src,0) - update_headlamp(1) //So borg lights are disabled when killed. + toggle_headlamp(TRUE) //So borg lights are disabled when killed. uneq_all() // particularly to ensure sight modes are cleared diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index d499c2abae..2ef6f6490e 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -64,15 +64,3 @@ key = "warn" message = "blares an alarm!" sound = 'sound/machines/warning-buzzer.ogg' - -/mob/living/silicon/robot/verb/powerwarn() - set category = "Robot Commands" - set name = "Power Warning" - - if(stat == CONSCIOUS) - if(!cell || !cell.charge) - visible_message("The power warning light on [src] flashes urgently.",\ - "You announce you are operating in low power mode.") - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) - else - to_chat(src, "You can only use this emote when you're out of charge.") diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 995ad5a5ee..e8d3b76927 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -1,11 +1,3 @@ -/mob/living/silicon/robot/verb/cmd_show_laws() - set category = "Robot Commands" - set name = "Show Laws" - - if(usr.stat == DEAD) - return //won't work if dead - show_laws() - /mob/living/silicon/robot/show_laws(everyone = 0) laws_sanity_check() var/who @@ -79,4 +71,12 @@ if (length(temp) > 0) laws.supplied[index] = temp + var/datum/computer_file/program/robotact/program = modularInterface.get_robotact() + if(program) + program.force_full_update() + picturesync() + +/mob/living/silicon/robot/post_lawchange(announce = TRUE) + . = ..() + addtimer(CALLBACK(src, .proc/logevent,"Law update processed."), 0, TIMER_UNIQUE | TIMER_OVERRIDE) //Post_Lawchange gets spammed by some law boards, so let's wait it out diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 0feb8b98b7..1b3b1a8d94 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -9,8 +9,7 @@ if(stat != DEAD) if(low_power_mode) if(cell && cell.charge) - low_power_mode = 0 - update_headlamp() + low_power_mode = FALSE else if(stat == CONSCIOUS) use_power() @@ -18,12 +17,12 @@ if(cell && cell.charge) if(cell.charge <= 100) uneq_all() - var/amt = clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. + var/amt = clamp(lamp_enabled ? (lamp_intensity - 2) : 0 * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell. cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick else uneq_all() - low_power_mode = 1 - update_headlamp() + low_power_mode = TRUE + toggle_headlamp(TRUE) diag_hud_set_borgcell() /mob/living/silicon/robot/proc/handle_robot_hud_updates() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 7db417b8fa..03e59408c6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -33,6 +33,8 @@ if(!TryConnectToAI()) lawupdate = FALSE + create_modularInterface() + radio = new /obj/item/radio/borg(src) if(!scrambledcodes && !builtInCamera) builtInCamera = new (src) @@ -71,6 +73,7 @@ aicamera = new/obj/item/camera/siliconcam/robot_camera(src) toner = tonermax diag_hud_set_borgcell() + logevent("System brought online.") add_verb(src, /mob/living/proc/lay_down) //CITADEL EDIT gimmie rest verb kthx add_verb(src, /mob/living/silicon/robot/proc/rest_style) @@ -93,6 +96,8 @@ ghostize() stack_trace("Borg MMI lacked a brainmob") mmi = null + if(modularInterface) + QDEL_NULL(modularInterface) //CITADEL EDIT: Cyborgs drop encryption keys on destroy if(istype(radio) && istype(radio.keyslot)) radio.keyslot.forceMove(T) @@ -165,14 +170,6 @@ /mob/living/silicon/robot/proc/get_standard_name() return "[(designation ? "[designation] " : "")][mmi.braintype]-[ident]" -/mob/living/silicon/robot/verb/cmd_robot_alerts() - set category = "Robot Commands" - set name = "Show Alerts" - if(usr.stat == DEAD) - to_chat(src, "Alert: You are dead.") - return //won't work if dead - robot_alerts() - /mob/living/silicon/robot/proc/robot_alerts() var/dat = "" for (var/cat in alarms) @@ -219,8 +216,6 @@ ion_trail.start() else ion_trail.stop() - if(thruster_button) - thruster_button.icon_state = "ionpulse[ionpulse_on]" /mob/living/silicon/robot/get_status_tab_items() . = ..() @@ -281,6 +276,8 @@ return !cleared /mob/living/silicon/robot/can_interact_with(atom/A) + if (A == modularInterface) + return TRUE //bypass for borg tablets if (low_power_mode) return FALSE var/turf/T0 = get_turf(src) @@ -428,8 +425,6 @@ to_chat(user, "Unable to locate a radio!") else if (istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) // trying to unlock the interface with an ID card - if(emagged)//still allow them to open the cover - to_chat(user, "The interface seems slightly damaged.") if(opened) to_chat(user, "You must close the cover to swipe an ID card!") else @@ -437,6 +432,11 @@ locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s cover.") update_icons() + if(emagged) + to_chat(user, "The cover interface glitches out for a split second.") + logevent("ChÃ¥vÃis cover lock has been [locked ? "engaged" : "released"]") //ChÃ¥vÃis: see above line + else + logevent("Chassis cover lock has been [locked ? "engaged" : "released"]") else to_chat(user, "Access denied.") @@ -454,11 +454,13 @@ if(U.action(src)) to_chat(user, "You apply the upgrade to [src].") if(U.one_use) + logevent("Firmware [U] run successfully.") U.afterInstall(src) qdel(U) else U.forceMove(src) upgrades += U + logevent("Hardware [U] installed successfully.") U.afterInstall(src) else to_chat(user, "Upgrade error.") @@ -477,15 +479,22 @@ else if(istype(W, /obj/item/flashlight)) if(!opened) to_chat(user, "You need to open the panel to repair the headlamp!") - else if(lamp_cooldown <= world.time) + else if(lamp_functional) to_chat(user, "The headlamp is already functional!") else if(!user.temporarilyRemoveItemFromInventory(W)) to_chat(user, "[W] seems to be stuck to your hand. You'll have to find a different light.") return - lamp_cooldown = 0 + lamp_functional = TRUE qdel(W) to_chat(user, "You replace the headlamp bulbs.") + else if(istype(W, /obj/item/computer_hardware/hard_drive/portable)) //Allows borgs to install new programs with human help + if(!modularInterface) + stack_trace("Cyborg [src] ( [type] ) was somehow missing their integrated tablet. Please make a bug report.") + create_modularInterface() + var/obj/item/computer_hardware/hard_drive/portable/floppy = W + if(modularInterface.install_component(floppy, user)) + return else return ..() @@ -502,19 +511,6 @@ return TRUE return ..() -/mob/living/silicon/robot/verb/unlock_own_cover() - set category = "Robot Commands" - set name = "Unlock Cover" - set desc = "Unlocks your own cover if it is locked. You can not lock it again. A human will have to lock it for you." - if(stat == DEAD) - return //won't work if dead - if(locked) - switch(alert("You cannot lock your cover again, are you sure?\n (You can still ask for a human to lock it)", "Unlock Own Cover", "Yes", "No")) - if("Yes") - locked = FALSE - update_icons() - to_chat(usr, "You unlock your cover.") - /mob/living/silicon/robot/proc/allowed(mob/M) //check if it doesn't require any access at all if(check_access(null)) @@ -596,6 +592,7 @@ else clear_alert("locked") locked_down = state + logevent("System lockdown [locked_down?"triggered":"released"].") update_mobility() /mob/living/silicon/robot/proc/SetEmagged(new_state) @@ -607,48 +604,6 @@ else clear_alert("hacked") -/mob/living/silicon/robot/verb/outputlaws() - set category = "Robot Commands" - set name = "State Laws" - - if(usr.stat == DEAD) - return //won't work if dead - checklaws() - -/mob/living/silicon/robot/verb/set_automatic_say_channel() //Borg version of setting the radio for autosay messages. - set name = "Set Auto Announce Mode" - set desc = "Modify the default radio setting for stating your laws." - set category = "Robot Commands" - - if(usr.stat == DEAD) - return //won't work if dead - set_autosay() - -/mob/living/silicon/robot/proc/control_headlamp() - if(stat || lamp_cooldown > world.time || low_power_mode) - to_chat(src, "This function is currently offline.") - return - -//Some sort of magical "modulo" thing which somehow increments lamp power by 2, until it hits the max and resets to 0. - lamp_intensity = (lamp_intensity+2) % (lamp_max+2) - to_chat(src, "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]") - update_headlamp() - -/mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0, var/cooldown = 100) - set_light(0) - - if(lamp_intensity && (turn_off || stat || low_power_mode)) - to_chat(src, "Your headlamp has been deactivated.") - lamp_intensity = 0 - lamp_cooldown = world.time + cooldown - else - set_light(lamp_intensity) - - if(lamp_button) - lamp_button.icon_state = "lamp[lamp_intensity]" - - update_icons() - /mob/living/silicon/robot/proc/deconstruct() var/turf/T = get_turf(src) if (robot_suit) @@ -867,13 +822,11 @@ if(!eye_blind) blind_eyes(1) update_mobility() - update_headlamp() else if(stat == UNCONSCIOUS) stat = CONSCIOUS adjust_blindness(-1) update_mobility() - update_headlamp() diag_hud_set_status() diag_hud_set_health() diag_hud_set_aishell() @@ -883,7 +836,6 @@ if(..()) //successfully ressuscitated from death if(!QDELETED(builtInCamera) && !wires.is_cut(WIRE_CAMERA)) builtInCamera.toggle_cam(src,0) - update_headlamp() if(admin_revive) locked = TRUE notify_ai(NEW_BORG) @@ -908,6 +860,7 @@ resize = 0.5 hasExpanded = FALSE update_transform() + logevent("Chassis configuration has been reset.") module.transform_to(/obj/item/robot_module) // Remove upgrades. @@ -1173,8 +1126,91 @@ return . = connected_ai connected_ai = new_ai + lamp_doom = FALSE if(.) var/mob/living/silicon/ai/old_ai = . old_ai.connected_robots -= src if(connected_ai) connected_ai.connected_robots |= src + toggle_headlamp(FALSE, TRUE) + +/** + * Handles headlamp smashing + * + * When called (such as by the shadowperson lighteater's attack), this proc will break the borg's headlamp + * and then call toggle_headlamp to disable the light. It also plays a sound effect of glass breaking, and + * tells the borg what happened to its chat. Broken lights can be repaired by using a flashlight on the borg. + */ +/mob/living/silicon/robot/proc/smash_headlamp() + if(!lamp_functional) + return + lamp_functional = FALSE + playsound(src, 'sound/effects/glass_step.ogg', 50) + toggle_headlamp(TRUE) + to_chat(src, "Your headlamp is broken! You'll need a human to help replace it.") + +/** + * Handles headlamp toggling, disabling, and color setting. + * + * The initial if statment is a bit long, but the gist of it is that should the lamp be on AND the update_color + * arg be true, we should simply change the color of the lamp but not disable it. Otherwise, should the turn_off + * arg be true, the lamp already be enabled, any of the normal reasons the lamp would turn off happen, or the + * update_color arg be passed with the lamp not on, we should set the lamp off. The update_color arg is only + * ever true when this proc is called from the borg tablet, when the color selection feature is used. + * + * Arguments: + * * arg1 - turn_off, if enabled will force the lamp into an off state (rather than toggling it if possible) + * * arg2 - update_color, if enabled, will adjust the behavior of the proc to change the color of the light if it is already on. + */ +/mob/living/silicon/robot/proc/toggle_headlamp(turn_off = FALSE, update_color = FALSE) + //if both lamp is enabled AND the update_color flag is on, keep the lamp on. Otherwise, if anything listed is true, disable the lamp. + if(!(update_color && lamp_enabled) && (turn_off || lamp_enabled || update_color || !lamp_functional || stat || low_power_mode)) + if(lamp_functional && stat != DEAD && lamp_doom) + set_light(l_power = TRUE) //If the lamp isn't broken and borg isn't dead, doomsday borgs cannot disable their light fully. + set_light(l_color = "#FF0000") //This should only matter for doomsday borgs, as any other time the lamp will be off and the color not seen + set_light(l_range = 1) //Again, like above, this only takes effect when the light is forced on by doomsday mode. + set_light(l_power = FALSE) + lamp_enabled = FALSE + lampButton?.update_icon() + update_icons() + return + set_light(l_range = lamp_intensity) + set_light(l_color = (lamp_doom? "#FF0000" : lamp_color)) //Red for doomsday killborgs, borg's choice otherwise + set_light(l_power = TRUE) + lamp_enabled = TRUE + lampButton?.update_icon() + update_icons() + +/mob/living/silicon/robot/proc/create_modularInterface() + if(!modularInterface) + modularInterface = new /obj/item/modular_computer/tablet/integrated(src) + modularInterface.layer = ABOVE_HUD_PLANE + modularInterface.plane = ABOVE_HUD_PLANE + +/mob/living/silicon/robot/modules/syndicate/create_modularInterface() + if(!modularInterface) + modularInterface = new /obj/item/modular_computer/tablet/integrated/syndicate(src) + return ..() + +/** + * Records an IC event log entry in the cyborg's internal tablet. + * + * Creates an entry in the borglog list of the cyborg's internal tablet, listing the current + * in-game time followed by the message given. These logs can be seen by the cyborg in their + * BorgUI tablet app. By design, logging fails if the cyborg is dead. + * + * Arguments: + * arg1: a string containing the message to log. + */ +/mob/living/silicon/robot/proc/logevent(var/string = "") + if(!string) + return + if(stat == DEAD) //Dead borgs log no longer + return + if(!modularInterface) + stack_trace("Cyborg [src] ( [type] ) was somehow missing their integrated tablet. Please make a bug report.") + create_modularInterface() + modularInterface.borglog += "[STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)] - [string]" + var/datum/computer_file/program/robotact/program = modularInterface.get_robotact() + if(program) + program.force_full_update() diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 0ed380040b..69497b1f8b 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -118,6 +118,7 @@ if(connected_ai && connected_ai.mind && connected_ai.mind.has_antag_datum(/datum/antagonist/traitor)) to_chat(src, "ALERT: Foreign software execution prevented.") to_chat(connected_ai, "ALERT: Cyborg unit \[[src]] successfully defended against subversion.") + logevent("ALERT: Foreign software execution prevented.") log_game("[key_name(user)] attempted to emag cyborg [key_name(src)], but they were slaved to traitor AI [connected_ai].") return TRUE @@ -140,10 +141,12 @@ var/time = time2text(world.realtime,"hh:mm:ss") GLOB.lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") to_chat(src, "ALERT: Foreign software detected.") + logevent("ALERT: Foreign software detected.") sleep(5) to_chat(src, "Initiating diagnostics...") sleep(20) to_chat(src, "SynBorg v1.7 loaded.") + logevent("WARN: root privleges granted to PID [num2hex(rand(1,65535), -1)][num2hex(rand(1,65535), -1)].") //random eight digit hex value. Two are used because rand(1,4294967295) throws an error sleep(5) to_chat(src, "LAW SYNCHRONISATION ERROR") sleep(5) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index 4f7ae41969..f9d56e9caa 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -26,8 +26,6 @@ var/obj/screen/inv1 = null var/obj/screen/inv2 = null var/obj/screen/inv3 = null - var/obj/screen/lamp_button = null - var/obj/screen/thruster_button = null var/obj/screen/hands = null var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not @@ -70,11 +68,24 @@ var/toner = 0 var/tonermax = 40 - var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting. - var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power. - light_color = "#FFCC66" - light_power = 0.8 - var/lamp_cooldown = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. + ///If the lamp isn't broken. + var/lamp_functional = TRUE + ///If the lamp is turned on + var/lamp_enabled = FALSE + ///Set lamp color + var/lamp_color = "#FFFFFF" + ///Lamp brightness. Starts at 3, but can be 1 - 5. + var/lamp_intensity = 3 + ///Lamp button reference + var/obj/screen/robot/lamp/lampButton + ///Set to true if a doomsday event is locking our lamp to on and RED + var/lamp_doom = FALSE + //Maximum brightness of a borg lamp. Set as a var for easy adjusting. + var/lamp_max = 10 + + ///The reference to the built-in tablet that borgs carry. + var/obj/item/modular_computer/tablet/integrated/modularInterface + var/obj/screen/robot/modPC/interfaceButton var/sight_mode = 0 hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4c83841809..241efcca6c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -262,6 +262,7 @@ R.mob_transforming = TRUE R.SetLockdown(1) R.anchored = TRUE + R.logevent("Chassis configuration has been set to [name].") sleep(1) for(var/i in 1 to 4) playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1) @@ -271,7 +272,7 @@ R.setDir(SOUTH) R.anchored = FALSE R.mob_transforming = FALSE - R.update_headlamp() + R.update_icons() R.notify_ai(NEW_MODULE) if(R.hud_used) R.hud_used.update_robot_modules_display() diff --git a/code/modules/mob/living/silicon/robot/update_icons.dm b/code/modules/mob/living/silicon/robot/update_icons.dm index a567446e9e..cc54ea7af2 100644 --- a/code/modules/mob/living/silicon/robot/update_icons.dm +++ b/code/modules/mob/living/silicon/robot/update_icons.dm @@ -1,6 +1,7 @@ /// this is bad code /mob/living/silicon/robot/update_icons() cut_overlays() + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) icon_state = module.cyborg_base_icon //Citadel changes start here - Allows modules to use different icon files, and allows modules to specify a pixel offset icon = (module.cyborg_icon_override ? module.cyborg_icon_override : initial(icon)) @@ -26,10 +27,14 @@ if(stat != DEAD && !(IsUnconscious() ||IsStun() || IsKnockdown() || IsParalyzed() || low_power_mode)) //Not dead, not stunned. if(!eye_lights) eye_lights = new() - if(lamp_intensity > 2) + if(lamp_enabled) eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_l" + eye_lights.color = lamp_doom? COLOR_RED : lamp_color + eye_lights.plane = 19 //glowy eyes else eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_e[is_servant_of_ratvar(src) ? "_r" : ""]" + eye_lights.color = "#FFFFFF" + eye_lights.plane = -1 eye_lights.icon = icon add_overlay(eye_lights) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 63cb1cc5fa..a1fa8c7e1a 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -386,32 +386,32 @@ to_chat(user, "You repair \the [src].") return - if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(!all_components.len) - to_chat(user, "This device doesn't have any components installed.") - return - var/list/component_names = list() - for(var/h in all_components) - var/obj/item/computer_hardware/H = all_components[h] - component_names.Add(H.name) + ..() - var/choice = input(user, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in sortList(component_names) +/obj/item/modular_computer/screwdriver_act(mob/user, obj/item/tool) + if(!all_components.len) + to_chat(user, "This device doesn't have any components installed.") + return + var/list/component_names = list() + for(var/h in all_components) + var/obj/item/computer_hardware/H = all_components[h] + component_names.Add(H.name) - if(!choice) - return + var/choice = input(user, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in sortList(component_names) - if(!Adjacent(user)) - return - - var/obj/item/computer_hardware/H = find_hardware_by_name(choice) - - if(!H) - return - - uninstall_component(H, user) + if(!choice) return - ..() + if(!Adjacent(user)) + return + + var/obj/item/computer_hardware/H = find_hardware_by_name(choice) + + if(!H) + return + + uninstall_component(H, user) + return // Used by processor to relay qdel() to machinery type. /obj/item/modular_computer/proc/relay_qdel() diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index 4a985b93c1..88fab58859 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -47,7 +47,9 @@ data["login"] = list() var/obj/item/computer_hardware/card_slot/cardholder = all_components[MC_CARD] + data["cardholder"] = FALSE if(cardholder) + data["cardholder"] = TRUE var/obj/item/card/id/stored_card = cardholder.GetID() if(stored_card) var/stored_name = stored_card.registered_name diff --git a/code/modules/modular_computers/computers/item/tablet-silicon.dm b/code/modules/modular_computers/computers/item/tablet-silicon.dm new file mode 100644 index 0000000000..df224fd71c --- /dev/null +++ b/code/modules/modular_computers/computers/item/tablet-silicon.dm @@ -0,0 +1,98 @@ +/// Borg Built-in tablet interface +/obj/item/modular_computer/tablet/integrated + name = "modular interface" + icon_state = "tablet-silicon" + has_light = FALSE //tablet light button actually enables/disables the borg lamp + comp_light_luminosity = 0 + has_variants = FALSE + ///Ref to the borg we're installed in. Set by the borg during our creation. + var/mob/living/silicon/robot/borgo + ///Ref to the RoboTact app. Important enough to borgs to deserve a ref. + var/datum/computer_file/program/robotact/robotact + ///IC log that borgs can view in their personal management app + var/list/borglog = list() + +/obj/item/modular_computer/tablet/integrated/Initialize(mapload) + . = ..() + vis_flags |= VIS_INHERIT_ID + borgo = loc + if(!istype(borgo)) + borgo = null + stack_trace("[type] initialized outside of a borg, deleting.") + return INITIALIZE_HINT_QDEL + +/obj/item/modular_computer/tablet/integrated/Destroy() + borgo = null + return ..() + +/obj/item/modular_computer/tablet/integrated/turn_on(mob/user) + if(borgo?.stat != DEAD) + return ..() + return FALSE + +/** + * Returns a ref to the RoboTact app, creating the app if need be. + * + * The RoboTact app is important for borgs, and so should always be available. + * This proc will look for it in the tablet's robotact var, then check the + * hard drive if the robotact var is unset, and finally attempt to create a new + * copy if the hard drive does not contain the app. If the hard drive rejects + * the new copy (such as due to lack of space), the proc will crash with an error. + * RoboTact is supposed to be undeletable, so these will create runtime messages. + */ +/obj/item/modular_computer/tablet/integrated/proc/get_robotact() + if(!borgo) + return null + if(!robotact) + var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] + robotact = hard_drive.find_file_by_name("robotact") + if(!robotact) + stack_trace("Cyborg [borgo] ( [borgo.type] ) was somehow missing their self-manage app in their tablet. A new copy has been created.") + robotact = new(hard_drive) + if(!hard_drive.store_file(robotact)) + qdel(robotact) + robotact = null + CRASH("Cyborg [borgo]'s tablet hard drive rejected recieving a new copy of the self-manage app. To fix, check the hard drive's space remaining. Please make a bug report about this.") + return robotact + +//Makes the light settings reflect the borg's headlamp settings +/obj/item/modular_computer/tablet/integrated/ui_data(mob/user) + . = ..() + .["has_light"] = TRUE + .["light_on"] = borgo?.lamp_enabled + .["comp_light_color"] = borgo?.lamp_color + +//Overrides the ui_act to make the flashlight controls link to the borg instead +/obj/item/modular_computer/tablet/integrated/ui_act(action, params) + switch(action) + if("PC_toggle_light") + if(!borgo) + return FALSE + borgo.toggle_headlamp() + return TRUE + + if("PC_light_color") + if(!borgo) + return FALSE + var/mob/user = usr + var/new_color + while(!new_color) + new_color = input(user, "Choose a new color for [src]'s flashlight.", "Light Color",light_color) as color|null + if(!new_color || QDELETED(borgo)) + return + if(color_hex2num(new_color) < 200) //Colors too dark are rejected + to_chat(user, "That color is too dark! Choose a lighter one.") + new_color = null + borgo.lamp_color = new_color + borgo.toggle_headlamp(FALSE, TRUE) + return TRUE + return ..() + +/obj/item/modular_computer/tablet/integrated/syndicate + icon_state = "tablet-silicon-syndicate" + device_theme = "syndicate" + + +/obj/item/modular_computer/tablet/integrated/syndicate/Initialize() + . = ..() + borgo.lamp_color = COLOR_RED //Syndicate likes it red diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 67e8118c7a..ffbd5c9936 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -41,6 +41,7 @@ comp_light_luminosity = 6.3 has_variants = FALSE device_theme = "syndicate" + light_color = COLOR_RED /obj/item/modular_computer/tablet/nukeops/emag_act(mob/user) if(!enabled) diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index 8ac669d2bf..fac6d8fef7 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -67,3 +67,11 @@ install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) install_component(new /obj/item/computer_hardware/hard_drive/small/nukeops) install_component(new /obj/item/computer_hardware/network_card) + +//Borg Built-in tablet +/obj/item/modular_computer/tablet/integrated/Initialize() + . = ..() + install_component(new /obj/item/computer_hardware/processor_unit/small) + install_component(new /obj/item/computer_hardware/hard_drive/small/integrated) + install_component(new /obj/item/computer_hardware/recharger/cyborg) + install_component(new /obj/item/computer_hardware/network_card/integrated) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 0e6f4d161a..91e51b8066 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -146,3 +146,7 @@ /obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj) if(cpu) cpu.bullet_act(Proj) + +/obj/machinery/modular_computer/screwdriver_act(mob/user, obj/item/tool) + if(cpu) + return cpu.screwdriver_act(user, tool) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index 4f1c488b9e..a4408346e5 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -17,6 +17,12 @@ /datum/computer_file/program/revelation/proc/activate() if(computer) + if(istype(computer, /obj/item/modular_computer/tablet/integrated)) //If this is a borg's integrated tablet + var/obj/item/modular_computer/tablet/integrated/modularInterface = computer + to_chat(modularInterface.borgo,"SYSTEM PURGE DETECTED/") + addtimer(CALLBACK(modularInterface.borgo, /mob/living/silicon/robot/.proc/death), 2 SECONDS, TIMER_UNIQUE) + return + computer.visible_message("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.") computer.enabled = FALSE computer.update_icon() diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index 13caab27ef..938d8a17de 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -54,10 +54,14 @@ var/ID = checkID() if(!ID) return + if(R.stat == DEAD) //Dead borgs will listen to you no longer + to_chat(usr, "Error -- Could not open a connection to unit:[R]") var/message = stripped_input(usr, message = "Enter message to be sent to remote cyborg.", title = "Send Message") if(!message) return to_chat(R, "

Message from [ID] -- \"[message]\"
") + to_chat(usr, "Message sent to [R]: [message]") + R.logevent("Message from [ID] -- \"[message]\"") SEND_SOUND(R, 'sound/machines/twobeep_high.ogg') if(R.connected_ai) to_chat(R.connected_ai, "

Message from [ID] to [R] -- \"[message]\"
") diff --git a/code/modules/modular_computers/file_system/programs/robotact.dm b/code/modules/modular_computers/file_system/programs/robotact.dm new file mode 100644 index 0000000000..066c9a6744 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/robotact.dm @@ -0,0 +1,147 @@ +/datum/computer_file/program/robotact + filename = "robotact" + filedesc = "RoboTact" + extended_desc = "A built-in app for cyborg self-management and diagnostics." + ui_header = "robotact.gif" //DEBUG -- new icon before PR + program_icon_state = "command" + requires_ntnet = FALSE + transfer_access = null + available_on_ntnet = FALSE + unsendable = TRUE + undeletable = TRUE + usage_flags = PROGRAM_TABLET + size = 5 + tgui_id = "NtosRobotact" + ///A typed reference to the computer, specifying the borg tablet type + var/obj/item/modular_computer/tablet/integrated/tablet + +/datum/computer_file/program/robotact/Destroy() + tablet = null + return ..() + +/datum/computer_file/program/robotact/run_program(mob/living/user) + if(!istype(computer, /obj/item/modular_computer/tablet/integrated)) + to_chat(user, "A warning flashes across \the [computer]: Device Incompatible.") + return FALSE + . = ..() + if(.) + tablet = computer + if(tablet.device_theme == "syndicate") + program_icon_state = "command-syndicate" + return TRUE + return FALSE + +/datum/computer_file/program/robotact/ui_data(mob/user) + var/list/data = get_header_data() + if(!iscyborg(user)) + return data + var/mob/living/silicon/robot/borgo = tablet.borgo + + data["name"] = borgo.name + data["designation"] = borgo.designation //Borgo module type + data["masterAI"] = borgo.connected_ai //Master AI + + var/charge = 0 + var/maxcharge = 1 + if(borgo.cell) + charge = borgo.cell.charge + maxcharge = borgo.cell.maxcharge + data["charge"] = charge //Current cell charge + data["maxcharge"] = maxcharge //Cell max charge + data["integrity"] = ((borgo.health + 100) / 2) //Borgo health, as percentage + data["lampIntensity"] = borgo.lamp_intensity //Borgo lamp power setting + data["sensors"] = "[borgo.sensors_on?"ACTIVE":"DISABLED"]" + data["printerPictures"] = borgo.connected_ai? borgo.connected_ai.aicamera.stored.len : borgo.aicamera.stored.len //Number of pictures taken, synced to AI if available + data["printerToner"] = borgo.toner //amount of toner + data["printerTonerMax"] = borgo.tonermax //It's a variable, might as well use it + data["thrustersInstalled"] = borgo.ionpulse //If we have a thruster uprade + data["thrustersStatus"] = "[borgo.ionpulse_on?"ACTIVE":"DISABLED"]" //Feedback for thruster status + data["lampPowerUse"] = clamp(borgo.lamp_enabled ? (borgo.lamp_intensity - 2) : 0 * 2,1,borgo.cell.charge) + + //DEBUG -- Cover, TRUE for locked + data["cover"] = "[borgo.locked? "LOCKED":"UNLOCKED"]" + //Ability to move. FAULT if lockdown wire is cut, DISABLED if borg locked, ENABLED otherwise + data["locomotion"] = "[borgo.wires.is_cut(WIRE_LOCKDOWN)?"FAULT":"[borgo.locked_down?"DISABLED":"ENABLED"]"]" + //Module wire. FAULT if cut, NOMINAL otherwise + data["wireModule"] = "[borgo.wires.is_cut(WIRE_RESET_MODULE)?"FAULT":"NOMINAL"]" + //DEBUG -- Camera(net) wire. FAULT if cut (or no cameranet camera), DISABLED if pulse-disabled, NOMINAL otherwise + data["wireCamera"] = "[!borgo.builtInCamera || borgo.wires.is_cut(WIRE_CAMERA)?"FAULT":"[borgo.builtInCamera.can_use()?"NOMINAL":"DISABLED"]"]" + //AI wire. FAULT if wire is cut, CONNECTED if connected to AI, READY otherwise + data["wireAI"] = "[borgo.wires.is_cut(WIRE_AI)?"FAULT":"[borgo.connected_ai?"CONNECTED":"READY"]"]" + //Law sync wire. FAULT if cut, NOMINAL otherwise + data["wireLaw"] = "[borgo.wires.is_cut(WIRE_LAWSYNC)?"FAULT":"NOMINAL"]" + + return data + +/datum/computer_file/program/robotact/ui_static_data(mob/user) + var/list/data = list() + if(!iscyborg(user)) + return data + var/mob/living/silicon/robot/borgo = user + + data["Laws"] = borgo.laws.get_law_list(TRUE, TRUE, FALSE) + data["borgLog"] = tablet.borglog + data["borgUpgrades"] = borgo.upgrades + return data + +/datum/computer_file/program/robotact/ui_act(action, params) + . = ..() + if(.) + return + + var/mob/living/silicon/robot/borgo = tablet.borgo + + switch(action) + if("coverunlock") + if(borgo.locked) + borgo.locked = FALSE + borgo.update_icons() + if(borgo.emagged) + borgo.logevent("ChÃ¥vÃis cover lock has been [borgo.locked ? "engaged" : "released"]") //"The cover interface glitches out for a split second" + else + borgo.logevent("Chassis cover lock has been [borgo.locked ? "engaged" : "released"]") + + if("lawchannel") + borgo.set_autosay() + + if("lawstate") + borgo.checklaws() + + if("alertPower") + if(borgo.stat == CONSCIOUS) + if(!borgo.cell || !borgo.cell.charge) + borgo.visible_message("The power warning light on [borgo] flashes urgently.", \ + "You announce you are operating in low power mode.") + playsound(borgo, 'sound/machines/buzz-two.ogg', 50, FALSE) + + if("toggleSensors") + borgo.toggle_sensors() + + if("viewImage") + if(borgo.connected_ai) + borgo.connected_ai.aicamera?.viewpictures(usr) + else + borgo.aicamera?.viewpictures(usr) + + if("printImage") + var/obj/item/camera/siliconcam/robot_camera/borgcam = borgo.aicamera + borgcam?.borgprint(usr) + + if("toggleThrusters") + borgo.toggle_ionpulse() + + if("lampIntensity") + borgo.lamp_intensity = params["ref"] + borgo.toggle_headlamp(FALSE, TRUE) + +/** + * Forces a full update of the UI, if currently open. + * + * Forces an update that includes refreshing ui_static_data. Called by + * law changes and borg log additions. + */ +/datum/computer_file/program/robotact/proc/force_full_update() + if(tablet) + var/datum/tgui/active_ui = SStgui.get_open_ui(tablet.borgo, src) + if(active_ui) + active_ui.send_full_update() diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index e5c133de20..63d3162579 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -184,3 +184,9 @@ max_capacity = 32 icon_state = "ssd_micro" w_class = WEIGHT_CLASS_TINY + +// For borg integrated tablets. No downloader. +/obj/item/computer_hardware/hard_drive/small/integrated/install_default_programs() + store_file(new /datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar + store_file(new /datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. + store_file(new /datum/computer_file/program/robotact(src)) diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 04bf494fe4..625ead6ed7 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -77,3 +77,23 @@ power_usage = 100 // Better range but higher power usage. icon_state = "net_wired" w_class = WEIGHT_CLASS_NORMAL + +/obj/item/computer_hardware/network_card/integrated //Borg tablet version, only works while the borg has power and is not locked + name = "cyborg data link" + +/obj/item/computer_hardware/network_card/integrated/get_signal(specific_action = 0) + var/obj/item/modular_computer/tablet/integrated/modularInterface = holder + + if(!modularInterface || !istype(modularInterface)) + return FALSE //wrong type of tablet + + if(!modularInterface.borgo) + return FALSE //No borg found + + if(modularInterface.borgo.locked_down) + return FALSE //lockdown restricts borg networking + + if(!modularInterface.borgo.cell || modularInterface.borgo.cell.charge == 0) + return FALSE //borg cell dying restricts borg networking + + return ..() diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index 13ae6c1f39..2fee94c5f3 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -89,3 +89,12 @@ /obj/item/computer_hardware/recharger/lambda/use_power(amount, charging=0) return 1 + +/// This recharger exists only in borg built-in tablets. I would have tied it to the borg's cell but +/// the program that displays laws should always be usable, and the exceptions were starting to pile. +/obj/item/computer_hardware/recharger/cyborg + name = "modular interface power harness" + desc = "A standard connection to power a small computer device from a cyborg's chassis." + +/obj/item/computer_hardware/recharger/cyborg/use_power(amount, charging=0) + return TRUE diff --git a/code/modules/photography/camera/silicon_camera.dm b/code/modules/photography/camera/silicon_camera.dm index 28a080d5f1..a6b8093f27 100644 --- a/code/modules/photography/camera/silicon_camera.dm +++ b/code/modules/photography/camera/silicon_camera.dm @@ -74,14 +74,6 @@ else return ..() -/obj/item/camera/siliconcam/robot_camera/verb/borgprinting() - set category ="Robot Commands" - set name = "Print Image" - set src in usr - if(usr.stat == DEAD) - return - borgprint(usr) - /obj/item/camera/siliconcam/robot_camera/proc/borgprint(mob/user) var/mob/living/silicon/robot/C = loc if(!istype(C) || C.toner < 20) diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index fa88cc1338..1410dc6221 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -83,8 +83,9 @@ return ..() /mob/living/silicon/robot/shared_ui_interaction(src_object) - // Disable UIs if the Borg is unpowered or locked. - if(!cell || cell.charge <= 0 || locked_down) + // Disable UIs if the object isn't installed in the borg AND the borg is either locked, has a dead cell, or no cell. + var/atom/device = src_object + if((istype(device) && device.loc != src) && (!cell || cell.charge <= 0 || locked_down)) return UI_DISABLED return ..() diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi index 632443036e80b5fd3832c1a39c94a043427ca3f2..3d69a52d32465cd26bbd8f270ed4ceeedfe4d5c9 100644 GIT binary patch literal 26702 zcmYhj2RxPi8$V7~B~(JPl36w(E26ST$evF|_TI-zyCj>02FaE^4^o8el`VUZW1Yis z{I2`?KEMC}_q=*u&r8m^@6UaGuIqY_>vKOZbhMPIPG34rL_|cTs&ZSGh=^DL{=IyX z9RB8~P0l9#kQ}IQw%|(ySIazD-n_Z`^fl4*YCn-o_4M2-JZE|{obE2mcZmB zZtBg`ze=A5X86WGzOuI?^CACandhuJUohb_-h=S^cgw<1pp!w0&&a23PG`^U15wpj z%J`3>Rmqxt8H&;dfA?lcNUv7~IEMAy%v4qFOc}Fr@O0OiSvyRZe%qvaAwFCGiIq~> z;sU*c?x!cYtsUN?oz-fze7!qYI}YRRQhPP0KCb20yNr}|v~0J08TvKeaiz+ElVK$% zxO=H@Qa|UVQa5>rSlK2eNbVkFI#K(35#6-M(WwM%PHCBSCiI)uTrenR%IH#x_^g zZ7FKH=MOoOy+xB%xgFkJ4o+Wbi%<5ONDkr_+in-zka)VY2>-yn& zS-*9&2+@wjLw5npfd09|j6?zKqtLo-s->kRiRZ007zy?JcR%-7E2FAthOSs@BHuFn zLAV%s*PP+w6eVG|vw}?F)b$6=XKH@)85WS%vR#ame^g4dJ>T)!wmrc&V1Hwhrs44^ zTGaPrc`Cwvq0Jh{&G=$@o&@<@*`=RQne^n145-EmOl})PN0Lay(xAiD%?{yYoj@HD zt8$kd=aKt2)6Y&JiFY^l9o`jY7^y8T*t0F>da>tv#w(IU1u)g|1EH$z4gE=+P3sE(9na5Ml zDG%{<*}u)K;;U<y! z-F|fY>D|{Ci5n6GOdn37>jd&^wR8#(og9yD68;HFs*Q-%*AK7~Ds;QINoKhzP)r$y zcBEL;SdTkO*5E!tLekpV$$j91J#6>@uv2Tlaz+9#p@> zuMicI5vqOOWMeSQbC{a-V(r*@xvLT9@hd4CMyIZ%?D;LlikVk=KAE2WXA}=habBA1 zQBB1?BJPae3iwv%VzD8yvvfe97;LIv5j=b+rz13UFPE&pjSu^X<|WbB-wUox=$8p& z<4+zxK6~-v;#+0Uh_vd4K&=FEij*3slV{g|?V~Ao>Pc$ou_m^1j-EV)Q--eSBaWiG zU(Q5&YwNQbULC+HCeQS>QKZG6lJ;`bjTAC!C(Kgo*vd>?rG;r1RN@r9-!wSh;~czr=`K%J-!U(WfB zGL$Uvth!!^r^h=*ZRnix%qNqpDs4N`;Er{9OlKS7H`hy?6Mx8+Z1wTmswwwhBC<(S zRQ`xgW=%9EUT9OFnjrs$-v7t*b6V|3FJHaFZFk96{e8;h?2y)f(n+fP%h$NW$Unpl z)+E>E?23a+zWxq4O~H$uo6C*2Zw*quk$c4NrZl^fdK~qYEMWwDbv%6xxAw>S)Lj7+ zqh=G4OOdPtq`6WJ^H!F7i8fa!Wvs&H?OwI>J+v{duvX$1>@lHT{e5q_uWUwvbW$Ew zmSUuBf{W-4peX;F*nhDP07RN)^3G1tr8e)pY+3)AV2!59zSytgNBl@;Nl&XQf?Ru1E_wb>& z1&U183QJsrbSL)KMr)2PuJ#kN3Yivohxp>S7;XeSdkA4U_74$S5mcGPq%m4e60~AG z-{0&CiqPjjX1hmO`>^MVsniF)R+jV%$8gH9`B=XOy#gnnl$39k^_#^$?L5aaM2&@G zsIut$X7LpPZu&_t=Z+sZhI29eK?et!K6$3QHd-N+cu2BlGHMl;I6{kZrg+Abz2Fdd z=1qM+>t@1Xgi|B&N%WLuAu4_71XJYQsJp4rH40@eDxKN~d%l)dDU@dJdH?~cz=B#qpAO8LRM zOmurzS;O7W(La9t@QjrCI+$_i^kb8#=Jj9kPJBd3wItk$a{>=ZiE2Co6e)h}8IPaEpn>cBaboRr@$;rAq%Cb*t|PC2X^el)JRARZOlI(H3Ay zD5yEPxSs4!hNdqrKFqnF+YA}LG+8gtqxJr>wDda;0Ol`GuX*vLd#5) zyw)>nmXkCzS(f!7sKd32T1*?C>-OQ!l2V21_@821O23H!p55hvnG`oPyQpYP{V^dW zRmQJ4aMuxixGs|xFwb~5inU{TAXh4sAUlw2$Ri{a1rQ={XZZH5q}n3u_rrw5Q`NM!7nIvcttK_~icgXM ztQAe?tOyCsUNQ)jt}xwKa!@~W!b=&0rJFbqw39cFsl2 zIU+?t=cc!2&53)B1E>Hj)t9a!0d?|SwxNOA)04K0R*?Qu!3Wo~w9~o8#p4?q6q=*h zy5QkdwX~>5E8OhAKRzXkn~jZ2NDxI~-GQ>T{{B7N7SE@jYY_S4$8D|mHyYv7t?#A0 z%-GjT1Geq7(qvl;>j`T5`WNZ~cR#s~SDOL6rH2xd!@`KrxOt{`*BuliFNt52@#W{@ z;*vdFEh%*!e+SoEM<2TWwi7!#*qtdGvhaFU?=&QcY+GwAPqKu|CDRI5+n+D#m}Pul z=bKja<{66#TB0@5ZwCLV50%d~$o~{_bb!Kdwd5I>Jawx-N?1q>dgHS)=y9;)@P0D zs%%dec|Z=_u)OPF$NS8m3TjjP)WocOL)GouVtFm0L4ndwcf8ZSk+b3UGUYECI;5>W z!(cO~61QG+eZ3eX&_~4Wv=ZcyEXlc5$SS3|xasnkdeUyRe5vROhez4`+~ML?`2bo@ zCVny_54BnS^G$a9x7hD@;;*`H9=q4!_Xq2y zr}&*d?IaCusF^zuXU6Lf&*mByet}K8Ku33umR8BehO?@w3U=EQGpo8hn6D0Lz-N#* zHJ4~PzmP5-a*E2l)<63DcSYn1ckhyuM}*hb%BrcU0fmy=+S8M8#j`^e&q$+ZA_C3`t$7p zMI@8td<4x+B>!Kt$RzBp3~fUPNE{n8n+V=Frx&u&xP6QFL-8IJ zSjM0|D-CUXIa_M&4&rMI0~pml*R8s#gE%%nPCvO1>t9RXGhFLiS6h-EC|`PgbuA_9 z@PllKYD{~Kw)&fPy^6WlLLzb0+Fcc%Bedv_fvYTOX%JEkL6Rw`sHZ&-GmJ~@_$|@z z19z9dx&Kx4-I&mXX6OKWFYYvGGmvxt45R2{nf1yDNVVwn^scz8dW*v)Jjuz)XD(fT zURim=AkXOIcDKMtZGf0u;Lg(D+Z>G`LI zEJHJ)UC8c_c|CseWNXZ;>zj2Gd2es8|L%a{5-iBAc8mP;-N=6yyFa2ZtvryK&&Vk0 z-4{~*s((gNq-@8cH3y>xQKa-0JejS1avmP%EC_MRF`q?A{91c;G;-(oX!?djzKX;b zYzi`)I|f`huKgLA+{fRiGhduxI}tZ4*x~TzP2WH*icQYIuPtP3{pEGTZMzT84(!ay z8)A91&!0Qj_$!)YxWt}jp)++RJ1gyzMO|Pm9@CBlic!q&EPOzy9HIL+a%hRWxpYui>n^WSB{Z6Znl4JKl*q3>R}nM@J(q#;)U?N1vwT*50TaEdzscs9Qh9q{hfZ`^Kp;{zmiwFMoEif5 zP|8xis~5H9kFGmYV)HJwu4Ul;1it)Zzm?c58LKCK00Ao6q(E z^t$XZejBtssK8sG;qKkLcY%RH&%^{O-tb}n*K^P!$fw}@JW^80P{fK#O2!bKj~_oG z>53Gvgv&_f&va4S)6ml9|2|{mmXk|Gk{|HC*m2;RgzMNZz^)fjQT9Eb?);mKj~{Qg z@f8XK8EAgPqVDK;txNt`7Pe~+F!b-N>i)!qydjZbn#u)%V@4GF$Cq*KL^quO2ru_% zH+_51k_0FSbtnNlCExUv>hssH&o7BPo`pTQcMr6$J4tJ6>+JlzXS+bfX8JMy8SJVE zfHvg)Nh&IzLpc_XyRSb$>Dt)Z_EdU2(ACv7DzT&D(N4>7==)N;J7|i>Eu=#uYT5gW z0@NHSbx?x1RiSXAHNI=pZ)Dc3W||{8xw(t|xBeN&L#wRzS-A_m=p-fO%t~SXJXG@; z7U{S`^uf!X&&u0dEo@>ByDtNP-G!C~r3JT6s-PXP+b#&D*~=HYZ4*HM}B~_3(Y;ZAhu9B(~CWy zQ9C`#vvYGIj{UsQs$R9)d~z8rFF%qA+T(ADV&jpOeLt9Qx((e%#HxWv+Hd{$)=W#b zd5r`FB*zpFB*b%P@gBG4JDZwso$2!0P<~EB1zbS8kfL2(b%tPIkM<`SZ@6E+b?cV% zpQ3QsUSZd<8-nK5KLGB3@uZ^^ZEP}J(fUs_?njK0SN2wl034L}6mfJ5dizz}-7)zq zV;a)Eyj*Bj^^f|{H8-z)5q+BaD|0z}rDJ8eb8+=Jld_t?IZ+}(i`pdQnY+7nPMkRL ztF!Y=(N}D zuX7c?!tmtK$-E|m_wVWJ-_FuXMYxA)xidQt&olT`Y;3GjU|@Ae@{^}eF-__eZ6@3a{38_g}akZZ+ghV3-}FYDJwlDKK@Co&2$S}s11Pa?_{xOkZ=e^ zWDS@-_w)?occ6ww)!tW?qgc7%Hjqz%lt1C>8fznEOFd1I^*p7@O9^pQV@_1E%7=Tl zkUZt0@@~H-QHI1$a%WSWuiCUFh=050Hk>Yle;JpH5z}@utm6vZE_3wTZL{V21yG|p zi4I1P$7}v~xQ`izSOV}IL6tpe2x9K9knS>(}>L*9nC zO7=u*cZl?l=4Mam6+ji+U()d{_GVHBAME_?%~bbZ?tdZjpjp^+Rt0kH7gPq)NND8o z!c>>8TQ$FCyg*NnX&0)08z27@+V|`rwS?2)Ys(Pa6Ci4*DJiq>eI_?7w8&I?MvdC~ z$?*8uGa$Wp7R%WbR8gN3TNmRj8HETw2b=s!eK7<{mYuNBEr1-+EHoS!0a0F=h#^B z?SSR}vA;8%=~*D*9pZDZjvnDk@oSf+WOgv_8^rBCM9h+|%$BGvG6=#{yrIS4y8Vd< zfDYFk`=3M8@&d?4whnzv2yz_EYi02pyJcp^Ov|ld1q(v54xGmBGAF}-{`qH&I?TQ+ zZ4Pi}9uNz7PIO92J0gMw%_h$R=*RH*kCtxFx!YwebDfU@0fS&aOl5CCMa^j12%&h1;9xiLM%5I7Jx5X9fS64b1lIn3&f1YXu@@uN8UD4d4SIDcey^@)Md_+-&CR86HvsWD ze+JRVA4Tx#I;a(c*@qXEl$0ELK9M2p z5SrLDkc&LiiZ}3FNY_G8+aTZMr@7zw&u9+i8vz*3L?KH%z~)k?p*NtMp>CfvT3OBh zibg>tR}Wh)ovsKy4k>pYKG6VpD3a3Qz1STN{KNygCeqS@lr=$9_*3P@1AD)aVCssb z+iOO#r|OAyt*xMhzDLl!0elnxy>-S`*ou{H{9u@?{9#lwk0B*8t z(KAAj#LCL*G6fB529z2?j-Ype#%GlE7gl#qJ@SpEU@dCp54cr!Ts!O*4 zUYI0ZXE*;gA-o$j7VY`--+{$SffT9>+P8yp81or2uRSIlR^v#>&j4F}JW}SQR~P8> zhFMAx3>t*C06Y6~@AKW;w{LI$c@Wi;t;h3*RZb1uAtWW9GPzm}6__JEXviWc@)d(n z@3#la zAD^*KgZnW9fCn_~UcQNVTF8L|P&i=ZB;Yi0-@KUyEm6dO(+X)4hops_pYBi=7Z=|E&Vo1x{a^3N?)K{; zvVCgG3Y>C;uOMa+*jCS21AhsiO_GNri(AmnRww8e;x&_*UNuku7!&ZS8N@nP8#Wg% zniz@SX=e>OYLsLZoH?8qx7$0&8p5{$#c+kD+89CMg*XX7U_qq?tmIc95(NC4FVIRL zK}$Sl?gGzJR#SVKpF5&NBlqJG8RefEKOqD~qLo?y0v&~qtxPmRfP`UuN6&B602NXR zlqmo@*{PE!t-zux7dfG%sHmc$F$>6(XHoYKI5vo*NQNI*iZcQ*|QQbN)Zxw^I(w!aSFkL`Gs&c=t3~aK!E)f4#HFJBIWeNTs9SfIA0~ zjx36_R3f^nGhv{z5JiCi0Ma19z((2%B4A)Jm?Ug{0+9>gC;^1@!3r z`m(&1dbz+HY6Twor_$r|8#$pqXuB_-KSvxc#GCr?;WC0=Bs8)LAa+N~U1nfor(i>Q zu3mkyx#~f?tqA zBC$IZ&dyTbGw84|R!}Ul>-cI?b`1(<0U_Yf91%kg3CWPTAL0`rj1Djd_#wYp_LxqU#uc9@0Jfu@%r->}Q+-3CPNa~M*%q{>bWXeskm;@5TC(0iVuH6$#^;` z&*9w5J&&p3=iP*PnU%i7_&kXlQc{d!MLId`_p6#~$5o6i=pPcLZ_n9!wE4MX6$$gB z@nmW|4VsW+pgcZ_} zqhaHQNeB2PThp(EJfR%U!;A)UWPGF%yk8`6aN^Th~_acn)y30r$xE23MqyQ`U zn_GyUMoc^Cy@)=65cSjscoB9BL!;y4?*Lvyem(#;;kp${z}X`XEog)W5X-#${Qvr@ zK(3ixOlPNkrOjUQ;fYU))|${sm&3boO!9*OVp+q>Wevb;ug{FJurt%AJN ztanPesc#jsJZt+^1v5XVZ2q9VoI92K5M9i#r9Et>sQ9Q)g#1_)^{iNd#Wq3>-A;rB z7}wF&MQpOAkupBJl7AV`-l{P)-DYTHl^}c|v~#UI>9bI9SI^Goqfgp455Nn$ zS{$Mt6X?$C6Km>yyqy}KBJMi&r(nY^MZ#tEz$90yfK(FKnSs}gJ9^9at}rihS6SXF z6vN^eA@`NVmyrnUH*G{IgAsz17x;-;aAzoma~Ce$1|Y*h^#rVbYvBc|1t2l|N(em# zks9-#iOl%&MHh6^I|&yxm?e#|o|gx8g3LacTr0zY*la?qtt3)hB0m*c)V0B5tNQy_ zt_`GupVj0nu?@9_Gy#hcoGr{Qu#ndmg{{I&@sQ659v%~p5H@uYj2N(yX1=wsK4^=( z3K<*$Jk$$_`MFD%+7K0)l^)VoWZhIb^G3#~K12>kL+SmP%25VmZMG3WQcrUALs^F( zYqZxMOf%A+f3B)hRA+!m|1mV(#$x5|Sv>w+SPe+K|3EnJzJRpUu!O`%A?&(z(Mse- z0g3)h&6zMrsRtlmU^*ibeBd2&xF+f8>51G9F;9@Z0!wcSY_(~a7QMe2{0@A?Wa#wN ztgOt&xU_vD@bkIt_shMw5hHzN! z*cUK<=z|c^3!42x@(;j51^j&%H{X<-!PTx34SL#gKat5F;!7c+04|Tr0W3q0#1Xp; zbS(!I>8%KIL@gkLTj1l#kcP+r6-;6~_^aBz5hn!f0O3lUhegLx`8P{3)!wb)WyB-D zPDIr*G;5wZMWjCzx;R8?nLEbcYBI>{XI>X(F*uag*)$=}ZG@YMG4Y7i#$B6p@uc{& z`oyDd>%O*v-%rosQ{B@LK3K^=a9@7o;>RGVwjiHq85vt)oC1XNG-T;Nfb$nFTyTeG zp{J|+9T3HTHd+}A^Z*AI6vCdtRYociNc%|s41PJc@ZwF>4Jb5jVd1x+bP%sq7-aIN z&z}R<%7*;s;tdgM4N?LLIuIjwkjw8R-L#C1F0Kp}+Bbv|gOgEXPCg6(j_`2r#k0`& zc;t`qVu<2`4qyfYHdshZbaZ3z{&-8VZTsR-AzMH|08G=7s|D__Yl0^kK|wPQ`gH-M zw$H0$xn&Oi_R0J!Qo^=}wPHqQ3|1Z%4NAT0=wo)20E=AUg@#VzoT@uZ-xJaH{x1rf zFvpg{b=#Suyi3-Q4Yz=iKb~znIn0Ss(|V$R-(3S;RUcr`$He(jwsW7W^rE z2+a-|>U-C<&Ar6}P$>@OI>%q8vldTPb%;3XU^st12PK-3l{NZE8^7mrGu&>>hVg>_ zX~px$vmNNaL!*ve$Vc86OEnP7l!p^f6YM9ov~r$^p{jB8q~-bz(UL;5uLe_e$Vw(LF4V#yhZ0Y<`6zGdPPLk^)irP!Hfyr1 zF;BIoRBX)_i4xqF=n2iVbWMd7WuM1s*pIMu_tpdx`vWX<;yqg~TiwJsl<9Z|h;LHvgzMTq7izsJ$9a z*v(v$|B^70&y%T&%c#Z71#%r>b+zMRGCErP=+TMs(H>nCN|rme)%ScU?u9`}!Rz!H zvYQ83Hd7of=IS`He7LNiGRKl-rHd(Mjo;Kk8+7rk2F^*>X25* z(j1+uTU|0PnX)!y*a7W7^d`e4;)OiC&ce!4bXwvpj0!}-y+%fp4ME|`h4>Ch(+IYz zD&a@Pla^jaX~kshqTBuYT+bNA$QeFA)+!?4SOtG`RSGhf6SkgSFXrzOPB6FH;*Myl z6=M`@n7v}5iWe6U7z%weeUQi&agHPCbwSjrhKITfGB+At4LWdG)tby_81VJRZ6lj` zR{dS624PJthJ?TBVKVs#8Rj*Ma++IAYkkh^1vNg5Z&u2ZScs^4^1(UMGcsE2-Aa`Y zop7Bn9SlAWd9~d)gXOeA)joLFg4d&8SfFZI$VQ%Iy=s9qEp%eYZFo;UR9+`3Mg5i* zwR56Cw``#;Wx=oNPb>xzFNIY;cU((|@ zy`gEm;&sCD+)%*tHdKJmCs)DJK8p$ALUwQy8eS&@P7?j5Y7<1+yXv?cGc#K$tsHnR ze3@I$*cb>W&M;{|jC<2%PH~ab&&kt%XuOB`(ZJuUEa|=Hsy_mQS-G~6%S%xiRFPRL z#L;xqd<1p(>4T}*-np8~bN5_ZxQ>%DYqg~^s&d)8UCf39?Meu{vu&-df0OOgwgNV* z=&?18(*%XA$n63Wer!`ffaR!jL?1+XisqLGW~cA%Qyb>4%fJVI^#v3Cfkz?qzfU)F zq#o!bz5)lWnBSvJR!jw=Mtt9AZ{BeJfo`tYsw7H@i2cG8RU*`-_l54-pqJs=NcQm& zZ#y1LJzGh6!@nnY<4)yl3rq$we=u{rbx+N&g|WP(TE2Cw)%-)vMu2eE5}%*GT1P;u zCAmdUcq?0{cFg#|0tLmzF-7oz6&nR~e8TLU&PJQ1NBcjIOW0#C{OgfI+wU1J$nrr< zRUBR5=(9VockNfCXZ6dtgjhZ4o7xpKfpYEj=?NtI(lYrCJeID)i++#3tnD468M`Xk zuxH4z!7uF#wSTv^-lMvSKCNPcvTWrn^xldf`8_dTUu?-_$wkB@{MI^us}pPlti$0P z4kv@0eSkS`xu{~MnT!I@r3V5lD+?J0emeub#l=dJ?VnfMHu1dq#j>`^=~<&5b!l^> z@g#8=2PytJ&$^n=%!6aGhD`4|x&x@=Dvb#|8SYLY?qTe0ekr;J+bcN#F;l+2;g z4}F(cXVL9 zCb;Ntr1$+g3VDAvH=n1aosp#YnrL~CTKI-U(ubtWQOuW(9E0Q?VsBjQQV;H5P5lEk}WzCRgGAq>|T^3-3kaJk6pge#bnHNA6HLSj(fiUvzJO*DQ3CBDF| z>iNi|*E2*jLO|xj%yIf#i3ASOrOMRTFWK(oGHURDD;=e}70HrVWlsLEeWO`au6KsW z)HzOWM54d`Hw)t#a#3&n!d~dr(I(s74bswz}tO z*XGts4@=^3);=M^8@@v=LR$lYE;m*w=?!z@4W}i&zWcQk8)OtbF|qpG18)XgvB-6K zk$ABHH}PqX7wvmnmxbUj{uLlW1#-zQU^o`zSWNP73q zv9qItOH53Up-J!O&!6W&q=SjPMj-o_&F!NqMu{K!1~^+fS)nR&2nxKd*(75b9NGaG z)A;1%rLqw-0XWzmxUHTA5B-^WvFP==#Wzf(3uO%g5+-+peJ@hz zus@6bAeT)g5%}?7Alc04T+S^1CF}X|cznnH{)Xi+wwn2aIh$qo>Vk~HpjbxX-Ke)o zAxHNo#irZx#aS7wR@Sy!T$ZDzVz!-XZwFmZO3Obeu}T@_aPMeSlW_Ob9de zABL|Mwf^^l$rw&k-Dgy`Xd+Oe##AkMg?~7&V>$@E4X{p%< z29+-jx(w(E?dct*@H?=h=Pg5kvolEs4ptPvjM)s0GWM$KXTFPY$D<~{TppDGoAuGj z^;8bE`#TSX&D9QN&|bGc&i>X&3DSJ|swA_e^^4qn4UID(z{)z@CTfj0>0;zrn**YS zc7ME8Cp1?$J=xfptQW=b)v{P=)DskpDOb6=I`umY@2wF9l@~A6Ysm!RAP+U_FCw z-l+IX$8PI(7UAyua+7b<(x|ZoOfNY@y_LM0|K;k%WD4Mser)6JdZtAWX4=6sbyE17 zk7|79h~SNaYxy~C_Sa_otso;FSq9*!%Npp$8Ojv&yYZEUN+ZTYjU$HLC_p=Sgr~P%mMtB zdoTS^o9sPhD457;&g&To0u&~LNQ^4l*ooF#rtzFDiJYe8-Ae_Dt+76{G0J#woNlyc z3ofOTd;p`uHNWOK?kA3JcA*j_^%g_rh*`oej0YtaWPnQo${O6!sb(g((#&>ke{co$ zkC$e7%yBeVk$}DNJQ*gCzpmbqp%$*$t`t!GMi)dl9H#Afu#gxXZM|<$0k-d-4mMf; z?xh2P2>wo*VHN3^STW8~?TDiw?|9_q$U4H6r}8i0pw0Zj8xvV9nVe->pBc-W`fy3HTY9U_WwGicY(?GA^g2JGcKq+e z>-Qrz&JvCOU7YQ|`_TWA5zS6<2w$cd wZ!dI?*_u-}k_d&zQJfND7;*ZumAd#>(16JN-w*aIRFv$2{L#Jh@!PuRhQ$m8Vm?;PGS9(bj}X z4HJe(B}`rY)n(=rE6GBB%!KKPBdQG=bOw8azC312WU|svNNH?VhEyT5FZO*3AH~=C zy||S{#&yf~qmE>;7701qwhIHLa8_XG<8SS2wEZhY=JBITSBJJUR<*B=w#JudSDt-p z^=)^mj%ktwjY`IUPuy#=M74TgUkR;6@JOPwP};62x9xZgLn!0=5#bH>S>=T<^pzGx z^YQ3--GY*{e^{7SfYZFwO94+LQP8}&Lp#;6YB$~i+~-mNJQFmk$|VIH7q2$*p><8C zs@fB`b1p{@ohBhwZa&c&WocaS(U)C?p+-g$T|BH1fQ{)VYz4RaEi@PMqIC(=HPu_e z9(XjGP?~l_!*$bKT0uOUOjf*QVcqxRZ{kikP6Ot|pDI~HuznG93#`DdPA;`2OjveR zx`lffrq~F!)5}1xK(e&lX^V^v4Wq5R|W$Lr<-`uiz&$+PO%_?$i+pEcRR6f&W zVoRa#%;CE(`L~73L?81K4D&V94UE%De0*D)&tIVZJW9;X!y|J;UKJjYl)qCa8xCs3 zyf+&hF+!)p;T=!2O*x;i0t~rw^Lc$aazpB~t4uyQ=4W*Fuzaf0TP9SuBO)TerL@Ii z=7z}R$EAhLUlFF&&*MY6Co@TQGVIfuq`!Tu9*R#S2BUJ+fz_~`YySp}?8i~|)Y`d& zh9=w_bJmHHV}bZG?~SLLjtmiawtIs4>k4q3hv@pl?te`ITPRQR2Gb2YnsRdVNQ@<+4PPWJ|8Ss1JQUUiXLOBxl6U;4 zG%&G3sn|b%j4oY&XtnSf0bt8>M3Hwnz*qBs=FF-VI2I@8>*(`1VcR^Owz8gSeaqY@ z+$$mvJJ{m4n>3XtpV@BW`fp2WT~ECn?;$IU{7_hnlA-tmX1Axy4I!aIvlUog&y^OX14l*hOdO_bRJ!ClhuX(dCKG{iZXJ;oJe0TpT91Viww>swB z|7+svXe9yRyKV!-PHW+>qKT0{0tU$sKj)L?--!QY{`WIi&A*2cu^u<9EI;^fP2Y)< zV7+u{Iq9o)=)X_68QdWW-cM{y%qQa`W}qL~iH zz1>Llcdnm5hkIvi`qHj(b3cUxg(LHlZWF6-m60WoO(voS8qdZ>{Y4OviC;j#$BAOr zEiiWDIr89?=z46qZ&;`E!#gU)^)de~v!i0=G!OFTN%H^y=E-fM3*bAIo+s8(QTf`d z_8-R8*a`nXp*0mKB9%;*4WN7;qWW2mHQd_^)0JJXHkNp& z-$^1`E!+QIyK$dulAUONVF5Wu3x2)ig#Tv&bL!RZj}eX;@k;UMObY*dsGoi(!(c!P zUghNt_L#SCttxJ1j`tU5LSK&lUnmOUolTubO#ABsqi_G=IIl8tPGEDjF36aB^l2Jf zV+!g&c#tEUwaQ_`me{Tsa87!tpy*VY)Q0|?<1#{TD>cxQ%Ef2lF`n&B`}Cu&$f#H~BqnJdFXc=nKa^&AznBaw!RN|CuUCep$DxnsC?Z~tKa8fH1V0;`1om3X4Q zwFPB6waaC>_PvG`TL9mNij6D8am!=4p2pOl*+>i3qVos zG^SfIB~04JF8N&AxOVq-?6nx7Z(AgmZd3abp(llZP_?XSqI;uNS6|i=`cFj5NTx~R z+7zbL(Itn+>AxVTKr}A%@wK}?0l!NXV1aZzWmMv zU>O_>F)sj;^*^3G<0i?*~*rgMq^VTMz9uM$Y?+hD`;uGF~otgF6#@j zB^(u!p<8Vpy<4X--6$ySte3}@6D_u%GlpY|5BC~u-34kLAXh1>#WGW zYx4v{TsdVkc9RY1H9Ipx=GAdPB_*8y5GmZd7cHP|U_h_4=gX~XBE%W(1VHny2Q)|* z#WAV8YVQ`q&I*Ns!&7IQx8J{ey2;OuNtxFl_q6m8^GbOV{dV8Q+p0z6C}fBCepghZ ze5F5BC~8B@)!yuY8O0yO2@>G2IuUOii`T7N;oA{?AK~?t#D#QqoM465<@WOm@BAKG zr5L8{sdQp#^TtQ!pNw>=JG2F`czz`{hL*U!(3J&8?;f0BJbKT$bobvT z2O~P^arVZ2w#oEHZQWb-A#rv#XQ@!6V+J)6GGWIg<#sP5JOA%l0OM_0YCLC3C^?os ziDc(n=LRt~2}>AF9*$68nZA5Ys4rn!g;>EAsx@L+&$W5xf%tZyMhG)j65j zLRq!BV)6UQ&pkeBW1sMH<-ly$Q7iX* ztIOZRlcUytbT3*aENv$&EiTIbUf6c-6EuI%L%lh`@wT^Lv~Kfc#`SQCP*XIq`LF4)-?}K*wm9`n|Q^cv+sQZE7Fzu|ig}0JdSY zBM8sC_MI3gNP_aaoBrL?4mQJ78}uFDS7*X zb=Z)+G*2O-qj}VQYwB*D_UWArhhK(1PgvER#xs_M{}%a3U-(tw_XHA1NsCF5=37Wt z`Gkr|xK7MSXHMB;UIYC&uNWEDm~x{qvg_{>(Q{Z!VJ*n$)|M zg%Ft#RW*d>ZCAxr-D$`qAw5}MUGbeZ>+AW8w{_M6-RT5p?P$-M#83G>H4!Cvvt4Iv zc-tcJZPh0T1{ajhLj^2W9^PIRX+7Q{ZKCx9dh2DGtyx@BUQxci_b5keYs9swhHKkO zzsTm3g|wu#%bZT|w4i|Q%+1O9_Koescf-Xgs(fdqYPK};O-JVjI9>?ZAG{JGlMlt* z)5vPa+$WtZyvAP|e>g|7T_iivX8wK_!?{1CS)NB#G+J$DL6tE?OixGuJzK9F_XrZZ z-kp|#+DB7>a`Bk$7fz zg@k@+u>C-eF^GXjs-fmvKf#rJy+kmmyZX%3^&&d;$Zr-D7xUa*!ppvk81iMB+^)0@ z=y>NmQrcQ9yiRuG;99~mL-Nbc05f{t`0;^}z^6Z>cBaEC2E~S?1rm#Y)3llWg^qGB z*Fa!ktyXdE>?(uKHe?1~>u;XYOtNns(O5N3%JIcbT;F^GCp;NnL--hfY`lzA{YrW50rv zf;S!~KsrI5M!sG#AI)sVna~#H_N{+s;#uZz_ZL3nX8cVos_Q+dy*zbvFR_Wfn!8Q1 z*r~K~DvO$YXOA&T+dgH>GE=?v6Y6wPnT|0s3J!r~Jztkdxgd_s^F&S{Zmr82EPBdT zi5k)O@<%#O+Couy&p3#8Q&CfMOGqTlwI|k$$v66Sq~{p5q@Y68Ji}s~QmC0JF6r(i z@f9wmM*bvAYnZ;2Y3paYZD;ME_<;KKmCH9-4GMkR45bw`V|8#Zjr)E6JuY--qyuY>%=6`#?9vZ76STqnT5KvS4JVT-}P=4N3?pbOoB}v z({=aySFe%2?xae+DbBxkVE2!Q8%9(i`-|bbM6;=@{Nhc9;pzG92kCMv1{@E4C>A;E z$EYMKiPiGV2lK*OGVv1kju4eUlKnD85nm+$z`YhY5etGB>%cYqU-@Q#<(5FP4x`zU`oXy21d z_WdER7s`%*UF#ajdzT~Lh0NOR%t&JvZ3UDpQKKMqza2@M*x+{c>iz#y)^~%BNSEHL(lrt3MUdXRAc7!Bla_!50jbgvL3;01fkXwVQUoa?1eKe zJhJtNbzg}p3O2A65tH42_S_k)S#|Iq%q8<#dM$P0pkkNh)Y3%gKKoFhBt~nF2zj;Y z-s=clQCvQ+)PLv*>6}y7km72RH2<8ncmmGtynr5FW&JZo~)L?cM(}hJ(FQP zGKJow4xiE+2viB>b}2YAb>q2T0R>Uq|4{7abrf00V2V8eRv~`)n`8g4X%~bfA4IH8 zM(QM`KPH6FU!kt9syt}i(uNOr%AM9hygNENN-Ha9*3 z8Ldyyulw0A30iaVvmecPmX|#VGN!}Uam~wdZl4n)^mcR{GyGrwgSc%|qf z8ItIxC3w&*z6=a+K3=oG^Lj&;Y*a>?E^@w%?QI7g60FXAz!yh$L{WWC_H#;fjdeRQ zJy5j?6T9u)D|?oUt48&A(SMc$$u|#ov*Wp5AR$Q>dAtaJLAswF9G7hWg&pl2C(WlH zocGy(yW!nkbW-$2y7}wYH+zFMQe+1TCo&wCz5fEmC5Ma!Q)Vz9@jdIZceM$Lk| z|GQ?)b%lxpd|Vo`Y#h4}gL%_vq!ZPAX_UZ;sra!M(c;h6w*b;-SDHu{nrJq3$35gw zZmu4KhPcdF7O!ajkpeJ#8E~G*R$rFCo>`LC{rTw27L8diK@DccGUPFp%bMGu!j;eS&lu+uHCjKZv#Tjta9(CQDm*0Q&{!X|(D z7`{k*MUI=(#zw6d;ThJ23o-s_cd*t`>il;ww<15vaQ?$cJ!m++o@zfE{8ghOUS*bv zSiuqy2aFG{6;^EaJPo`F@SgDl1&sdWwRF({IzHR4!?5<8Q_8dN<7RbEPXzJoMe11{ z#)gHz=X5>vVcri`js9IcSq2>#2*s~hJW?8O`<}SKJ}=7+?S_0wSiMBGx2;?|viiz0 zf~xhOyicWK~&!>2N_Z3x!ixU?>CHqSkkN0{&eNswi12oD-)37A7aT`daYKuV|kR19`zei9R z`_!2;sO_mOeKJ>sne1#FzOhEh)3gqr%=mMN{`_v%q)HT;(bu<8zGj+wIZV@}cuF1j zl<&){gd}fj<$IAfCV7aNAus$-N2ssSzUl+#6x51YmGd~_E7lF=M5-SFxJ=nCeO#&n zyi3w$xeV(@MWiOfpN&ZWdiEbqAev&gfC?^t8f{?9#Z|SY%^QDghdQ=J!L+mKg2ex0 zJv{A-`T=>ViHpx7}U7v3zdZH@WJ zbJO-VvoEEflC%33e+|es7|IKjQFH6rUQD`%JCB#k;>=%Ynw#CrA_Mh=z{gda$U#Q2TD$jB4dVn-KHC%4YGk4;Fh4dAj>M;NyhYzS{NaIj2fTre9JNF=2XDUDz-WJxyA!^ zE{1=Y&~y0e<+=0oB2}10H>pR79WHz^tLXwe4GF;)S85eo|I#h8C-n=EVPygBWhI*z zUBdeNah5aU|8R(sPqvp_sPAWJFU#KiaqR|Qis4I;u1ayfCGhv3cqbZ|3)Kmcz$$i5 zujy1*rM-9)Y*6#>%nc{M)zO7bTFV-?c^2m1g`hP(OJjHb_2z9Sz!x|`?~V58XN5>+ zT?xnf-T4sp?^Qlv=B4X_UO1(7`xtR3ubw%^-Q685$8U-tW-0!qjtOrFJ5)RS zrcH$_by_nv>SrV384HZ+FTP?u8PiNVH8B~ukZSJuNzfQiWmnZ@a8+Nw()xbdQ%O;Z zn=J<0)FGQ<@7eo9W<_2;7oQe7BJ7ST?vJ*NEBdRew|EwA!^TJbJ&)91|BAxrV)l=W za|V_tZLP8Mc5x8=84AT_us#sVNF*~Q4m)EdN&EysGBUD_pFi!isDJ+W5fA)x-W0#M z3S?#s!zDWsDw?{3U9V!PisE>?tvL|uJ-=Q!rC2?59h?_zWR#$dAv^M-@@n~hwnoR^ z6cfep%w7Ev@9z6(BR$aF>iuJdd9|RN1)<3D}jE zZ4Oq!Q0!Fv_Lq|)ImpDdp^ayiH#NH)>K{j+Xp%nPB{V5{kh~%cy;Ht~s=dTZePR0;{fnU} zk(rj~c%QbXef`?g0Nk(-L+g5b@;xGRjnuk^nD!$1%n&O-@ixfFOap*jHNK9ig1wfI zuS^E8FYrDwi$eA>$Ro0XoUNMI10?v-S^_cZ-$y3! z{`NcHtfSqo45rWCxRal?a6`{+fx>@6#}(&1)my1@SCM|&fvz)#_?i3ek^XdFp$Hph zUi3!Gde=v@Tr4F!vcvR2=NfiKlb)Am0ue?HFx_uI=O0;Nj$!-=BfY+Ev3N~SsxX41 zDZ;?;W;g68#BFCFZ+$5)MiFvK))}}Zta0?|IQZm=7P3jcs40yb6`AXsk|d8qG_$*- z@)UR~IJpGnb&JVQM%k9{lI`HxmUk%K`S^d49nW|-(R-k<>|ItCyh|<)RA*WE8-C(` zU&v%6QL9okudPu6^!yLC4JRWV*vUQ1BU@@Wq9YDaD5;A%W!^elVs>{yJwKs+|)#Dz5IjNPc@Y zC9NaIQ#0lPD$Kr{+BE*6np%QvE!P{W&vvgf=9K&{j=fy)?K)WypW5vQt3}$2$yK_6 zpzEp0AMUkyAd>U9kV%twZp^D*D22flgo$|nXkDcf+7*qbyJ0r~e@&bu#rgaJSgapa zRUb0e;rXYGIoH#czGIP&?TS+3y;2WxIXy%H!1uQPbf9g@2m*c5O}w1&w@0#6&{8aFsD!u<;bC1CdPY_&2X)Aqqx-_zADiVb zZpmx92AX2>H02@{hZF?5#?8xSg4|T)Qs(SJ>Gefwuw2M|xpC=HI`d*oCi=pib~1x| z0?^WRo=OOsi9dozFjVmBk@qSC;A>sP&e778VCPOS1Bg<){W1B}7pQCu_F7Poy4Ye> zIJx30__=EiX=WK6^Wh-emsQflnfxp5p{KRf}kG#?@zu570P1o*%W6ausHe` zr2Q&6n5p4$KQ8e7)liqI0cq}OEBmn6ddSBA%a1`}fY&8C-p-vO-8i179fj!|NMtFR z#tcLjPLT52P)oE9&0IE(M~qKSGEi~iKQ0?+Aig(e-s^CI0z@uSF>5e*!A(9TU zBQ9dD9)QV|O*HYuEk*&F_6n2Vo1^dN*^G~`os*kyWesjgCs7OUpjdNfFI!7lxd-}+ z&fG3gd>{aynOfmvf(+xq;m@u>A2tz0D{GQT*&uZsKs~rZW6_Ej*|z@fv3;F;6My@L zpoRy_B<339QcVQ=;A3EX(I)w~#bq@$H9h_Ur8|7%*WCwxn($x>qZm@hI>XPdoL8d_ zFbm;8H^A-O3m?n7`!vzc!8W216hsJf5uOq{hTWxATd%+yidYj!l~U9@Usi&9_P97X zHJzRLzz+3Ta97?1)Lz=y*nlg4RLL%QpWGSNtpMPxTpTlcosg3Q$?e_ELgk0&-^STt zp}yjyX_`Br0BPCZ`C~7@t782QEs4EPwvKgIt4VyB6p$Bv+6jbjpP*#;K{kC6EnlcZ|J;!H87w9f@cj~3ISl#V+dPG5@o-+3pFtTV1rn-qD0#J zv$m#0r&dSSCIv38*;%Qgx$ZsbcjMsW)0JYscBN1`^I~#*${nWxamYvP(LDCJLsR2z zF*{|x-s^wpV17Mf`TOt8>m~Isv*?pmKpigwa zJ!FjfF2&R6kRVGDry$GnD1O30`x_Ya%!D&@kpMd3DDG01>Pt0)SR%_ZJ%9%L42^{| zPverG2T$@uw~TG9!aH^H?F)Bbs9 zJ|%p4Zd$+t>D_7)&Lq#Bf^4tX#o=|JEdzr3?CU?=z?nrFsfwI5; zonMnnOANp*e}7%If|-=FeLTrxP1{t1RsvEn^ojwmU>7>eZ74Py0+A9_Hj_kN;Tk-U z-38B2+xE}omFjQJJxmRYPQZ|f+4@j zJ|xgUct$YOz;)kq58K+&;eP8D^}MeY2UYW6GXC>Sy^8|5VH5cg`_s(%j(0{b3@hGp zApr3zbJ6sl=M(+M~uvgh}O01KWXuR_MZFx4t=liJYg) z?|fbR+tSoVt=(ll6w3|NrpzwdxNLYd6MrM`yf3@1)8&+?!;zi6122{CU{;{0p@DJS z;Y2Tm4|l4RKdZ1(4|Sj`Vxx?ioC`^ne^vHkNCZG+l3A#NekdCw<4l=l2}>?7zmGec z^YC-CwSS3gKRq}2)rp(Mb2s>XH44Xl>d*`{6T3kwz6{Bta*5my0%>q_b5^iMre;9H zcz_l8|2~~3$P9$sl&dfcP2`pj+?sd@N;0!FiZ$hxZYRXr)xNJDF(8@z1+t`j0_kx zI|I>4A6gM`EL#i=4%=$tw7;t3{QU8xa!UJKC;kedD@yANC(7fv%zQ+ZHX+P14>dcE zShbQbTY9y;x!dzE0_6)g)%Y~6zU>&gg_)XSg&^ze>$Tx~3&*ytyc-~R*7|dg2=jyY zM#{~MXk}O4n5$lnYhFIQlsk%NM+cu9iO^}-WIiJu?DCu{Ex5MaZlyR}T$fXAXBFt@ z!pTQP>b|*T0iMY~@e%p-@yd@jV03+?T7@N&WjslZk=P0)e`+8{eFHNHN`Dl+FU|+S zI_5)gKTGPK>=?=hx}RH6*is7K z9#Jt7j~mWb(n`YHMUP(QqZx0H;(++cJ0X7n=6uz2{5z&!m`=LNJ7OAMn}_N14fyQw z?<0C&`>P96UE?es*v$`bsV6lx+A-8b_h$f?|rux-Y;!LAr;cWO~h^75eSkL5~>ih!0@$%+)A4! zd3C7!z`E*%|E#cr7}+mcNA1Y+G7~1Oo;4TtxkNtf%MrgC?!K<>*QO?U_c7JUQ&uFM z!WkUSn$}{5d@z0bFGhkGmtte zAx{@Wo9j^RR%(A2st&cW^eR`idov{QmXv?d+5Rb_#$`c9Xi(5}Lr=jP~$3-WEUR&^$V6!OOek z;+U{&c0~a@|i#H?*3U z=b%CEf3OT4Z;LkoP#XPtM}SEW=0+Kg483EBZocgj&3jU49?RM)#8F2rPMD1F|6&LkdZ?QplP2;LN%1{JCb%8>FHmB5fv14coWYm z+8A-{7Zem!#O3{b-+Ic^IXOj>=k{;UKkQOyDTaUEGaQ$UrJT=l zP7|Ynx^W&zX(QQ$L;nkMlh?9>u7~Db+ViQ0p0=G- ztF4p2O<4hIhmtSH@v(g~^Bs|`xmphO`y^rG?0uJprD)c>d)QSeuW>a8;F_^;*Ej?~ z>9I#(-`g)?!tVa=<47m_f}yeu6wZgC_F*rrl~E!+xT9^t%)))Nb2|RU=w8TKv0_-e z>`TMlE?7|`+et8eq(3H_Vf?ZeAsp2IDOLO~tb=rPbWH4G6x}k(aG-NeXEU^xq28ec zmcd<;@^k}^&_&t_KKF9oZLN|U9t!76 z&BVbYI0l&B?_;|=NaZ(w7eYZu6y$8T7l0wu^|35}`BmEVea;EsJkPygXi!my4r-+` zjJ7&^OBcZ~0BK=iUXJ6-JO1_aCsWFR{H05e!Zc)}>Z-)gv5m0^!hxeYQmqk!Y;U~Q zY$XQ}{S7qb{<$BwMi|rL;$lv2?gdy-5&v~7&+N`{{vw0pjXbR`@XXs&YC@4U$l9Qu0da<*l@5 zBhkqJ;-b7{)7c~AfCiF&Citjqpyc>pRCeMfME(cTxpBYm{HPJ;^&>B8x zBBImW_K{M|A03JW;KqKxZJCSolWF8KZBi^G9(@2w4*pWbix(gIDoH*iv-Qx8-XbRd z@f)o=G_s52EZ<<#KYj}J1cS_}&=tnH$*X!h@uGuGy8+rr;4Fmw!Yp~t^@>AXSl&VQ zd&3D@yB|c&T~)Y2^aT5a-^@`#J9MFHu#50KfrVdvN-@dUL=rmPkGZ#wfcB6aY!b%m z?sg4A>Ia%-HIRZB+=Zi0vhPNw3cs$4n(!BHzpML9ud-Lo%%@jK-fUZFfA!t*xM#}~ zosv#aN=p99mHHH7(Y0^4H1a=u?#?=gpxY%E6F|8+6=ug-IaX^4d<~mfKRtb$<;+>r zK;?(2e>XjS_UF%^QsNEuV<(dfrx<#2JxTRmk8z43>In*nXTy>X(N;lv3dtTpYRf(h zv@}lQMI6ra*0D{)pukJuRlt%ns9cK<9n?Z7$4@y(Kk>SIr{wgg|a^vVox+fd7$;! znS-v1tusRvZpACn1M*1a<>eDrk@r?m88mmVPY;jRO4&@%!I_JG{SQpjW}1-2px$oQ z%@9QAIu{XL0{C~)B+VxB!6QiI&BAthZ|?mEfTKj39suO!<=s8noQL-~;$(xNE7~O9 z?x*q%K&}MZLm}Q_tfId|I>Sh$EMRr}4XFWGe$@o?zIk literal 27500 zcmZs@WmuG97d1MFh=PC#Dy7oWAf1Yegn+cPAR^s8w2DDUi=+x7(%nOYfP{2+cSsBj z!`aXKzTf%IkK?7+1rtx)_ugx-wf25|uc9PNMskA$g+h_ZJ$|5yLJ>$K|IVI)SK2?N z{(@gJJ=C?G9+*0sIGEcxncLc+P;T+T(RnsAJm=q<9kIQ3u~KP}i<>{g9e5@1{2Ke| zp!NnUM%7POsLIl+Zo!>u7T1y*3TeZ>2Fg{m{i&=1ghE|Ic zRg0VZ#vz(w5|ho%d+)wl95F@E-d7GClE1w_?tGL%1r99GFG~|FJX23qrS*R@HX^*Q zNy({G`gxdRzQE#Le(r5=MRS4dLYm0zQ?BMYGv*&}Sqtcnu~fbA9^;G9ec@21(dXHF z&+fW$f5xZ!=o?*~9aKC_=k5fe86WlDqh!e%uG+PdNLdY7WlC@5B`CST++a)UWFFx5 z+~OP8hjtN_@)y2e)6VSHT{cs1@sm)zl3q?79ABEAN+g-ymgJrO+n_EiKjayUS$~{y zEml4WMcR>5@bjEm*>@-9+{sGGCCc~#*AuO4uJ+yewr3`t1#bjgvClaovCpwhC>@{; zEzS9J`9;>}7EZ^~&y0&Q59{z&Grh+GUU4|(Uflt`y-Oh#?`Zf}d88G-sp74iiIo;B z-=t98@{?G@h{fX>-0p59Q5Rqbqfb!Wty;IUKfgJTLfu5kJ-Dat7QdR{?snN3-)xv3 z86E8qshWMeSekVD_FbYV8TJo1Rj#^d*!@jfy-zy*@ZLqYXqloI--P;&bxd$I#- zvi6lLg=}*ioE(8Pb3aFoD28$P$IP*cFT-Q+KKbN5(HUWuz46B~{119wVxlK9AtCtF zr%x(R)H%&xt`6q)OZ%I3#G9*Tlg^6heLxFnG>a^ml42$e*U@S&F2#h#dD^&k)u*?03qIl$*H1^E|oM24GdIGyb$ zYH3QQAG{1m&}y8Nk#xPMwP^z#Iy@E9WVa`^X#G0lx-|}halcRKyN0C?)74I7U0ldf zLqjabc4sntM@}1V645`SOHR3c(|SpjgOXHa&zbUOqa?RsjESM`Q@KE^1n%J~&ywsK zA*V%^`Oc&bhDQBVKFsVvhv(x7lEDq3@-LTsU*D13{nc?YMa(ml^g=V^sM3M9G=~aZ zTittLL%?IUr0Q@br{d-4Si*JJ0TyMm@GSm2Rkaj1Z{MyX_AjnmMOS6#h^R~t@Y`v) zxP&AnqBUl64A%5YJOnazh)Txh<70~37E%kl4@dq<9l&i9)@eEWw)&>eq4Lr+96zvj zYs7Hrl}>6=XDmiM}?VC=N^1WnN+X0r$LXOn6F(_AEBu|9Uz!lp%q+ z&srka)|x&^ickIR>ga2+^yJRYc)z=7qSRej8m_q<&!Y6VkHzI$ zFE`Mq*2lah%xFQIO7LUbU+{_S#HCnor$?Ts_lfh==FnjjP>};m0SYXea;o!3?%|bA zgYPOuq?NNfALe&Y{aWg_lNN~GSZmU-iHVLQAi-20=%jv?cV$S;(3woXj;mH=+wA%(BQbvz6%(^_v{CIi z7o{cIk5#>$IX9^DHGD(Ji4=A8q-*(8Bd;l@$DM?j^+01TW6rEaSJv&$ai+z?*|vm} z7*?X_!5Z_Dcp?pcr1 z#3>ZUoc45xJak$TzEDd+Zn(zWUy!|AyRf}*!X)n(N4%?Zx+a~4( zZO3y&`QDdS-IupRZqipJj|;v%@zWb4OL6|>B& zomW0v06P8XcdRZXNZVy761RCV+(a@ri5OJcFJ_?6>Hf|(?a;m*N)>s!~djzd>b zRu3!qrPjnmN1rLBsI+;2adDNh?B}R~Bi!xJi7tOmU7_{lk-XEK(q?>+R43_#KC_ic z?BNf%sy*|&D7Ca3*Q2zNb()XMFDSSU`*HQu02AiQl{tob;%yqPhnO!-A+(lRAv+NH z215Xc0)Dow#nl%S2yUvV9ub^!Cy%*p_@vKX$pd*aMr`6D>douduPwgZ_xCz=AO6&a z>)v{&8dE_;i3SY+(zbsiKN}!ekoBS6w&1efu_8WJwjl{Ny%2e?%ai z$GcCTE{M9U{{9{+*&1}6pOu^2>}YRoc7DFQ$Wm*#$g(-lq}gpHtK?vy8sFHbW!T;> zG_mS(Y5c%-+?^#hHnwtq+_Ry%S*^mwTF`dgi2a3;g!&_TlbIGefBOeFum9 z=a}8EfuE_U6_i{AcYMe5PZSNF6qU5*^97&2Ti2PdrQe$8xUYF@;y{f4K(#M@b=Ar{ zw;h$;ewQiENR@-VM~?5`k%C4^enHugH=Vq$aa|Q#x(UUO8|*U!Xu;uzz{^$9Wb*QDWORjVYlxzP>z8!d@Re+qOIC9CzPy=g!ecdB@K* zhw{6w>)n@;ai0y7b(;wmVr6AD+L>>MC4bA3=;q(rD*yKU_4}r#Ol4(ddZl)Lu=Ekp z(M@3t|M~Q1UX!;%DIfcD3_JgRm&MM-7`_V*PIcWFziTu4nUsoavqxF#;-yPQNit<)@ScN){jS}B(Hlk1uqM(5~e<#$j$De^gqD=6SKHRJzF zhn{VYq2n3v$2!opZg3M-$G3a??$obRrd@q_>s{}9agc#Gyn-PawRr3U2+FvgBrq|<-k7C8$`9j6F&r*JT z(~%&yQ%@n)RcNl3pPzp)89?##=TD=h?$n?g0w3OAX5sTXbdo&&rv~f#SV`$6te-gk zVCJp2F9hKar387{PwZAReV#T4jhG9vTn+>Ju6byz!wn%D#b?j1zkmN8Vp>I8`!VdZ zY$#o-{Y=x9D_1sm2Ml+*6}Y#0ly6kOe%p~Kpa;o- z78!XZnp5}Dg9oQYL_{D*`OG?K_SQyZU%q4>F!YgttTu+dx@$FfA)_|r@1HDPe%og9 z-yO_1;xas+7FU(52DG9Jtqd?pPuGfe0+^PXHi9cgB64Jkm8{39Qc+T@dTGO3Mg44@ z15|7iy??Ss7uvHb#iR`TO8dEeGgcxUC7wj>NTvsR-8td)WGyy_-}u~}eXWNJZ;6Y? z4-RSviM;8B?~~uUod$A!a^O%&9DiWn^Px zvl=Upf;ERwec<50$IHt*YFAH|l9sm9tET+-=TnADmoHzJ@)oafS>tPvLLcx{dF)Ql zwnVHB7kx~W@XUYp_x2fbn%}V9@87*kwizoQb?lTlPb2)Pu<$PI+M|aLiH?u<7k-B^ zIIZ*tTaOg;TJ*9a;3b2LrxoKdGb^}}Rfvf|PxT7r0PKZdc416w&;igwmbJh&vYwE0glY6r7Po2~TUANkzLe5>(? z>@N#qGqTG+FeyZLrN~{LZ;xw+%}rNJBZvB(Vo>FQB;mb)GxlwqB|L7MMjt+YjOBTL z3U2PUkWfs;dilrM*%wF(Cm4?X*j*XuDKJxpU}}3JG}hp?KNi^X!g#JV>fhqufQ%f> zm#!`q1hCh~DuxQpFMs{|_0Jc9j}o4Hn|mX+1<&ixD8&okgD{1o^EFJA*wW|a@C`7rr*Bm)DKhxu$D8ZFLkBdfA@e9?)YdH-ckp(bp*$rA;d_#flte(h2*F(tU6q zkIs@--mUi_^M&MM5*7XOy#6heFLI>>(Z&d6Nhm8%+?G;fN>{QgJ_GRl{reY(+v$WV znrqfc2VvU;A7*7|XJBJ{FXA}gm8B~LrNwN~bHaTg;lZOvs!-$T+-EP2d+qBZhotwx z)mH6~w*ff68m|=bIXRjzA1fDF=twZ>Oq6)=;DJ$*PD@M6*UZcy*bRP%#n?#>$)N=G9WmzzlG*KZ$E#&_Cqbowy+51fyf3<7@nA@WM#!MH#euQsp$ZMOsDYGJv}`dRFc=;b@&6| zc;Wi>mby2j?}LJ7F-PkrxPz@i+llcDK6S6p0jzx@rbmB*qHR+)M~PJZeA71V3Kvdf zx0#sUV0RWE4m&Sgyja`DUHu2SlAlk%e-?A)LN0;dtYa2#W_t0d2?NoJv*H9nQ{|jt z05_w0!uAamF$J9>R7_!~#S0NE%JW$zX9+wUJR#Phq#hBO=(?*=GQy7#SD> z>gw*>lun(&@8-do(GWl#-g7XHdK%tpwr_Rf()9t~wlZuwi8W_~5A@Qu$dH(zsid{4F zEURJqFN{MQ)7*l2)%{;{`x;p19$)`9bLL~31Kw1ZrxH>SI>3ZG6sB?Y;A3IgO8Lg{fIjNMgl~z z+Rv8Q)YSA(l2lRvF~#;&Aib)(dIQ|avoZ%JD9f;G!}i`R%89e^+TB-OzCc>GV59At zXQNlD7u z+SjU&_oxv9`~3NH1h>kaSNLEXA#R%?!fKl7eH0ZHgKRL7fhijPBXp$~sAN4n%D)S( zzAEG&3yywga0jhCvOlbU45>`BQnWo1gn7F>rIl70m8e?tElQje~EQ87S2ot^bo~@TH(7`G$cBhg;$e6&b1BvJYsYgOW^1GwM zMY!Pi@5h)Eyk~cJw|0pQEgVa@`UEcq2rhnt+j%R>bPO!Tyzkf5B=q(+Pg3m+zk~C-%xaj-4;mUf_@K=UwejsvG^hSO7#2J~`fpfVx0S+df$vU=9!i^ysbUgAgd@x+OM99C7KF^O&|?fdZ!pbQl;MseXma z929h@U2lcP-2wn+E&6^n9`8?t!ofeVXB!RXK1U&f;xbE+X}u3nY{soP}f zy&4cS23`z-MS~QwV4-oNz15++*27mmHrBaLcr|a&wV4m)Gg%H~BLW5oFgohg^Ms4* zVdyMVnMKlGje(UCW5;?!Z+DBrhZA|UEmPXI$EUTCl7T-nQ6z-Ht!E7lhQT z50{8w35Ddr&Gs(>CO~o_;r6OWtnjsQiEuPLPU%umw$C??Nn6PnjrUL)bt8@#4 zinfJaNa}$g1M*us{ek^pLF%Lhh?+K}p`q9ARoM`lsiYGe3rO-m@gfm$lUtChH>P92 z{DHb|kH@(?I67YEF+z1p9&v17j<{?wSY|PoRU;^eR^yeikS+P{J1>D*)F$5xxCS5O z)G0KA%hdBZ-sRBF^@YzjsmSGCccWVqFXcGe>l=*!tSQ=(evR`DnV{jXjkKs7<{XM^ zNnu}OJG9bXz77p^!pQ#`fR}${?o)N)N)&uI`djM4FHuN=?>~ROgR-Wkr}qcc?GTVI zAKVr(@ZHyM-duz*Ji+fvdE>TZk#E92Be!B(wHtj4Q>m21*ka0Y%10S$!UaZK=L9n4fO4sOd$E|w{KOey}cBf zF9Y(;Kym19KclNw3S9w&wxY=C#NUC+1?Rsv$1sVInA~oCR0NOTujco`ql<0Ey`dN_~QRm0I1I{~4%_)D>+K3Km#UGzma*d$)N2rM!KsC_` z#4sC%Z+ol{W}E)IXqAQpf);gWaI#xmJ{EQ1t~N z1^)i0`m^=hK;7i%QXZI{qYx#ULaBRLb_^_t5SVTf=dm6R!j_TeU}z&cLp}0P>3D zCSrud3)}m{kt_zX+trjM9s-X`5Ow|rFrJc;V!7Bp}vSUJBtJI#Ps z{@a*H0>#+LZSgEWJ_n~fR{hgHJkqv`zMw^5F+6}i4HDb zC?q=I3#=aqgS)wMu@ zv$$a^Cc`u_XS$1R$bS>IAF2 zUbSx^iJiSX#v%;P-FoQ^c}J2|Cpe&MzfVX>NljWK*;Yr(A|NPl+Si8vLD)ba)%U80$E5vXi1b%bVF1s4<;jzEo z4qCiy{);6N;q+erE>`2VNy(@MU%*x<#`3+PGDL>~1>gq}_~owoH0_;;F9E8OlC$KB z7$wV->Pv=CYVGu6E=diNa}45qMQhHG-N*&+$)@_)MH06u6GA7^3fS5iKq2`U2o_LL zG(a|3x0iuOL6({KXI_VDLYd@!$OdwAdc?Lm6_hJ-Rw(5i)ZGs$#5Ylh`7)U62fQc| zp!jd8y$K*gEufeA1V$n~Jsngp4>-PwZqw(cXJ($2+5!2$H469wZ*10)awB0;pPDQ4 z_WaZvDuZMwlgQx^pBUPN$N~ee`VEPUGePOj6uV4``}pxqPQI9Dv1nM5&WI6z#eREx%)IO zQCmq$Y^_nKgbkodtw#j2F^3k9LTFkL_Zw;&vhq;1i~#}>V;13E@$rgKnGtsyvE1h7 z!s6oEBH7d+CTMzoJeh$Ufx55R94l7jee404{;b+t0vsbI4vrwWIeXy#2#kZPz*h2DX%ypt2ieW31_OlceLJghZ8^8i1^#bx0LKhMH*wup0 z(ybEGnHMi#*60L}Y-W-+;($K2wsCF&AoxYSS8D0#GEMz;dp1-&yR> zq6RMzh;k&<@rbamCx2CP3?vY^g;jY4Dg-i;3B+@ zH0kZzw@cl&ZbNlMP)ZM!BCt4na0QTXMBZF4UvUFf0XYzR3!};GYCCz~quj*3v(kN( zOnY_Z+tuBfni9IN0qy&}KlVwVncG1b(KJd_zyHf27+VpZFV5X{nqZ-AXFAfv?)3fI z`HER0c^}_<;OhYZ-sa*8fl{4o-ouRSPmH0r9H?T@EQQu1lpr1i2K4G-(7}E2Yv5yf zdE*oOF&H6;TsClcV0d#6+ zL_w$^w>$2AWc?`US}lkjVVBiwaND>wTOS5kLu?}jq7MDm?vhq2&NMya56U>63r~1?n}xw)$98$Om=?u|W{>i*$b=&v%-r zZF4OLxc&gBLFt5h;n-72pufBPQAIa$mfJXaCd3#)X{uiGqb-;LV;cK6F7cUT4Lpr9=DO&9M8t~Qcy`c4Q!&NQ4dx(QeE%YNd_fwor`Fp7NFvy0;`ElEz*jlb*&Q$DL*@%oqIv3DZae&tCHk1uM>*2cwUb`Al?Bsx}Jgaoe zv%zRm>$pEFpRE}tTr>5P9VeL??o~%EFP<#NoHk^i;229BV0G26@*CfKu5327d_!#w z?IXuo!Iq4U!U>iUsukCjjvoB-k)~*L8KO^a+`oZZfJ*`9r43~tJk6QZ7=zo)%x@tl zq5+xuvvix6`!aw*Od<3KdXu1PHoIgfwxG$oJrgRG4~{2ju=gK7&VXRQ`%j`8une(Q z0YhOJ2tlXWx70R9AcTOn>?~*GY;U)5J8sX)-MMo|*nax-WoAVqXeBc;GG4fPwGqyR zxM{DtlKrN{e?y)j4hXoC2f%``OKC~h?!LM}E9x`}_3=ElU=ZX5Vysbe8z=$-v)#FK zTRmXbsR%~_ZGUG{eQDVG0 ziHT0$AKNZ?X?i6jTY@3!M(KMVBPTOw{M!pBTgqgk4+5ChCHRS3-&hbCAQwWxF)@Ww z6SOt{{laWB?3D79!wC^xnM3y4>NG0UpyWNv88K}2%aH@iP<4vxmZlCasn`Ezv}E%t z^i*fOvN%xxIR*_JBQ9<-(+ksOd}}8o$6fU9>v`tSdIl{$UvDXLY_%#Smzea!Ljlm1>rzuZzv;r5yb)A50-LR5FRYIAXT_@%Mt zzpC=`Bv4MbSYGY)tm5upudbm$|J#zv-}z{YGnU#+>S6^R5)-*S1i#TVN(T+f@XQ^KYTvL55gq5sZ@ zBLf4Af4{r0<~5^WhpI>fCoCwuuTa*h#8+3pED`S@yU4fGE6?=iDmycG)$5QvDfE5} z<)!g!dn5Ff7dfp)9RGBXax@w{=&(oKh}|=KGps=3#=M79i8RAtprK0VbdYQey@F-xSgJv1I8EfAC5$mu+3H-o%A7{ zS`vGMCOGICFO)5ul4y0=#8&uq*WH&VAu%ej3Yb4x9<{sIf5p1mf@I^4#4ASwosiDk z3v(6RS{kXuQ%6m2u4orxMP@(UCt?4n1+%5V=UA2x@YG*l~pumc=O8m4GrQ~ zMZ_0dc4OuIu9;gJe)vM~B7BdNYO#;NBV2uYB}-k)Ry4Kl{A`a#T48*A_ZHTJX5(lm z(OZXHWofnWR1&(PC1v8Aj$nnPmm~8H3N-U&oM3Iq)MZi<67>M(rKgMa2BbC~ovz4q!(3+OaW6oQ@D!M;#UFA8?iSpyA zemEUNq)FT~2X2I030gZ9*8fGb>%3WH+trYdA&lI`ZfLfyn8y(;wO8=#kkHW4DQRneCdY79%C^vc zb*kLlWUQ;Z^mheS+qZSSr88n9=BOfpKH`Bk?FMdHRaNy8jPu-c^!32@&7tZe>dq;g z-)SN6&nn!X*%Nv3H6hk2Py4R!%Z34kZ{`vkC)F&(i>jse*T@||gV7|s`bGBVkCaWu zFLbU8)DFJeC(^OwJ%SS5QN*k(I}@B$Y1U_)(uJkJGo>X)LhGj^K@{7^TlhSHaikEl z@S-mjyva#luSu$fOZ(@Kvbrr9vZlLLx*UYy~R&k>5QH5(O2^-3Cek{Cyn+(hUbuYwyDq7F_ zMi?ZQukTZFd2L`qbz>ljiD=j-vuf;dm6UEGy~_e|fz2NNmMS?*0$A+ZvSgW0K+SACpYm+QqQ3=2;+sp9Hizzd9>FW-{;!(GPo=<-Q;TH!?CKvG27{e6yJ z=j*qN*(X*F1oFp6OKT&_${wkN@nWvoMZo1pNA>j28%BXcq^^Di%pga15*QmL^`6AO zT_Nyy@wSrkG(x9E9M!UhETs4)P$X`QJ2la zQPQ@&;^5)gyVGZC9og(wii!=A#tsS8e`m40GL#Q!_h$9pWwd?r+CsRxyyC(B52Kxc ze{VD9ouK;cA61qWmHxdI(oc6%A$NRL&%xWCw8%4H zsm}#v>0%zr|1Ayw)cMzso%WXn>jq_BVI^9b|M!Tj2@&Izbcx+LUbk0qq%N^gd& zh4cTj<0z3NHoXCU5{?H(vsJ*?$UG!BxN<$cJGAocF%?>DB71q-vdUYZ4`+0O7YN$m zyQAmK4i^N(9s1#e@tV%WaR2V=Pz1;TP%MR>xocVZS$_UK7pJU*(+qm~{H`6gcZR^wVs%*@^3 zMmBGQ#X@9w3%l|>pB}5KaK3Do0i%ECKi3jwxVDSBd_;kY7s#cOlz1Yb@7zbY+Sea- z(w(-9mZKbv(}&Toveb;s-rs?}pK$&$Cl~!U^zoBg5B+9|kM?uS(ar2U(#bjj=&?M0 z-?sn$d{=wAmAF%|QZ&Vi>^8EWehbKmuV0OTOxTs6m#-2L;x3>Z@*gIz-ZSet(1I{| zAN%*nE9xdpr;_3MnP3f0?ENRJ6pF~BE0$anSyxKSsRI;tw+iL`kP%*Zu%pq{-uDt( zOXmhEHNQ20$@|(9_QsB`jjD=qyjVA+q#o{-??rtk&9U%Fc1Fei@!|1PD)F#pASB=Fk~iXz`|*|mGeHkd zWDH$#WV{CkhMGN=LZg0k(`S!z$(5_j-VkwM1k3U&B5o>1PfglbbtpTam-4N5#1qTa zFslqP;?qgO_H{Dy&T`7+zAzAVeb{xMH*SZWjcZd>_>;qF0W7-Jv8ky$N?lJ+5kxgq zBR$7$YN5O!{M zwlrwD7^Vwi=BhmRJw~gad~V0yT9K1=aQJb4z}=2kR_i*C*L4#icmM^|#q8ByH8nMT zyh`fWfCr}voeZ)e`g4@1k{OBW&Y+3{1uX^Eh_KA|{CvKo1jGCH{oBf4zdj8U4c|x3 z*+|WPnTX;4+t(tuBXU_^KXDeXn&{YZG>uA?n&6;r5g(C^!arCFjpjO?C1v1#UV`c? zTz>UI=lW>N^vxZnC*6}3L^b54Vj@L!Hxf^25>~CLrA8j5e3v@=NLJQUIprHTvhvP` zSPxtB+<-sFY&)AZeSPWHt_mhaWG)6*<)~zey`H(>daPQpd3>w(#BwW@+J_e(mV@@a z=PexiYqP3_6Qy%y-IlJnMu0*qW?#H`lI6+n>US2@;W8ctO^meioPH01XM&zC)gF2Y z+#SlRLMErApFY;({Y2C2xxcxJ4J+BmWGy0rQ4w|J#w{a=r_o~RdbTJ8uXbHn@ ze53=etef{LRozXiVmh4b4E0o7Neef6N!-6NhDJ8`pj+g?VdkiHf39g?$S~b#i^^nm z-__N(R7|L-X17uz>#l};S*N&>r)v0sg@A>UHMnvB-5q)2=HYAoTG`YvgwN2a+#SxO zK+_B+ezB~eo2#wP$Q;p4Rf6}G>ep_HGoRbU9Yn>5``c? zkpVvN{pO}GrS5L~rn@J4+xc!6a=H7GRc`d8tFdfvZ|mW6k=)cfOF0@4I{YR_Q>!(O zu)luc(j+@K-e|kX1}E+9Q$#J*g~t1%HHgo4s2UWBdg-{kC+-a;Mn2Fs{$@k`IV@~y z9>*9=D@K_sB9jUeG!GuVEhx^z2?J%h;x=`(jH*f{3zfT_sdRgs=4PqpvULYsJrS9rM7274zV;%`d)*ecd{ z2!#picQzQ7z%-3zcI$|eZ9BP<8vOCfiX>TJFV`9D<)>U(^U}}-MBTOQ{}0BQI*|G@ z*BF`<1db3Ie)dw&ELMo|7;84pyFgFBL4~<;kn*%FdU=vv*Y#Q$TB^;Pt&^f+C!pA? zYA1%{SzV1Ep+<>Z4sjym$xf=2B-p87YnKU|AWnnUY3YKYphn|cjhwNe;RZscISD#s zU+2)a*wanQ_17kJFAEdCXjG@47_szE+lw?%C_?~t;#LgrJqu$WBgBj`bi{Iz=RzAt zL(~q&Tch^=YskQ^PocorvgG98U=$K6k!P8D0t234YVv};7L(?SKq#qqGJKgwNN8Y2 ztX%3vp7!EULE5q)a%EIF>FqIjKi;E^^V%!tEB~Fp`CsejCdTvO;xbu{0n>kfXDvHj z12b&(6f&rR^NlbBb?CGSea8K$8+%#^@({u9!_$<4@c6}-#!k3Eh~ECR%WxtVaNq_; z@xX09|HpNq!X-xd(RbEkF97sfo^DoIOr z$Kf6zPeB@P1~j_%68?K3lOYp+9L4zG%Y21VP!ops-q$ZFpNx`xk;g!D8UI_&qR#pv zRZsIaisan6KJ7B~fb{pr@RS>@PWzk~JQ`HmINip2^N?wGFBy07zo#H<|4)JY`|aTs zDk`z20Zw*y$CR+c*_cOW;VA+)-|HzvbJQB=y>fA9`0x22V{{chL4%MN8jg3^*^!43 zOsbrW%zp{s;DoT+e{O)wP z(gRZ5YDWS`G_6c$=%g}c`xT4(XlP~05 z_I5}4X{1ldRuv}GNqjD3lQ2#g`c2T|ew`lwwLMo`QjT?yozJPsY22qgi*ugI*xEhq zFTG9meFL9Ej`>G_6tO{xirVP&usJQ4Xd`Z#R}_t&<8CUL$xy;HFrP(N`AtmV?$z8R z3>is6r!qtg_PHOY6WwMIN|eI3N?&-4Njo~p`3;K?&4%0D+?}R@0B>%U7mI2voSpa9 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 diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index 32edb57475eb5149bfdac462c5be20cbd8d1784b..b5de2701e95b40d24d1fdc1e92e8875eb324543f 100644 GIT binary patch literal 18914 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 literal 7608 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 iqsi2n$CW(P8uv#BsueqAUXo{X-V