diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 980f9b8c882..7b46cd30877 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -30,7 +30,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = 1, on_floor = 1), \ null, \ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = 1, on_floor = 1), \ -/* new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = 1, on_floor = 1), \*/ + new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \ diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 13686960cdc..4ef3a5dc086 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -32,7 +32,6 @@ Assistant /datum/outfit/job/assistant name = "Assistant" - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H) ..() diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index e1987dbdd30..38705fb0391 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -35,7 +35,7 @@ Captain suit = /obj/item/clothing/suit/armor/vest/capcarapace shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/caphat - backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/station_charter=1, /obj/item/modular_computer/tablet/preset/advanced = 1) + backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/station_charter=1) backpack = /obj/item/weapon/storage/backpack/captain satchel = /obj/item/weapon/storage/backpack/satchel/cap diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm index 661069d1d01..c8f4203dcb3 100644 --- a/code/modules/jobs/job_types/cargo_service.dm +++ b/code/modules/jobs/job_types/cargo_service.dm @@ -26,7 +26,6 @@ Quartermaster shoes = /obj/item/clothing/shoes/sneakers/brown glasses = /obj/item/clothing/glasses/sunglasses l_hand = /obj/item/weapon/clipboard - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) /* Cargo Technician diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index ea74d8aa0c1..faa6818ec73 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -31,8 +31,7 @@ Clown /obj/item/weapon/reagent_containers/spray/waterflower = 1, /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1, /obj/item/device/megaphone/clown = 1, - /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1, - /obj/item/modular_computer/tablet/preset/advanced = 1 + /obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1 ) backpack = /obj/item/weapon/storage/backpack/clown @@ -89,7 +88,7 @@ Mime head = /obj/item/clothing/head/beret suit = /obj/item/clothing/suit/suspenders backpack_contents = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing=1,\ - /obj/item/toy/crayon/mime=1,/obj/item/modular_computer/tablet/preset/cheap = 1) + /obj/item/toy/crayon/mime=1) backpack = /obj/item/weapon/storage/backpack/mime satchel = /obj/item/weapon/storage/backpack/mime @@ -135,7 +134,6 @@ Librarian l_hand = /obj/item/weapon/storage/bag/books r_pocket = /obj/item/weapon/barcodescanner l_pocket = /obj/item/device/laser_pointer - backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced = 1) /* Lawyer @@ -167,7 +165,6 @@ Lawyer shoes = /obj/item/clothing/shoes/laceup l_hand = /obj/item/weapon/storage/briefcase/lawyer l_pocket = /obj/item/device/laser_pointer - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index 2bb570bcdcc..9eaedeb2552 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -26,7 +26,6 @@ Chaplain backpack_contents = list(/obj/item/device/camera/spooky = 1) backpack = /obj/item/weapon/storage/backpack/cultpack satchel = /obj/item/weapon/storage/backpack/cultpack - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /datum/outfit/job/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm index 033288a82e2..77bac526440 100644 --- a/code/modules/jobs/job_types/engineering.dm +++ b/code/modules/jobs/job_types/engineering.dm @@ -36,7 +36,7 @@ Chief Engineer shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/hardhat/white gloves = /obj/item/clothing/gloves/color/black/ce - backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1,/obj/item/modular_computer/tablet/preset/advanced = 1) + backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1) backpack = /obj/item/weapon/storage/backpack/industrial satchel = /obj/item/weapon/storage/backpack/satchel/eng @@ -85,7 +85,6 @@ Station Engineer r_pocket = /obj/item/device/t_scanner backpack = /obj/item/weapon/storage/backpack/industrial - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap=1) satchel = /obj/item/weapon/storage/backpack/satchel/eng dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering box = /obj/item/weapon/storage/box/engineer @@ -123,6 +122,5 @@ Atmospheric Technician backpack = /obj/item/weapon/storage/backpack/industrial satchel = /obj/item/weapon/storage/backpack/satchel/eng dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) box = /obj/item/weapon/storage/box/engineer pda_slot = slot_l_store \ No newline at end of file diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm index 0c3f477f232..1e1b2d71311 100644 --- a/code/modules/jobs/job_types/medical.dm +++ b/code/modules/jobs/job_types/medical.dm @@ -34,7 +34,7 @@ Chief Medical Officer suit = /obj/item/clothing/suit/toggle/labcoat/cmo l_hand = /obj/item/weapon/storage/firstaid/regular suit_store = /obj/item/device/flashlight/pen - backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1,/obj/item/modular_computer/tablet/preset/advanced=1) + backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1) backpack = /obj/item/weapon/storage/backpack/medic satchel = /obj/item/weapon/storage/backpack/satchel/med @@ -81,7 +81,6 @@ Medical Doctor backpack = /obj/item/weapon/storage/backpack/medic satchel = /obj/item/weapon/storage/backpack/satchel/med dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Chemist @@ -115,7 +114,6 @@ Chemist backpack = /obj/item/weapon/storage/backpack/chemistry satchel = /obj/item/weapon/storage/backpack/satchel/chem dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Geneticist @@ -149,7 +147,6 @@ Geneticist backpack = /obj/item/weapon/storage/backpack/genetics satchel = /obj/item/weapon/storage/backpack/satchel/gen dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Virologist @@ -184,4 +181,3 @@ Virologist backpack = /obj/item/weapon/storage/backpack/virology satchel = /obj/item/weapon/storage/backpack/satchel/vir dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm index 1fbe1dbf290..b52f8ac919a 100644 --- a/code/modules/jobs/job_types/science.dm +++ b/code/modules/jobs/job_types/science.dm @@ -81,7 +81,6 @@ Scientist backpack = /obj/item/weapon/storage/backpack/science satchel = /obj/item/weapon/storage/backpack/satchel/tox - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) /* Roboticist @@ -113,6 +112,5 @@ Roboticist backpack = /obj/item/weapon/storage/backpack/science satchel = /obj/item/weapon/storage/backpack/satchel/tox - backpack_contents = list(/obj/item/modular_computer/tablet/preset/cheap = 1) pda_slot = slot_l_store diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm index c683c233741..946e31e3a64 100644 --- a/code/modules/jobs/job_types/security.dm +++ b/code/modules/jobs/job_types/security.dm @@ -46,7 +46,7 @@ Head of Security suit_store = /obj/item/weapon/gun/energy/gun r_pocket = /obj/item/device/assembly/flash/handheld l_pocket = /obj/item/weapon/restraints/handcuffs - backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1, /obj/item/modular_computer/tablet/preset/advanced = 1) + backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1) backpack = /obj/item/weapon/storage/backpack/security satchel = /obj/item/weapon/storage/backpack/satchel/sec @@ -104,7 +104,7 @@ Warden r_pocket = /obj/item/device/assembly/flash/handheld l_pocket = /obj/item/weapon/restraints/handcuffs suit_store = /obj/item/weapon/gun/energy/gun/advtaser - backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1,/obj/item/modular_computer/tablet/preset/advanced=1) + backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1) backpack = /obj/item/weapon/storage/backpack/security satchel = /obj/item/weapon/storage/backpack/satchel/sec @@ -158,7 +158,7 @@ Detective backpack_contents = list(/obj/item/weapon/storage/box/evidence=1,\ /obj/item/device/detective_scanner=1,\ /obj/item/weapon/melee/classic_baton=1,\ - /obj/item/weapon/reagent_containers/food/drinks/flask/det=1,/obj/item/modular_computer/tablet/preset/cheap=1) + /obj/item/weapon/reagent_containers/food/drinks/flask/det=1) mask = /obj/item/clothing/mask/cigarette /datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -214,7 +214,7 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science") l_pocket = /obj/item/weapon/restraints/handcuffs r_pocket = /obj/item/device/assembly/flash/handheld suit_store = /obj/item/weapon/gun/energy/gun/advtaser - backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1,/obj/item/modular_computer/tablet/preset/advanced = 1) + backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1) backpack = /obj/item/weapon/storage/backpack/security satchel = /obj/item/weapon/storage/backpack/satchel/sec diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index 5b562ab3c2d..dcc387d4d27 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -41,6 +41,7 @@ var/obj/item/weapon/computer_hardware/battery_module/battery_module // An internal power source for this computer. Can be recharged. // Optional hardware (improves functionality, but is not critical for computer to work) var/obj/item/weapon/computer_hardware/card_slot/card_slot // ID Card slot component of this computer. Mostly for HoP modification console that needs ID slot for modification. + var/obj/item/weapon/computer_hardware/card_slot/card_slot2 // second slot. popular demand requested the hop need to insert 2 ids. var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs. var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage @@ -81,7 +82,7 @@ proc_eject_usb(usr) -/obj/item/modular_computer/proc/proc_eject_id(mob/user) +/obj/item/modular_computer/proc/proc_eject_id(mob/user, slot) if(!user) user = usr @@ -89,21 +90,23 @@ user << "\The [src] does not have an ID card slot" return - if(!card_slot.stored_card) + if(!card_slot.stored_card && !card_slot.stored_card2) user << "There is no card in \the [src]" return if(active_program) - active_program.event_idremoved(0) + active_program.event_idremoved(0, slot) for(var/I in idle_threads) var/datum/computer_file/program/P = I - P.event_idremoved(1) - - card_slot.stored_card.forceMove(get_turf(src)) - card_slot.stored_card = null -// update_uis() - user << "You remove the card from \the [src]" + P.event_idremoved(1, slot) + if(card_slot.stored_card && (!slot || slot == 1)) + card_slot.stored_card.forceMove(get_turf(src)) + card_slot.stored_card = null + if(card_slot.stored_card2 && (!slot || slot == 2)) + card_slot.stored_card2.forceMove(get_turf(src)) + card_slot.stored_card2 = null + user << "You remove the card[card_slot.stored_card && card_slot.stored_card2 && !slot ? "s" : ""] from \the [src]" /obj/item/modular_computer/proc/proc_eject_usb(mob/user) if(!user) @@ -114,7 +117,6 @@ return uninstall_component(user, portable_drive) -// update_uis() /obj/item/modular_computer/attack_ghost(mob/dead/observer/user) if(enabled) @@ -158,14 +160,13 @@ /obj/item/modular_computer/update_icon() icon_state = icon_state_unpowered - - overlays.Cut() + cut_overlays() if(!enabled) return if(active_program) - overlays.Add(active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu) + add_overlay(active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu) else - overlays.Add(icon_state_menu) + add_overlay(icon_state_menu) // Used by child types if they have other power source than battery /obj/item/modular_computer/proc/check_power_override() @@ -209,14 +210,9 @@ /obj/item/modular_computer/ui_data(mob/user) -// var/list/data = list() -// data["active_program_template"] = active_program - -// return data var/list/data = get_header_data() data["programs"] = list() -// var/list/programs = list() for(var/datum/computer_file/program/P in hard_drive.stored_files) var/running = 0 if(P in idle_threads) @@ -224,13 +220,6 @@ data["programs"] += list(list("name" = P.filename, "desc" = P.filedesc, "running" = running)) -// var/list/program = list() - -// program["name"] = P.filename -// program["desc"] = P.filedesc -// if(P in idle_threads) -// program["running"] = 1 -// programs.Add(list(program)) return data @@ -467,7 +456,7 @@ if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." return - + P.computer_emagged = computer_emagged if(P.run_program(user)) active_program = P update_icon() @@ -513,12 +502,15 @@ user << "You try to insert \the [I] into \the [src], but it does not have an ID card slot installed." return - if(card_slot.stored_card) - user << "You try to insert \the [I] into \the [src], but it's ID card slot is occupied." + if(card_slot.stored_card && card_slot.stored_card2) + user << "You try to insert \the [I] into \the [src], but it's ID card slots are occupied." return if(!user.drop_item(I)) return - card_slot.stored_card = I + if(!card_slot.stored_card) + card_slot.stored_card = I + else + card_slot.stored_card2 = I I.forceMove(src) // update_uis() user << "You insert \the [I] into \the [src]." @@ -717,53 +709,6 @@ all_components.Add(processor_unit) return all_components -/* - -/obj/item/modular_computer/proc/update_uis() - if(active_program) //Should we update program ui or computer ui? - nanomanager.update_uis(active_program) - if(active_program.NM) - nanomanager.update_uis(active_program.NM) - else - nanomanager.update_uis(src) - -/obj/item/modular_computer/proc/check_update_ui_need() - var/ui_update_needed = 0 - if(battery_module) - var/batery_percent = battery_module.battery.percent() - if(last_battery_percent != batery_percent) //Let's update UI on percent change - ui_update_needed = 1 - last_battery_percent = batery_percent - - if(stationtime2text() != last_world_time) - last_world_time = stationtime2text() - ui_update_needed = 1 - - if(idle_threads.len) - var/list/current_header_icons = list() - for(var/datum/computer_file/program/P in idle_threads) - if(!P.ui_header) - continue - current_header_icons[P.type] = P.ui_header - if(!last_header_icons) - last_header_icons = current_header_icons - - else if(!listequal(last_header_icons, current_header_icons)) - last_header_icons = current_header_icons - ui_update_needed = 1 - else - for(var/x in last_header_icons|current_header_icons) - if(last_header_icons[x]!=current_header_icons[x]) - last_header_icons = current_header_icons - ui_update_needed = 1 - break - - if(ui_update_needed) - update_uis() - -*/ - - /obj/item/modular_computer/proc/take_damage(amount, component_probability, damage_casing = 1, randomize = 1) if(randomize) // 75%-125%, rand() works with integers, apparently. @@ -772,7 +717,6 @@ if(damage_casing) damage += amount damage = max(0,min(max_damage,damage)) -// damage = between(0, damage, max_damage) if(component_probability) for(var/I in get_all_components()) @@ -799,8 +743,6 @@ switch(Proj.damage_type) if(BRUTE) take_damage(Proj.damage, Proj.damage / 2) - //if(HALLOSS) - // take_damage(Proj.damage, Proj.damage / 3, 0) if(BURN) take_damage(Proj.damage, Proj.damage / 1.5) diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index c0f3dea536b..ffcb95ce57a 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -4,7 +4,7 @@ . = ..() desc = "A low-end tablet often seen among low ranked station personnel." processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) - battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module/micro(src) battery_module.charge_to_full() hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(src) network_card = new/obj/item/weapon/computer_hardware/network_card(src) @@ -13,7 +13,7 @@ /obj/item/modular_computer/tablet/preset/advanced/New() . = ..() processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(src) - battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(src) + battery_module = new/obj/item/weapon/computer_hardware/battery_module(src) battery_module.charge_to_full() hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(src) network_card = new/obj/item/weapon/computer_hardware/network_card(src) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index e05f1debb49..d3d0c881714 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -43,16 +43,16 @@ var/list/global_modular_computers = list() /obj/machinery/modular_computer/update_icon() icon_state = icon_state_unpowered - overlays.Cut() + cut_overlays() if(!cpu || !cpu.enabled) if (!(stat & NOPOWER) || battery_powered) - overlays.Add(screen_icon_screensaver) -// set_light(0) + add_overlay(screen_icon_screensaver) + SetLuminosity(0) return -// set_light(light_strength) + SetLuminosity(light_strength) if(cpu.active_program) - overlays.Add(cpu.active_program.program_icon_state ? cpu.active_program.program_icon_state : screen_icon_state_menu) + add_overlay(cpu.active_program.program_icon_state ? cpu.active_program.program_icon_state : screen_icon_state_menu) else overlays.Add(screen_icon_state_menu) diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm index 576c8cb0b0f..79a7c913c2e 100644 --- a/code/modules/modular_computers/computers/machinery/modular_console.dm +++ b/code/modules/modular_computers/computers/machinery/modular_console.dm @@ -14,7 +14,7 @@ base_active_power_usage = 500 max_hardware_size = 3 steel_sheet_cost = 20 - light_strength = 4 + light_strength = 2 _max_damage = 300 _break_damage = 150 diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index f907c447e91..814086c1423 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -3,8 +3,7 @@ filetype = "PRG" filename = "UnknownProgram" // File name. FILE NAME MUST BE UNIQUE IF YOU WANT THE PROGRAM TO BE DOWNLOADABLE FROM NTNET! var/required_access = null // List of required accesses to *run* the program. - var/datum/nano_module/NM = null // If the program uses NanoModule, put it here and it will be automagically opened. Otherwise implement ui_interact. - var/nanomodule_path = null // Path to nanomodule, make sure to set this if implementing new program. + var/transfer_access = null // List of required access to download or file host the program var/program_state = PROGRAM_STATE_KILLED// PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running. var/obj/item/modular_computer/computer // Device that runs this program. var/filedesc = "Unknown Program" // User-friendly name of this program. @@ -18,7 +17,7 @@ var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable. var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick - var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! + var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /icons/program_icons. Be careful not to use too large images! /datum/computer_file/program/New(obj/item/modular_computer/comp = null) ..() @@ -32,7 +31,6 @@ /datum/computer_file/program/clone() var/datum/computer_file/program/temp = ..() temp.required_access = required_access - temp.nanomodule_path = nanomodule_path temp.filedesc = filedesc temp.program_icon_state = program_icon_state temp.requires_ntnet = requires_ntnet @@ -70,27 +68,44 @@ // Check if the user can run program. Only humans can operate computer. Automatically called in run_program() // User has to wear their ID for ID Scan to work. // Can also be called manually, with optional parameter being access_to_check to scan the user's ID -/datum/computer_file/program/proc/can_run(mob/living/user, loud = 0, access_to_check) +/datum/computer_file/program/proc/can_run(mob/living/user, loud = 0, access_to_check, transfer = 0) // Defaults to required_access if(!access_to_check) - access_to_check = required_access + if(transfer && transfer_access) + access_to_check = transfer_access + else + access_to_check = required_access if(!access_to_check) // No required_access, allow it. return 1 + if(computer_emagged && !transfer) //emags can bypass the execution locks but not the download ones. + return 1 + if(issilicon(user)) return 1 if(ishuman(user)) var/mob/living/carbon/human/h = user var/obj/item/weapon/card/id/I = h.get_idcard() - if(!I) + var/obj/item/weapon/card/id/C = h.get_active_hand() + if (istype(C, /obj/item/device/pda)) + var/obj/item/device/pda/pda = C + C = pda.id + if(!(C && istype(C))) + C = null + + if(!I && !C) if(loud) user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." return 0 - if(access_to_check in I.GetAccess()) - return 1 - else if(loud) + if(I) + if(access_to_check in I.GetAccess()) + return 1 + else if(C) + if(access_to_check in C.GetAccess()) + return 1 + if(loud) user << "\The [computer] flashes an \"Access Denied\" warning." return 0 diff --git a/code/modules/modular_computers/file_system/program_events.dm b/code/modules/modular_computers/file_system/program_events.dm index e64fba154bc..996d6393722 100644 --- a/code/modules/modular_computers/file_system/program_events.dm +++ b/code/modules/modular_computers/file_system/program_events.dm @@ -2,7 +2,7 @@ // Always include a parent call when overriding an event. // Called when the ID card is removed from computer. ID is removed AFTER this proc. -/datum/computer_file/program/proc/event_idremoved(background) +/datum/computer_file/program/proc/event_idremoved(background, slot) return // Called when the computer fails due to power loss. Override when program wants to specifically react to power loss. 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 6549c4d02f5..91b61d37836 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -20,6 +20,7 @@ computer.enabled = 0 computer.update_icon() qdel(computer.hard_drive) + computer.take_damage(25, 10, 1, 1) if(computer.battery_module && prob(25)) qdel(computer.battery_module) computer.visible_message("\The [computer]'s battery explodes in rain of sparks.") diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 368144b618b..3dfc054dd2d 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -3,12 +3,14 @@ filedesc = "ID card modification program" program_icon_state = "id" extended_desc = "Program for programming employee ID cards to access parts of the station." - required_access = access_change_ids + transfer_access = access_change_ids requires_ntnet = 0 size = 8 var/mod_mode = 1 var/is_centcom = 0 var/show_assignments = 0 + var/minor = 0 + var/authenticated = 0 var/list/region_access = null var/list/head_subordinates = null var/target_dept = 0 //Which department this computer has access to. 0=all departments @@ -34,6 +36,43 @@ var/list/opened_positions = list(); +/datum/computer_file/program/card_mod/event_idremoved(background, slot) + if(slot == 2) + minor = 0 + authenticated = 0 + head_subordinates = null + region_access = null + + +/datum/computer_file/program/card_mod/proc/job_blacklisted(jobtitle) + return (jobtitle in blacklisted) + + +//Logic check for if you can open the job +/datum/computer_file/program/card_mod/proc/can_open_job(datum/job/job) + if(job) + if(!job_blacklisted(job.title)) + if((job.total_positions <= player_list.len * (max_relative_positions / 100))) + var/delta = (world.time / 10) - time_last_changed_position + if((change_position_cooldown < delta) || (opened_positions[job.title] < 0)) + return 1 + return -2 + return 0 + return 0 + +//Logic check for if you can close the job +/datum/computer_file/program/card_mod/proc/can_close_job(datum/job/job) + if(job) + if(!job_blacklisted(job.title)) + if(job.total_positions > job.current_positions) + var/delta = (world.time / 10) - time_last_changed_position + if((change_position_cooldown < delta) || (opened_positions[job.title] > 0)) + return 1 + return -2 + return 0 + return 0 + + /datum/computer_file/program/card_mod/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -65,17 +104,24 @@ var/obj/item/weapon/card/id/user_id_card = null var/mob/user = usr - if(ishuman(user)) - var/mob/living/carbon/human/h = user - user_id_card = h.get_idcard() - var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card + var/obj/item/weapon/card/id/auth_card = computer.card_slot.stored_card2 + + if(auth_card) + user_id_card = auth_card + else + if(ishuman(user)) + var/mob/living/carbon/human/h = user + user_id_card = h.get_idcard() + switch(action) if("PRG_switchm") if(params["target"] == "mod") mod_mode = 1 else if (params["target"] == "manifest") mod_mode = 0 + else if (params["target"] == "manage") + mod_mode = 2 if("PRG_togglea") if(show_assignments) show_assignments = 0 @@ -84,9 +130,9 @@ if("PRG_print") if(computer && computer.nano_printer) //This option should never be called if there is no printer if(mod_mode) - if(can_run(user, 1)) + if(authorized()) var/contents = {"

Access Report

- Prepared By: [user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]
+ Prepared By: [user_id_card && user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]
For: [id_card.registered_name ? id_card.registered_name : "Unregistered"]

Assignment: [id_card.assignment]
@@ -115,16 +161,42 @@ computer.visible_message("\The [computer] prints out paper.") if("PRG_eject") if(computer && computer.card_slot) - if(id_card) - data_core.manifest_modify(id_card.registered_name, id_card.assignment) - computer.proc_eject_id(user) + var/select = params["target"] + switch(select) + if("id") + if(id_card) + data_core.manifest_modify(id_card.registered_name, id_card.assignment) + computer.proc_eject_id(user, 1) + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/card/id)) + if(!usr.drop_item()) + return + I.forceMove(computer) + computer.card_slot.stored_card = I + if("auth") + if(auth_card) + if(id_card) + data_core.manifest_modify(id_card.registered_name, id_card.assignment) + head_subordinates = null + region_access = null + authenticated = 0 + minor = 0 + computer.proc_eject_id(user, 2) + else + var/obj/item/I = usr.get_active_hand() + if (istype(I, /obj/item/weapon/card/id)) + if(!usr.drop_item()) + return + I.forceMove(computer) + computer.card_slot.stored_card2 = I if("PRG_terminate") - if(computer && can_run(user, 1)) - id_card.assignment = "Terminated" + if(computer && ((id_card.assignment in head_subordinates) || id_card.assignment == "Assistant")) + id_card.assignment = "Unassigned" remove_nt_access(id_card) if("PRG_edit") - if(computer && can_run(user, 1)) + if(computer && authorized()) if(params["name"]) var/temp_name = reject_bad_name(input("Enter name.", "Name", id_card.registered_name)) if(temp_name) @@ -135,7 +207,7 @@ // var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) // id_card.associated_account_number = account_num if("PRG_assign") - if(computer && can_run(user, 1) && id_card) + if(computer && authorized() && id_card) var/t1 = params["assign_target"] if(t1 == "Custom") var/temp_t = reject_bad_text(input("Enter a custom job assignment.","Assignment", id_card.assignment), 45) @@ -164,89 +236,221 @@ id_card.assignment = t1 if("PRG_access") - if(params["allowed"] && computer && can_run(user, 1)) + if(params["allowed"] && computer && authorized()) var/access_type = text2num(params["access_target"]) var/access_allowed = text2num(params["allowed"]) - world << "type [access_type]" - world << "allow [access_allowed]" if(access_type in (is_centcom ? get_all_centcom_access() : get_all_accesses())) - world << "yes" id_card.access -= access_type if(!access_allowed) - world << "check" id_card.access += access_type + if("PRG_open_job") + var/edit_job_target = params["target"] + var/datum/job/j = SSjob.GetJob(edit_job_target) + if(!j) + return 0 + if(can_open_job(j) != 1) + return 0 + if(opened_positions[edit_job_target] >= 0) + time_last_changed_position = world.time / 10 + j.total_positions++ + opened_positions[edit_job_target]++ + if("PRG_close_job") + var/edit_job_target = params["target"] + var/datum/job/j = SSjob.GetJob(edit_job_target) + if(!j) + return 0 + if(can_close_job(j) != 1) + return 0 + //Allow instant closing without cooldown if a position has been opened before + if(opened_positions[edit_job_target] <= 0) + time_last_changed_position = world.time / 10 + j.total_positions-- + opened_positions[edit_job_target]-- + if(id_card) id_card.name = text("[id_card.registered_name]'s ID Card ([id_card.assignment])") return 1 -/datum/computer_file/program/card_mod/proc/remove_nt_access(var/obj/item/weapon/card/id/id_card) +/datum/computer_file/program/card_mod/proc/remove_nt_access(obj/item/weapon/card/id/id_card) id_card.access -= get_all_accesses() + id_card.access -= get_all_centcom_access() -/datum/computer_file/program/card_mod/proc/apply_access(var/obj/item/weapon/card/id/id_card, var/list/accesses) +/datum/computer_file/program/card_mod/proc/apply_access(obj/item/weapon/card/id/id_card, list/accesses) id_card.access |= accesses /datum/computer_file/program/card_mod/ui_data(mob/user) var/list/data = get_header_data() + data["mmode"] = mod_mode + + var/authed = 0 + if(computer && computer.card_slot) + var/obj/item/weapon/card/id/auth_card = computer.card_slot.stored_card2 + data["auth_name"] = auth_card ? strip_html_simple(auth_card.name) : "-----" + authed = authorized() + + + if(mod_mode == 2) + data["slots"] = list() + var/list/pos = list() + for(var/datum/job/job in SSjob.occupations) + if(job.title in blacklisted) + continue + + var/list/status_open = build_manage(job,1) + var/list/status_close = build_manage(job,0) + + pos.Add(list(list( + "title" = job.title, + "current" = job.current_positions, + "total" = job.total_positions, + "status_open" = authed ? status_open["enable"]: 0, + "status_close" = authed ? status_close["enable"] : 0, + "desc_open" = status_open["desc"], + "desc_close" = status_close["desc"]))) + data["slots"] = pos + data["src"] = "\ref[src]" data["station_name"] = station_name() - data["manifest"] = data_core ? data_core.get_manifest(0) : null + + + if(!mod_mode) + data["manifest"] = list() + var/list/crew = list() + for(var/datum/data/record/t in sortRecord(data_core.general)) + crew.Add(list(list( + "name" = t.fields["name"], + "rank" = t.fields["rank"]))) + + data["manifest"] = crew data["assignments"] = show_assignments if(computer) data["have_id_slot"] = !!computer.card_slot data["have_printer"] = !!computer.nano_printer - data["authenticated"] = can_run(user) - if(!computer.card_slot) + if(!computer.card_slot && mod_mode == 1) mod_mode = 0 //We can't modify IDs when there is no card reader else data["have_id_slot"] = 0 data["have_printer"] = 0 - data["authenticated"] = 0 - data["mmode"] = mod_mode + data["centcom_access"] = is_centcom - if(computer && computer.card_slot) - var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card - data["has_id"] = !!id_card - data["id_rank"] = id_card && id_card.assignment ? html_encode(id_card.assignment) : "Unassigned" - data["id_owner"] = id_card && id_card.registered_name ? html_encode(id_card.registered_name) : "-----" - data["id_name"] = id_card ? strip_html_simple(id_card.name) : "-----" + + data["authenticated"] = authed - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["cargo_jobs"] = format_jobs(supply_positions) - data["civilian_jobs"] = format_jobs(supply_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + if(mod_mode == 1) - if(computer.card_slot.stored_card) - var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card - if(is_centcom) - var/list/all_centcom_access = list() - for(var/access in get_all_centcom_access()) - all_centcom_access.Add(list(list( - "desc" = replacetext(get_centcom_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in id_card.access) ? 1 : 0))) - data["all_centcom_access"] = all_centcom_access - else - var/list/regions = list() - for(var/i = 1; i <= 7; i++) - var/list/accesses = list() - for(var/access in get_region_accesses(i)) - if (get_access_desc(access)) - accesses.Add(list(list( - "desc" = replacetext(get_access_desc(access), " ", " "), - "ref" = access, - "allowed" = (access in id_card.access) ? 1 : 0))) + if(computer && computer.card_slot) + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card - regions.Add(list(list( - "name" = get_region_accesses_name(i), - "accesses" = accesses))) - data["regions"] = regions + data["has_id"] = !!id_card + data["id_rank"] = id_card && id_card.assignment ? html_encode(id_card.assignment) : "Unassigned" + data["id_owner"] = id_card && id_card.registered_name ? html_encode(id_card.registered_name) : "-----" + data["id_name"] = id_card ? strip_html_simple(id_card.name) : "-----" - return data \ No newline at end of file + data["engineering_jobs"] = format_jobs(engineering_positions) + data["medical_jobs"] = format_jobs(medical_positions) + data["science_jobs"] = format_jobs(science_positions) + data["security_jobs"] = format_jobs(security_positions) + data["cargo_jobs"] = format_jobs(supply_positions) + data["civilian_jobs"] = format_jobs(civilian_positions) + data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + + if(computer.card_slot.stored_card) + var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card + if(is_centcom) + var/list/all_centcom_access = list() + for(var/access in get_all_centcom_access()) + all_centcom_access.Add(list(list( + "desc" = replacetext(get_centcom_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + data["all_centcom_access"] = all_centcom_access + else + var/list/regions = list() + for(var/i = 1; i <= 7; i++) + if((minor || target_dept) && !(i in region_access)) + continue + var/list/accesses = list() + for(var/access in get_region_accesses(i)) + if (get_access_desc(access)) + accesses.Add(list(list( + "desc" = replacetext(get_access_desc(access), " ", " "), + "ref" = access, + "allowed" = (access in id_card.access) ? 1 : 0))) + + regions.Add(list(list( + "name" = get_region_accesses_name(i), + "accesses" = accesses))) + data["regions"] = regions + + data["minor"] = target_dept || minor ? 1 : 0 + + + return data + + +/datum/computer_file/program/card_mod/proc/build_manage(datum/job,open = 0) + var/out = "Denied" + var/can_change= 0 + if(open) + can_change = can_open_job(job) + else + can_change = can_close_job(job) + var/enable = 0 + if(can_change == 1) + out = "[open ? "Open Position" : "Close Position"]" + enable = 1 + else if(can_change == -2) + var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - time_last_changed_position), 1) + var/mins = round(time_to_wait / 60) + var/seconds = time_to_wait - (60*mins) + out = "Cooldown ongoing: [mins]:[(seconds < 10) ? "0[seconds]" : "[seconds]"]" + else + out = "Denied" + + return list("enable" = enable, "desc" = out) + + +/datum/computer_file/program/card_mod/proc/authorized() + if(!authenticated) + if(computer && computer.card_slot) + var/obj/item/weapon/card/id/auth_card = computer.card_slot.stored_card2 + if(auth_card) + region_access = list() + if(transfer_access in auth_card.GetAccess()) + minor = 0 + authenticated = 1 + return 1 + else + if((access_hop in auth_card.access) && ((target_dept==1) || !target_dept)) + region_access |= 1 + region_access |= 6 + get_subordinates("Head of Personnel") + if((access_hos in auth_card.access) && ((target_dept==2) || !target_dept)) + region_access |= 2 + get_subordinates("Head of Security") + if((access_cmo in auth_card.access) && ((target_dept==3) || !target_dept)) + region_access |= 3 + get_subordinates("Chief Medical Officer") + if((access_rd in auth_card.access) && ((target_dept==4) || !target_dept)) + region_access |= 4 + get_subordinates("Research Director") + if((access_ce in auth_card.access) && ((target_dept==5) || !target_dept)) + region_access |= 5 + get_subordinates("Chief Engineer") + if(region_access) + minor = 1 + authenticated = 1 + return 1 + else + return authenticated + +/datum/computer_file/program/card_mod/proc/get_subordinates(rank) + head_subordinates = list() + for(var/datum/job/job in SSjob.occupations) + if(rank in job.department_head) + head_subordinates += job.title \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 6ba68126808..a34163f8eef 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -137,7 +137,7 @@ for(var/A in ntnet_global.available_station_software) var/datum/computer_file/program/P = A // Only those programs our user can run will show in the list - if(!P.can_run(user)) + if(!P.can_run(user,transfer = 1)) continue all_entries.Add(list(list( "filename" = P.filename, diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm index 60cc80a3b86..e12299b250b 100644 --- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -5,7 +5,7 @@ extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes" size = 12 requires_ntnet = 1 - required_access = access_network + required_access = access_network //Network control is a more secure program. available_on_ntnet = 1 /datum/computer_file/program/ntnetmonitor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm index a914878c426..d9d0c6b8a30 100644 --- a/code/modules/modular_computers/file_system/programs/nttransfer.dm +++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm @@ -141,6 +141,10 @@ var/global/nttransfer_uid = 0 if(F.unsendable) error = "I/O Error: File locked." return + if(istype(F, /datum/computer_file/program)) + var/datum/computer_file/program/P = F + if(!P.can_run(usr,transfer = 1)) + error = "Access Error: Insufficient rights to upload file." provided_file = F ntnet_global.fileservers.Add(src) return diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm index bfa946d4154..316b90ec00c 100644 --- a/code/modules/modular_computers/file_system/programs/powermonitor.dm +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -6,7 +6,7 @@ program_icon_state = "power_monitor" extended_desc = "This program connects to sensors around the station to provide information about electrical systems" ui_header = "power_norm.gif" - required_access = access_engine + transfer_access = access_engine usage_flags = PROGRAM_CONSOLE requires_ntnet = 0 network_destination = "power monitoring system" diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 2499da2f816..974550770e1 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -6,7 +6,7 @@ icon_state = "battery_normal" critical = 1 malfunction_probability = 1 - origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) + origin_tech = list("powerstorage" = 1, "engineering" = 1) var/battery_rating = 750 var/obj/item/weapon/stock_parts/cell/battery = null @@ -14,7 +14,7 @@ name = "advanced battery" desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices. It's rating is 1100." icon_state = "battery_advanced" - origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) + origin_tech = list("powerstorage" = 2, "engineering" = 2) hardware_size = 2 battery_rating = 1100 @@ -22,15 +22,15 @@ name = "super battery" desc = "A very advanced power cell, often used in high-end devices, or as uninterruptable power supply for important consoles or servers. It's rating is 1500." icon_state = "battery_super" - origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) - hardware_size = 1 //temp for testmerge + origin_tech = list("powerstorage" = 3, "engineering" = 3) + hardware_size = 2 battery_rating = 1500 /obj/item/weapon/computer_hardware/battery_module/ultra name = "ultra battery" desc = "A very advanced large power cell. It's often used as uninterruptable power supply for critical consoles or servers. It's rating is 2000." icon_state = "battery_ultra" - origin_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4) + origin_tech = list("powerstorage" = 5, "engineering" = 4) hardware_size = 3 battery_rating = 2000 @@ -38,14 +38,14 @@ name = "micro battery" desc = "A small power cell, commonly seen in most portable microcomputers. It's rating is 500." icon_state = "battery_micro" - origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) + origin_tech = list("powerstorage" = 2, "engineering" = 2) battery_rating = 500 /obj/item/weapon/computer_hardware/battery_module/nano name = "nano battery" desc = "A tiny power cell, commonly seen in low-end portable microcomputers. It's rating is 300." icon_state = "battery_nano" - origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) + origin_tech = list("powerstorage" = 1, "engineering" = 1) battery_rating = 300 // This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes. diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 35eddbd5ec9..3cfe7c9d652 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -5,14 +5,17 @@ critical = 0 icon_state = "cardreader" hardware_size = 1 - origin_tech = list(TECH_DATA = 2) + origin_tech = list("programming" = 2) var/obj/item/weapon/card/id/stored_card = null + var/obj/item/weapon/card/id/stored_card2 = null /obj/item/weapon/computer_hardware/card_slot/Destroy() if(holder2 && (holder2.card_slot == src)) holder2.card_slot = null if(stored_card) stored_card.forceMove(get_turf(holder2)) + if(stored_card2) + stored_card2.forceMove(get_turf(holder2)) holder2 = null ..() \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 4a74081c687..61e2bf0db71 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -4,7 +4,7 @@ power_usage = 25 // SSD or something with low power usage icon_state = "hdd_normal" hardware_size = 1 - origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + origin_tech = list("programming" = 1, "engineering" = 1) var/max_capacity = 128 var/used_capacity = 0 var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY! @@ -13,7 +13,7 @@ name = "advanced hard drive" desc = "A small hybrid hard drive with 256GQ of storage capacity for use in higher grade computers where balance between power efficiency and capacity is desired." max_capacity = 256 - origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + origin_tech = list("programming" = 2, "engineering" = 2) power_usage = 50 // Hybrid, medium capacity and medium power storage icon_state = "hdd_advanced" hardware_size = 2 @@ -22,7 +22,7 @@ name = "super hard drive" desc = "A small hard drive with 512GQ of storage capacity for use in cluster storage solutions where capacity is more important than power efficiency." max_capacity = 512 - origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + origin_tech = list("programming" = 3, "engineering" = 3) power_usage = 100 // High-capacity but uses lots of power, shortening battery life. Best used with APC link. icon_state = "hdd_super" hardware_size = 2 @@ -31,7 +31,7 @@ name = "cluster hard drive" desc = "A large storage cluster consisting of multiple hard drives for usage in high capacity storage systems. Has capacity of 2048 GQ." power_usage = 500 - origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) + origin_tech = list("programming" = 4, "engineering" = 4) max_capacity = 2048 icon_state = "hdd_cluster" hardware_size = 3 @@ -41,7 +41,7 @@ name = "small hard drive" desc = "A small highly efficient solid state drive for portable devices." power_usage = 10 - origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + origin_tech = list("programming" = 2, "engineering" = 2) max_capacity = 64 icon_state = "hdd_small" hardware_size = 1 @@ -50,7 +50,7 @@ name = "micro hard drive" desc = "A small micro hard drive for portable devices." power_usage = 2 - origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + origin_tech = list("programming" = 1, "engineering" = 1) max_capacity = 32 icon_state = "hdd_micro" hardware_size = 1 diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index 40142ccda46..80c6d13fa35 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -2,7 +2,7 @@ name = "nano printer" desc = "Small integrated printer with paper recycling module." power_usage = 50 - origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + origin_tech = list("programming" = 2, "engineering" = 2) critical = 0 icon_state = "printer" hardware_size = 1 diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 31a46260d47..8c3e431e87b 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -4,7 +4,7 @@ var/global/ntnet_card_uid = 1 name = "basic NTNet network card" desc = "A basic network card for usage with standard NTNet frequencies." power_usage = 50 - origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1) + origin_tech = list("programming" = 2, TECH_ENGINEERING = 1) critical = 0 icon_state = "netcard_basic" hardware_size = 1 @@ -34,7 +34,7 @@ var/global/ntnet_card_uid = 1 name = "advanced NTNet network card" desc = "An advanced network card for usage with standard NTNet frequencies. It's transmitter is strong enough to connect even off-station." long_range = 1 - origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2) + origin_tech = list("programming" = 4, "engineering" = 2) power_usage = 100 // Better range but higher power usage. icon_state = "netcard_advanced" hardware_size = 1 @@ -43,7 +43,7 @@ var/global/ntnet_card_uid = 1 name = "wired NTNet network card" desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection." ethernet = 1 - origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) + origin_tech = list("programming" = 5, "engineering" = 3) power_usage = 100 // Better range but higher power usage. icon_state = "netcard_ethernet" hardware_size = 3 diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm index 4001a63301c..4d2cbc2b75e 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm @@ -6,7 +6,7 @@ icon_state = "flashdrive_basic" hardware_size = 1 max_capacity = 16 - origin_tech = list(TECH_DATA = 1) + origin_tech = list("programming" = 1) /obj/item/weapon/computer_hardware/hard_drive/portable/advanced name = "advanced data crystal" @@ -15,7 +15,7 @@ icon_state = "flashdrive_advanced" hardware_size = 1 max_capacity = 64 - origin_tech = list(TECH_DATA = 2) + origin_tech = list("programming" = 2) /obj/item/weapon/computer_hardware/hard_drive/portable/super name = "super data crystal" @@ -24,7 +24,7 @@ icon_state = "flashdrive_super" hardware_size = 1 max_capacity = 256 - origin_tech = list(TECH_DATA = 4) + origin_tech = list("programming" = 4) /obj/item/weapon/computer_hardware/hard_drive/portable/New() ..() diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm index 8f9009f72b9..3a281f90559 100644 --- a/code/modules/modular_computers/hardware/processor_unit.dm +++ b/code/modules/modular_computers/hardware/processor_unit.dm @@ -9,7 +9,7 @@ power_usage = 50 critical = 1 malfunction_probability = 1 - origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) + origin_tech = list("programming" = 3, "engineering" = 2) var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description. @@ -20,7 +20,7 @@ hardware_size = 1 power_usage = 25 max_idle_programs = 1 - origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + origin_tech = list("programming" = 2, "engineering" = 2) /obj/item/weapon/computer_hardware/processor_unit/photonic name = "photonic processor" @@ -29,7 +29,7 @@ hardware_size = 2 power_usage = 250 max_idle_programs = 4 - origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) + origin_tech = list("programming" = 5, "engineering" = 4) /obj/item/weapon/computer_hardware/processor_unit/photonic/small name = "photonic microprocessor" @@ -38,4 +38,4 @@ hardware_size = 1 power_usage = 75 max_idle_programs = 2 - origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) \ No newline at end of file + origin_tech = list("programming" = 4, "engineering" = 3) \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/tesla_link.dm b/code/modules/modular_computers/hardware/tesla_link.dm index 5296f0e120b..13c8a742c73 100644 --- a/code/modules/modular_computers/hardware/tesla_link.dm +++ b/code/modules/modular_computers/hardware/tesla_link.dm @@ -5,7 +5,7 @@ enabled = 1 icon_state = "teslalink" hardware_size = 2 // Can't be installed into tablets - origin_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) + origin_tech = list("programming" = 2, "powerstorage" = 3, "engineering" = 2) var/obj/machinery/modular_computer/holder /obj/item/weapon/computer_hardware/tesla_link/New(var/obj/L) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 41b58622d1b..5d7e95cf977 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -23,7 +23,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). "Hydroponics Machinery", "Subspace Telecomms", "Research Machinery", - "Misc. Machinery" + "Misc. Machinery", + "Computer Parts" ) /obj/machinery/r_n_d/circuit_imprinter/New() diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 8e5bfa55e6d..565ec192dfb 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -728,3 +728,18 @@ build_path = /obj/item/conveyor_switch_construct category = list("initial", "Construction") +/datum/design/laptop + name = "Laptop Frame" + id = "laptop" + build_type = AUTOLATHE + materials = list(MAT_METAL = 1200, MAT_GLASS = 200) + build_path = /obj/machinery/modular_computer/laptop/buildable + category = list("initial","Misc") + +/datum/design/tablet + name = "Tablet Frame" + id = "tablet" + build_type = AUTOLATHE + materials = list(MAT_METAL = 500, MAT_GLASS = 1000) + build_path = /obj/item/modular_computer/tablet + category = list("initial","Misc") \ No newline at end of file diff --git a/code/modules/research/designs/computer_part_designs.dm b/code/modules/research/designs/computer_part_designs.dm new file mode 100644 index 00000000000..ae91050960e --- /dev/null +++ b/code/modules/research/designs/computer_part_designs.dm @@ -0,0 +1,245 @@ +//////////////////////////////////////// +///////////Computer Parts/////////////// +//////////////////////////////////////// + +/datum/design/disk/normal + name = "basic hard drive" + id = "hdd_basic" + req_tech = list("programming" = 1, "engineering" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL = 400, MAT_GLASS = 100) + build_path = /obj/item/weapon/computer_hardware/hard_drive/ + category = list("Computer Parts") + +/datum/design/disk/advanced + name = "advanced hard drive" + id = "hdd_advanced" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 800, MAT_GLASS = 200) + build_path = /obj/item/weapon/computer_hardware/hard_drive/advanced + category = list("Computer Parts") + +/datum/design/disk/super + name = "super hard drive" + id = "hdd_super" + req_tech = list("programming" = 3, "engineering" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 1600, MAT_GLASS = 400) + build_path = /obj/item/weapon/computer_hardware/hard_drive/super + category = list("Computer Parts") + +/datum/design/disk/cluster + name = "cluster hard drive" + id = "hdd_cluster" + req_tech = list("programming" = 4, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3200, MAT_GLASS = 800) + build_path = /obj/item/weapon/computer_hardware/hard_drive/cluster + category = list("Computer Parts") + +/datum/design/disk/small + name = "small hard drive" + id = "hdd_small" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 800, MAT_GLASS = 200) + build_path = /obj/item/weapon/computer_hardware/hard_drive/small + category = list("Computer Parts") + +/datum/design/disk/micro + name = "micro hard drive" + id = "hdd_micro" + req_tech = list("programming" = 1, "engineering" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL = 400, MAT_GLASS = 100) + build_path = /obj/item/weapon/computer_hardware/hard_drive/micro + category = list("Computer Parts") + +// Network cards +/datum/design/netcard/basic + name = "basic network card" + id = "netcard_basic" + req_tech = list("programming" = 2, "engineering" = 1) + build_type = IMPRINTER + materials = list(MAT_METAL = 250, MAT_GLASS = 100) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/network_card + category = list("Computer Parts") + +/datum/design/netcard/advanced + name = "advanced network card" + id = "netcard_advanced" + req_tech = list("programming" = 4, "engineering" = 2) + build_type = IMPRINTER + materials = list(MAT_METAL = 500, MAT_GLASS = 200) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/network_card/advanced + category = list("Computer Parts") + +/datum/design/netcard/wired + name = "wired network card" + id = "netcard_wired" + req_tech = list("programming" = 5, "engineering" = 3) + build_type = IMPRINTER + materials = list(MAT_METAL = 2500, MAT_GLASS = 400) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/network_card/wired + category = list("Computer Parts") + +// Data crystals (USB flash drives) +/datum/design/portabledrive/basic + name = "basic data crystal" + id = "portadrive_basic" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list(MAT_GLASS = 800) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable + category = list("Computer Parts") + +/datum/design/portabledrive/advanced + name = "advanced data crystal" + id = "portadrive_advanced" + req_tech = list("programming" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1600) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced + category = list("Computer Parts") + +/datum/design/portabledrive/super + name = "super data crystal" + id = "portadrive_super" + req_tech = list("programming" = 4) + build_type = IMPRINTER + materials = list(MAT_GLASS = 3200) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super + category = list("Computer Parts") + +// Card slot +/datum/design/cardslot + name = "RFID card slot" + id = "cardslot" + req_tech = list("programming" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 600) + build_path = /obj/item/weapon/computer_hardware/card_slot + category = list("Computer Parts") + +// Nano printer +/datum/design/nanoprinter + name = "nano printer" + id = "nanoprinter" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 600) + build_path = /obj/item/weapon/computer_hardware/nano_printer + category = list("Computer Parts") + +// Tesla Link +/datum/design/teslalink + name = "tesla link" + id = "teslalink" + req_tech = list("programming" = 2, "powerstorage" = 3, "engineering" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000) + build_path = /obj/item/weapon/computer_hardware/tesla_link + category = list("Computer Parts") + +// Batteries +/datum/design/battery/normal + name = "standard battery module" + id = "bat_normal" + req_tech = list("powerstorage" = 1, "engineering" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL = 400) + build_path = /obj/item/weapon/computer_hardware/battery_module + category = list("Computer Parts") + +/datum/design/battery/advanced + name = "advanced battery module" + id = "bat_advanced" + req_tech = list("powerstorage" = 2, "engineering" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 800) + build_path = /obj/item/weapon/computer_hardware/battery_module/advanced + category = list("Computer Parts") + +/datum/design/battery/super + name = "super battery module" + id = "bat_super" + req_tech = list("powerstorage" = 3, "engineering" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 1600) + build_path = /obj/item/weapon/computer_hardware/battery_module/super + category = list("Computer Parts") + +/datum/design/battery/ultra + name = "ultra battery module" + id = "bat_ultra" + req_tech = list("powerstorage" = 5, "engineering" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3200) + build_path = /obj/item/weapon/computer_hardware/battery_module/ultra + category = list("Computer Parts") + +/datum/design/battery/nano + name = "nano battery module" + id = "bat_nano" + req_tech = list("powerstorage" = 1, "engineering" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL = 200) + build_path = /obj/item/weapon/computer_hardware/battery_module/nano + category = list("Computer Parts") + +/datum/design/battery/micro + name = "micro battery module" + id = "bat_micro" + req_tech = list("powerstorage" = 2, "engineering" = 2) + build_type = PROTOLATHE + materials = list(MAT_METAL = 400) + build_path = /obj/item/weapon/computer_hardware/battery_module/micro + category = list("Computer Parts") + +// Processor unit +/datum/design/cpu + name = "computer processor unit" + id = "cpu_normal" + req_tech = list("programming" = 3, "engineering" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1600) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit + category = list("Computer Parts") + +/datum/design/cpu/small + name = "computer microprocessor unit" + id = "cpu_small" + req_tech = list("programming" = 2, "engineering" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 800) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/small + category = list("Computer Parts") + +/datum/design/cpu/photonic + name = "computer photonic processor unit" + id = "pcpu_normal" + req_tech = list("programming" = 5, "engineering" = 4) + build_type = IMPRINTER + materials = list(MAT_GLASS= 6400, MAT_GOLD = 2000) + reagents = list("sacid" = 40) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic + category = list("Computer Parts") + +/datum/design/cpu/photonic/small + name = "computer photonic microprocessor unit" + id = "pcpu_small" + req_tech = list("programming" = 4, "engineering" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 3200, MAT_GOLD = 1000) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small + category = list("Computer Parts") \ No newline at end of file diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 6a02b6b0f3b..1b526830d0c 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -26,7 +26,8 @@ Note: Must be placed west/left of and R&D console to function. "Electronics", "Weapons", "Ammo", - "Firing Pins" + "Firing Pins", + "Computer Parts" ) diff --git a/tgstation.dme b/tgstation.dme index b768900608c..097094ce4b7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1739,6 +1739,7 @@ #include "code\modules\research\designs\autolathe_designs.dm" #include "code\modules\research\designs\biogenerator_designs.dm" #include "code\modules\research\designs\comp_board_designs.dm" +#include "code\modules\research\designs\computer_part_designs.dm" #include "code\modules\research\designs\machine_designs.dm" #include "code\modules\research\designs\mecha_designs.dm" #include "code\modules\research\designs\mechfabricator_designs.dm" diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index a78213e06c8..c762630a687 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,15 +1,15 @@ -require=function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(d,h,3),_=o(b.length),x=0,w=e?s(f,_):n?s(f,0):void 0;_>x;x++)if((l||x in b)&&(m=b[x],v=y(m,x,g),t))if(e)w[x]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,_=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";r(t,f,++y)}return"O"+t[f]},x=function(t,e){var n,a=_(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=x(e,t);if(n){var a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!x(this,t)}}),v&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=x(t,e);return i?i.v=n:(t._l=i={i:r=_(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:x,setStrong:function(t,e,n){c(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[t],g=v,b=h?"set":"add",y=g&&g.prototype,_={},x=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!c(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,P=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(P||w)&&(x("delete"),x("has"),h&&x("get")),(w||E)&&x(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),_[t]=g,r(r.G+r.W+r.F*(g!=v),_),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],_=m?r:r[e]||(r[e]={}),x=_[u]||(_[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),_[c]!=f&&i(_,c,d),g&&x[c]!=f&&(x[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,_,x){p(n,e,b);var w,k,E=function(t){if(!d&&t in O)return O[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},P=e+" Iterator",C=y==v,S=!1,O=t.prototype,A=O[f]||O[h]||y&&O[y],T=A||E(y);if(A){var M=l(T.call(new t));c(M,P,!0),!a&&s(O,h)&&o(M,f,g),C&&A.name!==v&&(S=!0,T=function(){return A.call(this)})}if(a&&!x||!d&&!S&&O[f]||o(O,f,T),u[e]=T,u[P]=g,y)if(w={values:C?T:E(v),keys:_?T:E(m),entries:C?E("entries"):T},x)for(k in w)k in O||i(O,k,w[k]);else r(r.P+r.F*(d||S),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),_=t(76),x=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),P=t(7)(!1),C=Object.prototype,S=Array.prototype,O=S.slice,A=S.join,T=r.setDesc,M=r.getDesc,j=r.setDescs,R={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return M(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=j=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:j});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=L.concat("length","prototype"),F=L.length,D=function(){var t,e=p("iframe"),n=F,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("