From 64b33b1115eabfe0b1d8caec13fc780388a87652 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 18:30:45 +0200 Subject: [PATCH 1/9] Fix cargo shuttle misplacing crates --- code/game/supplyshuttle.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 8ce551d58be..71398e26dda 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -3,8 +3,8 @@ #define SUPPLY_STATIONZ 1 //Z-level of the Station. #define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station #define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock -#define COMP_SCREEN_WIDTH 580 //width of supply.order computer interaction window -#define COMP_SCREEN_HEIGHT 555 //height of supply order computer interaction window +#define COMP_SCREEN_WIDTH 590 //width of supply computer interaction window +#define COMP_SCREEN_HEIGHT 555 //height of supply computer interaction window var/datum/controller/supply/supply_controller = new() @@ -248,7 +248,7 @@ var/list/mechtoys = list( for(var/atom/A in T.contents) if(istype(A,/atom/movable/lighting_overlay)) continue - if(A.simulated) + if(!A.simulated) continue contcount++ if(contcount) continue From e05a8e34db4589e0aaee335c87593b632de634e8 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:42:46 +0200 Subject: [PATCH 2/9] Fix pAI teleporting --- code/modules/mob/living/silicon/pai/recruit.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 7de12627482..768b46c2283 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -231,7 +231,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates M << browse(dat, "window=paiRecruit;size=580x580;") proc/findPAI(var/obj/item/device/paicard/p, var/mob/user) - requestRecruits() + requestRecruits(p) var/list/available = list() for(var/datum/paiCandidate/c in paiController.pai_candidates) if(c.ready) @@ -346,12 +346,12 @@ var/datum/paiController/paiController // Global handler for pAI candidates user << browse(dat, "window=findPai") - proc/requestRecruits() + proc/requestRecruits(var/obj/item/device/paicard/P) for(var/mob/dead/observer/O in player_list) if(O.client && O.client.prefs.be_special & BE_PAI) if(player_old_enough_antag(O.client,BE_PAI)) if(check_recruit(O)) - O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)" + O << "\blue A pAI card is looking for personalities. (Teleport | Sign Up)" //question(O.client) proc/check_recruit(var/mob/dead/observer/O) if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept")) From e94d0934ecfdd9a738d1cb7e6f2439003ee37049 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:43:08 +0200 Subject: [PATCH 3/9] Fixes DNA modifier exploit --- code/game/dna/dna_modifier.dm | 54 +++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 7239061a61d..a6bbd866510 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -5,6 +5,8 @@ #define DNA2_BUF_UE 2 #define DNA2_BUF_SE 4 +#define NEGATE_MUTATION_THRESHOLD 30 // Occupants with over ## percent radiation threshold will not gain mutations + //list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0), /datum/dna2/record var/datum/dna/dna = null @@ -306,12 +308,27 @@ else return - /obj/machinery/dna_scannernew/blob_act() if(prob(75)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc qdel(src) + +// Checks if occupants can be irradiated/mutated - prevents exploits where wearing full rad protection would still let you gain mutations +/obj/machinery/dna_scannernew/proc/radiation_check() + if(!occupant) + return 1 + + if(ishuman(occupant)) + var/mob/living/carbon/human/H = occupant + if((H.species.flags & NO_DNA_RAD)) + return 1 + + var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.") + if (radiation_protection > NEGATE_MUTATION_THRESHOLD) + return 1 + + return 0 /obj/machinery/computer/scan_consolenew name = "DNA Modifier Access Console" @@ -566,6 +583,10 @@ if (!src.connected.occupant) return 1 // return 1 forces an update to all Nano uis attached to src + if(src.connected.radiation_check()) + src.connected.locked = lock_state + return 1 + if (prob(95)) if(prob(75)) randmutb(src.connected.occupant) @@ -577,7 +598,8 @@ else randmuti(src.connected.occupant) - src.connected.occupant.radiation += (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) + var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -666,12 +688,17 @@ if (!src.connected.occupant) return 1 + + if(src.connected.radiation_check()) + src.connected.locked = lock_state + return 1 if (prob((80 + (src.radiation_duration / 2)))) block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration) src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block) src.connected.occupant.UpdateAppearance() - src.connected.occupant.radiation += (src.radiation_intensity+src.radiation_duration) + var/radiation = (src.radiation_intensity+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) else if (prob(20+src.radiation_intensity)) randmutb(src.connected.occupant) @@ -679,7 +706,8 @@ else randmuti(src.connected.occupant) src.connected.occupant.UpdateAppearance() - src.connected.occupant.radiation += ((src.radiation_intensity*2)+src.radiation_duration) + var/radiation = ((src.radiation_intensity*2)+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src @@ -724,6 +752,10 @@ irradiating = 0 if(src.connected.occupant) + if(src.connected.radiation_check()) + src.connected.locked = lock_state + return 1 + if (prob((80 + ((src.radiation_duration / 2) + (connected.precision_coeff ** 3))))) // FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be. //if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20)) @@ -737,10 +769,12 @@ //testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!") connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block) - src.connected.occupant.radiation += ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) + var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) domutcheck(src.connected.occupant,src.connected) else - src.connected.occupant.radiation += (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff) + var/radiation = (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) if (prob(80-src.radiation_duration)) //testing("Random bad mut!") randmutb(src.connected.occupant) @@ -839,7 +873,7 @@ if (bufferOption == "transfer") if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna) - return + return 1 irradiating = 2 var/lock_state = src.connected.locked @@ -851,6 +885,9 @@ irradiating = 0 src.connected.locked = lock_state + if(src.connected.radiation_check()) + return 1 + var/datum/dna2/record/buf = src.buffers[bufferId] if ((buf.types & DNA2_BUF_UI)) @@ -862,7 +899,8 @@ src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.UpdateSE() domutcheck(src.connected.occupant,src.connected) - src.connected.occupant.radiation += (rand(20,50) / connected.damage_coeff) + var/radiation = (rand(20,50) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) return 1 if (bufferOption == "createInjector") From 0a70d22ad3ff0a1f30cd6278a1f8eda0610bd56f Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:43:24 +0200 Subject: [PATCH 4/9] Fixes mechas not gc'ing properly --- code/game/gamemodes/wizard/spellbook.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 7 +++--- .../mecha/equipment/tools/medical_tools.dm | 4 ++-- code/game/mecha/equipment/tools/tools.dm | 7 +++--- code/game/mecha/mecha.dm | 22 +++++++++---------- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0444eb9997f..5f981b3fb1a 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -488,7 +488,7 @@ dat += cat_dat[category] dat += "" - user << browse(wrap(dat), "window=spellbook;size=600x300") + user << browse(wrap(dat), "window=spellbook;size=700x300") onclose(user, "spellbook") return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 15f0b7e8aa9..33bbb110766 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -44,7 +44,7 @@ return 1 return -/obj/item/mecha_parts/mecha_equipment/proc/destroy()//missiles detonating, teleporter creating singularity? +/obj/item/mecha_parts/mecha_equipment/Destroy()//missiles detonating, teleporter creating singularity? if(chassis) chassis.equipment -= src listclearnulls(chassis.equipment) @@ -57,9 +57,8 @@ chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50) else chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50) - spawn - qdel(src) - return + chassis = null + return ..() /obj/item/mecha_parts/mecha_equipment/proc/critfail() if(chassis) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 685a65ad15e..bc7100347c5 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -29,7 +29,7 @@ allow_drop() return 0 - destroy() + Destroy() for(var/atom/movable/AM in src) AM.forceMove(get_turf(src)) return ..() @@ -263,7 +263,7 @@ chassis.events.clearEvent("onMove",event) return ..() - destroy() + Destroy() chassis.events.clearEvent("onMove",event) return ..() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 9882151bb21..d9a7b7a2044 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -665,10 +665,9 @@ M.overlays += droid_overlay return - destroy() + Destroy() chassis.overlays -= droid_overlay - ..() - return + return ..() detach() chassis.overlays -= droid_overlay @@ -941,7 +940,7 @@ GM.toxins += 100 GM.temperature = 1500+T0C //should be enough to start a fire T.visible_message("The [src] suddenly disgorges a cloud of heated plasma.") - destroy() + qdel(src) else GM.toxins += 5 GM.temperature = istype(T) ? T.air.temperature : T20C diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 249e5fa93d8..7a9894ef151 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -363,7 +363,7 @@ if(src.throwing)//high velocity mechas in your face! var/breakthrough = 0 if(istype(obstacle, /obj/structure/window/)) - obstacle.Destroy(brokenup = 1) + qdel(obstacle) breakthrough = 1 else if(istype(obstacle, /obj/structure/grille/)) @@ -377,7 +377,7 @@ else if(istype(obstacle, /obj/structure/table)) var/obj/structure/table/T = obstacle - T.destroy() + qdel(T) breakthrough = 1 else if(istype(obstacle, /obj/structure/rack)) @@ -450,7 +450,7 @@ if(ignore_threshold || src.health*100/initial(src.health) 0) src.spark_system.start() else - src.destroy() + qdel(src) return /obj/mecha/attack_hand(mob/living/user as mob) @@ -609,7 +609,7 @@ Proj.on_hit(src) return -/obj/mecha/proc/destroy() +/obj/mecha/Destroy() go_out() for(var/mob/M in src) //Let's just be ultra sure if(isAI(M)) @@ -624,7 +624,7 @@ var/obj/mecha/working/ripley/R = src if(R.cargo) for(var/obj/O in R.cargo) //Dump contents of stored cargo - O.loc = loc + O.forceMove(loc) R.cargo -= O loc.Entered(O) @@ -638,7 +638,7 @@ E.reliability = round(rand(E.reliability/3,E.reliability)) else E.forceMove(loc) - E.destroy() + qdel(E) if(cell) WR.crowbar_salvage += cell cell.forceMove(WR) @@ -649,7 +649,7 @@ else for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.forceMove(loc) - E.destroy() + qdel(E) if(cell) qdel(cell) if(internal_tank) @@ -677,16 +677,16 @@ src.log_append_to_last("Armor saved, changing severity to [severity].") switch(severity) if(1.0) - src.destroy() + qdel(src) if(2.0) if (prob(30)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/2) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) if(3.0) if (prob(5)) - src.destroy() + qdel(src) else src.take_damage(initial(src.health)/5) src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) From 2f712c3ce6e5665973882f4de9b3b68753c2d66f Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 19:52:25 +0200 Subject: [PATCH 5/9] Irradiate prior to radiation checks --- code/game/dna/dna_modifier.dm | 63 +++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index a6bbd866510..d74b2672360 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -579,12 +579,14 @@ sleep(10*src.radiation_duration) // sleep for radiation_duration seconds irradiating = 0 + src.connected.locked = lock_state if (!src.connected.occupant) return 1 // return 1 forces an update to all Nano uis attached to src - if(src.connected.radiation_check()) - src.connected.locked = lock_state + var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + if(src.connected.radiation_check()) return 1 if (prob(95)) @@ -598,9 +600,6 @@ else randmuti(src.connected.occupant) - var/radiation = (((src.radiation_intensity*3)+src.radiation_duration*3) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) - src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src if (href_list["radiationDuration"]) @@ -685,30 +684,33 @@ sleep(10*src.radiation_duration) // sleep for radiation_duration seconds irradiating = 0 + src.connected.locked = lock_state if (!src.connected.occupant) return 1 - if(src.connected.radiation_check()) - src.connected.locked = lock_state - return 1 - if (prob((80 + (src.radiation_duration / 2)))) + var/radiation = (src.radiation_intensity+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + + if(src.connected.radiation_check()) + return 1 + block = miniscrambletarget(num2text(selected_ui_target), src.radiation_intensity, src.radiation_duration) src.connected.occupant.dna.SetUISubBlock(src.selected_ui_block,src.selected_ui_subblock,block) src.connected.occupant.UpdateAppearance() - var/radiation = (src.radiation_intensity+src.radiation_duration) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) else + var/radiation = ((src.radiation_intensity*2)+src.radiation_duration) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + if(src.connected.radiation_check()) + return 1 + if (prob(20+src.radiation_intensity)) randmutb(src.connected.occupant) domutcheck(src.connected.occupant,src.connected) else randmuti(src.connected.occupant) - src.connected.occupant.UpdateAppearance() - var/radiation = ((src.radiation_intensity*2)+src.radiation_duration) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) - src.connected.locked = lock_state + src.connected.occupant.UpdateAppearance() return 1 // return 1 forces an update to all Nano uis attached to src //////////////////////////////////////////////////////// @@ -750,15 +752,16 @@ sleep(10*src.radiation_duration) // sleep for radiation_duration seconds irradiating = 0 - - if(src.connected.occupant) - if(src.connected.radiation_check()) - src.connected.locked = lock_state - return 1 - + src.connected.locked = lock_state + + if(src.connected.occupant) if (prob((80 + ((src.radiation_duration / 2) + (connected.precision_coeff ** 3))))) - // FIXME: Find out what these corresponded to and change them to the WHATEVERBLOCK they need to be. - //if ((src.selected_se_block != 2 || src.selected_se_block != 12 || src.selected_se_block != 8 || src.selected_se_block || 10) && prob (20)) + var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + + if(src.connected.radiation_check()) + return 1 + var/real_SE_block=selected_se_block block = miniscramble(block, src.radiation_intensity, src.radiation_duration) if(prob(20)) @@ -769,12 +772,14 @@ //testing("Irradiated SE block [real_SE_block]:[src.selected_se_subblock] ([original_block] now [block]) [(real_SE_block!=selected_se_block) ? "(SHIFTED)":""]!") connected.occupant.dna.SetSESubBlock(real_SE_block,selected_se_subblock,block) - var/radiation = ((src.radiation_intensity+src.radiation_duration) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) domutcheck(src.connected.occupant,src.connected) else var/radiation = (((src.radiation_intensity*2)+src.radiation_duration) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + + if(src.connected.radiation_check()) + return 1 + if (prob(80-src.radiation_duration)) //testing("Random bad mut!") randmutb(src.connected.occupant) @@ -783,7 +788,6 @@ randmuti(src.connected.occupant) //testing("Random identity mut!") src.connected.occupant.UpdateAppearance() - src.connected.locked = lock_state return 1 // return 1 forces an update to all Nano uis attached to src if(href_list["ejectBeaker"]) @@ -885,6 +889,9 @@ irradiating = 0 src.connected.locked = lock_state + var/radiation = (rand(20,50) / connected.damage_coeff) + src.connected.occupant.apply_effect(radiation,IRRADIATE,0) + if(src.connected.radiation_check()) return 1 @@ -899,8 +906,6 @@ src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.UpdateSE() domutcheck(src.connected.occupant,src.connected) - var/radiation = (rand(20,50) / connected.damage_coeff) - src.connected.occupant.apply_effect(radiation,IRRADIATE,0) return 1 if (bufferOption == "createInjector") From 3379dd6cca6e93db883ef2ba6a816bc158a5cdd0 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 20:08:05 +0200 Subject: [PATCH 6/9] Increase supply shuttle window width further --- code/game/supplyshuttle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 71398e26dda..35d25e525b1 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -3,7 +3,7 @@ #define SUPPLY_STATIONZ 1 //Z-level of the Station. #define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station #define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock -#define COMP_SCREEN_WIDTH 590 //width of supply computer interaction window +#define COMP_SCREEN_WIDTH 600 //width of supply computer interaction window #define COMP_SCREEN_HEIGHT 555 //height of supply computer interaction window var/datum/controller/supply/supply_controller = new() From 26024318990543f4c421d94379e53b821ebcc37a Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 22:39:17 +0200 Subject: [PATCH 7/9] Fix permissions for polls --- code/controllers/voting.dm | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 30ee4a99e43..1a2ebeffa5c 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -211,7 +211,7 @@ datum/controller/vote question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") else - if (get_security_level() == "red" || get_security_level() == "delta") + if (security_level > SEC_LEVEL_BLUE) return 0 if(ticker.current_state <= 2) return 0 @@ -273,11 +273,8 @@ datum/controller/vote proc/interface(var/client/C) if(!C) return var/admin = 0 - var/trialmin = 0 - if(C.holder) + if(check_rights(R_ADMIN,0)) admin = 1 - if(C.holder.rights & R_ADMIN) - trialmin = 1 voting |= C . = "Voting Panel" @@ -299,29 +296,29 @@ datum/controller/vote else . += "

Start a vote:


  • " //restart - if(trialmin || config.allow_vote_restart) + if(admin || config.allow_vote_restart) . += "Restart" else . += "Restart (Disallowed)" . += "
  • " - if(trialmin || config.allow_vote_restart) + if(admin || config.allow_vote_restart) . += "Crew Transfer" else . += "Crew Transfer (Disallowed)" - if(trialmin) + if(admin) . += "\t([config.allow_vote_restart?"Allowed":"Disallowed"])" . += "
  • " //gamemode - if(trialmin || config.allow_vote_mode) + if(admin || config.allow_vote_mode) . += "GameMode" else . += "GameMode (Disallowed)" - if(trialmin) + if(admin) . += "\t([config.allow_vote_mode?"Allowed":"Disallowed"])" . += "
  • " //custom - if(trialmin) + if(admin) . += "
  • Custom
  • " . += "

" . += "Close" From ec5f88f9ec1d633ceb5ee41cdaeab12b334fe7cf Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 22:45:51 +0200 Subject: [PATCH 8/9] Check for permissions in Topic() --- code/controllers/voting.dm | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 1a2ebeffa5c..6a05464cf73 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -272,9 +272,7 @@ datum/controller/vote proc/interface(var/client/C) if(!C) return - var/admin = 0 - if(check_rights(R_ADMIN,0)) - admin = 1 + var/admin = check_rights(R_ADMIN,0) voting |= C . = "Voting Panel" @@ -327,31 +325,32 @@ datum/controller/vote Topic(href,href_list[],hsrc) if(!usr || !usr.client) return //not necessary but meh...just in-case somebody does something stupid + var/admin = check_rights(R_ADMIN,0) switch(href_list["vote"]) if("close") voting -= usr.client usr << browse(null, "window=vote") return if("cancel") - if(usr.client.holder) + if(admin) reset() if("toggle_restart") - if(usr.client.holder) + if(admin) config.allow_vote_restart = !config.allow_vote_restart if("toggle_gamemode") - if(usr.client.holder) + if(admin) config.allow_vote_mode = !config.allow_vote_mode if("restart") - if(config.allow_vote_restart || usr.client.holder) + if(config.allow_vote_restart || admin) initiate_vote("restart",usr.key) if("gamemode") - if(config.allow_vote_mode || usr.client.holder) + if(config.allow_vote_mode || admin) initiate_vote("gamemode",usr.key) if("crew_transfer") - if(config.allow_vote_restart || usr.client.holder) + if(config.allow_vote_restart || admin) initiate_vote("crew_transfer",usr.key) if("custom") - if(usr.client.holder) + if(admin) initiate_vote("custom",usr.key) else submit_vote(usr.ckey, round(text2num(href_list["vote"]))) From ba163ea3758d653bd59c0fb44a415ba6fc28cb60 Mon Sep 17 00:00:00 2001 From: Markolie Date: Fri, 28 Aug 2015 23:19:41 +0200 Subject: [PATCH 9/9] Area fix --- _maps/map_files/cyberiad/cyberiad.dmm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 1c0163e3b43..eaf7fb4d49d 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6683,6 +6683,7 @@ "cyA" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "cyB" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) "cyC" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/virology) +"cyD" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cyE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "cyI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/camera{c_tag = "Virology Isolation 3"; dir = 2; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -6784,7 +6785,6 @@ "cAP" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint) "cAR" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint) -"cAS" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "1"},/turf/simulated/floor/plating,/area/security/checkpoint2) "cAT" = (/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAU" = (/obj/structure/table/glass,/obj/item/seeds/appleseed,/obj/item/seeds/bananaseed,/obj/item/seeds/cocoapodseed,/obj/item/seeds/grapeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/sugarcaneseed,/obj/item/seeds/wheatseed,/obj/item/seeds/watermelonseed,/obj/item/seeds/towermycelium,/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAW" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) @@ -8101,9 +8101,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazEaAyaDtaDuazEaAyaDvaDuazEaABaDwaABaABaABaABaABayYaABayYcwjcwkayYayYaABaMnaABcwmaabcwmaABaItaIraABaIPcxEaABaHGaCraABaygaAHaAHaAuaAuaAuaAuaAuaAuaAuaAuaAuaCJaCJaCKaDDaDEaISaDGaDHaDIaDJaDKaDLaDLaDLaDLaDMcmMaDNaDOaDPaDLaDLaDQaDQaDRaDSaDTaDUaDVaDWaCWaDXaDYaDYazZaBbaCgaDZaEaaEbaCgaAxaEdaDeaDecxDaGAaBdaFgaFhaFhaGsaAxaQtazKazBazBazBazBazBazKaEmaDnazKaaaaaaaMUaJeaLHaLHaJYdcmaLqaNaaWacZWaAraMUaOMaAraMUcZYaLHaMUcZZaLHaMUdabdaadacaNodadaNodafdaedahdagdajdaidakaIQaIRaIRaacaacaIRaIRaIRaIRaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaEwaExaEwaEyaEwaEzaEwaEAaEBaECaECaECaECaEDaABayYaABcxHcxGcxIayYcyScwgaMnaABaABaABaABaABaABcwgaABayYcxIaDwayYayYaCJcyTcyUaEKaEJaEJaEJaEJaELaEJaEJaEMaENaEKaEOaEPaEPaEPaEPaEPaEPaEPaEQaERaERaERaERaESaETaERaEUaERaEVaESaERaERaERaERaEWaEXaEYaEZaFaaCdaFbaFcaDYaFdaBbaCgaFeaMBaCYaCgaAxaFfaHCaHCaHIaBcaBdaHJaITaITaPhaAxdamaFmazBazBazBazBazBaFnaFoaFpazKaaaaaaaMUaLHaLHaLHaLHaLHaLHdacaNoaNoaNoaNoaNoaNoaNoaEcaLHaLHaLHaLHaHNaLHaLHaHKaLHdaodandaqdapdaraOCaOCaOCdasaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaFyaFzaFAaFBaFCaFDaFEaFFaFDaFGaFHaFDaFDaFIaABayYaABcyVayYayYcyWczLaABaPyaKxayYayYayYayYayYayYcwgczNayYaABaRkaRkaAHczOaAHaFPaACaAwaAwaAwaAEaAwaAwaAwaAFaFPaFUaFVaFVaFVaFVaFVaFVaFVaCJaERaFWaFXaFYaFZaGaaGbaGcaGdaGeaGfaGgaFXaGhaERaGiavVaGjaxzaGkaCWaGlaGmaGmaGnaGoaGpcuNaGraGraGuaGtaDgaGuaGtaGtaGvaGwaGxaAxaAxcwlaAxaEgaBkazBazBazBazBazBaBkazzazzazzaMUaMUaMUaArdcmdcmaxBaMUaMUaHKdcmaMUdaudcmaMUaxBaMUaHKaJedcmaMUaxBaMUaLHaJeaHKaLHaLIaIQdaydaedaAdazdaBdaedaCaIQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPaABaxFaABczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWbbYdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaAyaBmaGSaBmaGTaFzaFzaGUaBmaGSaBmaGVaGWaGXaGYaABayYcwgcwgaABaABaABczPczPczPaxFczPczPczPczPczPaCJaAHaAHaAHaAHaAHaAHaAHczOczQaFPaaaaabaaaaabaaaaabaaaaabaaaaFPaFUaFVaHiaHjaHkaHlaHmaFVaCJaERaHnaHnaBQaHpaHqaHraHsaHraHtaHuaBYaHnaHnaERaGiavVaHwaxzaGkaCWaCXazXazYazZaBbaHxaHyaHzaHAaHBaHBcxAaHDaHBaHDdaDdaFdaEaHHdaldbddaGazzaBkazBazBazBazBazBaBkaMUaDjaLHdaIdaJdcmaMUdcmaDjaLHaMUaDjaHKaMUaMjaLHaMUaPzaLHdcmdaPdaOaMUbfwaLHdcmaxBaxBaHKaxBaCxaIQdaUdaedaWbbYdaWdaedaXaIQaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaIfazEaDkaCzaBmaIiaIjaIkaIlaBmaCzaDlaAvazEaIoaIpaABayYayYayYayYayYayYczPczRczTczScAOczUcAPczRczPbgbaIwaEJaEJaEJaEJaEJaEJcAQcARaFPaabaIAaIAaIAaIAaIAaIAaIAaabaFPaFUaFVaIBaICaIDaIEaIBaFVaCJaERaERaERaERaIFaIGaFXaIHaFXaIGaIIaERaERaERaERaGiavVaIJaxzaGkaCWaCeazXazYazZaCfaIKaILaILaILaILaILaILaILaIMaILaINaINaINaINaINaIOaMUazzaBkazBazBazBazBazBaBkaMUaMUaLHdaYdaJdcmdaZaMUaLHaLHaMUaLHaHKdcmaLHaLHaMUaLHaLHdcmaHKaKaaMUaLHaLHdcmdbaaLHaHKaLHdbcdbbdbbaIQaIQaIQaIQaIQaIQaIQaIRaIRaIRaIRaIRaabaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaGSaBmaBmaBmaBmaBmaBmaGSaAvaJnazEaJoaJpaJqaJqaJqaJqaJqaJqcASczPczRcATczScAUcATcATczRczPaJxaJyaJzaJzaJzaJzaJzaJzaJzaJzaJwaaaaIAaJAaJBaJCaJDaJEaIAaaaaFPaFUaFVaIBaJFaJGaJHaIBaFVaCJaERaJIaJIaBQaJJaJKaHraHsaHraJKaJLaDoaHnaHnaERaGiavVaGjaxzaJNazmaJOazXazYazZaBbaIKaILaJPaJQaJRaJRaILaJSaJQaJTaINaJUaJVaJWaINaJXaMUaaaaDqaDraDraDraDraDraDsaaaaMUaLHdbedbfdcmdcmaMUaMUdcmdcmdbgdbhdcmaMUaAsaMUaMUdcmdcmdbjdbiaMUaMUaMUaWadbaaLHaHKaLHdbcaNaaAraOMaMUdbldbmdblaMUaMUaMUaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAvaGSaBmaBmaBmaBmaBmaBmaGSaAvaJnazEaJoaJpaJqaJqaJqaJqaJqaJqcyDczPczRcATczScAUcATcATczRczPaJxaJyaJzaJzaJzaJzaJzaJzaJzaJzaJwaaaaIAaJAaJBaJCaJDaJEaIAaaaaFPaFUaFVaIBaJFaJGaJHaIBaFVaCJaERaJIaJIaBQaJJaJKaHraHsaHraJKaJLaDoaHnaHnaERaGiavVaGjaxzaJNazmaJOazXazYazZaBbaIKaILaJPaJQaJRaJRaILaJSaJQaJTaINaJUaJVaJWaINaJXaMUaaaaDqaDraDraDraDraDraDsaaaaMUaLHdbedbfdcmdcmaMUaMUdcmdcmdbgdbhdcmaMUaAsaMUaMUdcmdcmdbjdbiaMUaMUaMUaWadbaaLHaHKaLHdbcaNaaAraOMaMUdbldbmdblaMUaMUaMUaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKmaKnaKmaKmaKoaKpaKmaKmaKnaKqaKrazEaGTaKsaJqaKtaKuaKvcBXcZjcBYczPczRcATczScZkcATcATczRczPaKDaKEaKFaKGaKHaKIaKJaKKaKLaKMaJwaabaIAaKNaKOaKPaKQaKRaIAaabaFPaFUaFVaKSaKTaKUaKVaKWaFVaCJaERaFWaFXaKXaKYaIGaFXaKZaFXaIGaLaaLbaFXaGhaERaGiavVaLcaxzaGkaAZaBaazXazYazZaLdaLeaILaLfaJQaJQaJQaLgaLhaLiaLjaINaLkaLlaLmaLnaLoaAsaaaaaaaaaaaaaaaaaaaaaaaaaaaaMUdbodbndbqdbpdbraMUaGyaLHaJeaHKaLHaMUaaaaMUaLHaLHaLHaLHaHKaLyaLzaLAaLAaLAaLAaLCaLBaLDdbtaLEaLFaLEdbvdbudbudbwdbydbxdbAdbzdbzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKlaKqaKmaLKaLLaLMaLNaLOaLPaLQaLRaLSaLTaLUaLVaBmaGTaLWaJqaLXaLYaLZaMaaLZaMbczPcZlcATcZmcZwcZvcZwcZxcZyaMkaMlaMmaMmaMmaMmaMmaMmaMoaMpaJwaaaaIAaMqaKOaMraKQaMsaIAaaaaFPaFUaFVaMtaMuaMvaMwaMxaFVaCJaERaMyaMyaBQaMzaJKaHraMAaHraJKaNOaBYaMCaMCaERaMDaxNaMEaxzaGkaAZaMFaMFaMFaMFaMGaMHaMIaMJaMKaMLaMLaMLaMMaMLaMNaMOaMPaMQaMRaMOaMSdbBaAsaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUaMUdbCaMUaMUaMUaMUaLHaHKdboavqaabavqaLHaNbaNcaNddbEaNfaNgaNhaNhaNhaNhaNiaNjaNkdbFaNlaNmaNlaNnaNlaNldbGdbHaNqaNqaDxaLJaNsaNsaNsaNsaNsaNsaNsaNsaNsabCacUaaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLUaNuaNvaNwaLTaNxaLMaNxaLMaNxaLMaNxaLTaNyaNzaBmaGTaNAaJqaNBaNCaNDaNEaNFaNGczPcZzcATcZAcZCcZBcZEcZDczPaZqaMmaMmaMmaMmaMmaMmaMmaMoaNPaJwaabaIAaNQaNRaNSaNTaNUaIAaabaFPaFUaFVaNVaNWaNXaNYaNZaFVaCJaERaERaERaERaOaaIGaFXaIHaFXaIGaObaERaERaERaERaOcaOdaOeaxzaJNaOfaOgaOgaOgaOhaOiaCnaOjaOkaOlaOjaOmaOnaOoaOjaOpaOqaOraOsaOtaINaOuaOvaOwaOxaOxaOvaOyaOzaOzaOzaOzaOzaOAaOBaOzdbJaODdbKaOGdbLaOHdbMaOIaDAdbOaDAaOKaOLaLHaMUaONaOOaOPaOQaORaOSaOTaOUaOVaOWaOVaOXaOYaOZaPaaPbaPcaPdaPeaPfaSFdbPaLJaPiaPjaPkaPlaPmaPnaPoaPpaPqaPraaaaaaaaaaaaaaaaaaaaaaNtaNtaNtaNtaNtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa