diff --git a/SQL/aurora_schema.sql b/SQL/aurora_schema.sql
index 1b46c8b4..c33433bd 100644
--- a/SQL/aurora_schema.sql
+++ b/SQL/aurora_schema.sql
@@ -104,3 +104,19 @@ CREATE TABLE `ss13_notes` (
`lasteditdate` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=LATIN1;
+
+-- ------------------------------
+-- SQL based secret santi klaus table
+-- tgstation.ss13_santa
+-- ------------------------------
+CREATE TABLE `ss13_santa` (
+ `character_name` varchar(32) NOT NULL,
+ `participation_status` tinyint(1) NOT NULL DEFAULT '1',
+ `mark_name` varchar(32) DEFAULT NULL,
+ `character_gender` varchar(32) NOT NULL,
+ `character_species` varchar(32) NOT NULL,
+ `character_job` varchar(32) NOT NULL,
+ `character_like` mediumtext NOT NULL,
+ `gift_assigned` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`character_name`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/aurora.dme b/aurora.dme
index 26eeb25f..1e11d8f1 100644
--- a/aurora.dme
+++ b/aurora.dme
@@ -39,6 +39,7 @@
#define FILE_DIR "icons/obj/clothing/species/tajaran"
#define FILE_DIR "icons/obj/clothing/species/unathi"
#define FILE_DIR "icons/obj/custom_items"
+#define FILE_DIR "icons/obj/door_braces"
#define FILE_DIR "icons/obj/doors"
#define FILE_DIR "icons/obj/flora"
#define FILE_DIR "icons/obj/machines"
@@ -567,6 +568,7 @@
#include "code\game\objects\items\devices\binoculars.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
#include "code\game\objects\items\devices\debugger.dm"
+#include "code\game\objects\items\devices\door_bracer.dm"
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\isocube.dm"
@@ -1455,6 +1457,7 @@
#include "code\modules\scripting\Parser\Parser.dm"
#include "code\modules\scripting\Scanner\Scanner.dm"
#include "code\modules\scripting\Scanner\Tokens.dm"
+#include "code\modules\secretsanta\submission_box.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
#include "code\modules\shuttles\antagonist.dm"
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 696fb288..6da7f62f 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1345,3 +1345,23 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "Pill Bottle Kit"
access = access_medical
group = "Medical / Science"
+
+/datum/supply_packs/doorbracers_engineering
+ name = "Engineering Doorbracer Crate"
+ contains = list(/obj/item/device/doorbrace/engineering,
+ /obj/item/device/doorbrace/engineering,
+ /obj/item/device/doorbrace/engineering)
+ cost = 30
+ containertype = /obj/structure/closet/crate
+ containername = "engineering doorbracers"
+ group = "Engineering"
+
+/datum/supply_packs/doorbracers_security
+ name = "Security Doorbracer Crate"
+ contains = list(/obj/item/device/doorbrace/security,
+ /obj/item/device/doorbrace/security,
+ /obj/item/device/doorbrace/security)
+ cost = 30
+ containertype = /obj/structure/closet/crate
+ containername = "security doorbracers"
+ group = "Security"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 8b49259e..4712c727 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -51,6 +51,7 @@
var/door_sound='sound/machines/airlock.ogg'
var/door_sound_distance=30
autoclose = 1
+ var/obj/item/device/doorbrace/bracer = null
/obj/machinery/door/airlock/command
name = "Airlock"
@@ -717,6 +718,15 @@ About the new airlock wires panel:
set_frequency(ST.change_freq(frequency))
return
+ if (istype(C, /obj/item/device/doorbrace))
+ if (bracer)
+ user << "There is already a [bracer] on [src]!"
+ return
+
+ var/obj/item/device/doorbrace/newbracer = C
+ newbracer.attachto(src, user)
+ return
+
src.add_fingerprint(user)
if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density))
var/obj/item/weapon/weldingtool/W = C
@@ -824,7 +834,10 @@ About the new airlock wires panel:
playsound(src.loc, door_sound, door_sound_distance, 1)
/obj/machinery/door/airlock/open(var/forced=0)
- if( operating || welded || locked )
+ if( operating || welded || locked)
+ return 0
+ if (bracer)
+ visible_message("[src]'s actuators whirr, but the door does not open.")
return 0
if(!forced)
if( !arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
@@ -915,7 +928,9 @@ About the new airlock wires panel:
break
/obj/machinery/door/airlock/proc/prison_open()
+ if (bracer)
+ return
src.unlock()
src.open()
src.lock()
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/items/devices/door_bracer.dm b/code/game/objects/items/devices/door_bracer.dm
new file mode 100644
index 00000000..8c45f2cf
--- /dev/null
+++ b/code/game/objects/items/devices/door_bracer.dm
@@ -0,0 +1,289 @@
+#define STATUS_INACTIVE 0
+#define STATUS_ACTIVE 1
+#define STATUS_BROKEN 2
+
+#define LAYER_ATTACHED 3.2
+#define LAYER_NORMAL 3
+
+/obj/item/device/doorbrace
+ name = "magnetic door lock"
+ desc = "A large, ID locked device used for completely locking down airlocks."
+ icon = 'icons/obj/door_braces/centcom.dmi'
+ icon_state = "inactive"
+ w_class = 3
+ req_access = list(103)
+ health = 90
+
+ var/department = "CENTCOM"
+ var/status = 0
+ var/constructionstate = 0
+ var/obj/machinery/door/airlock/target = null
+
+/obj/item/device/doorbrace/security
+ icon = 'icons/obj/door_braces/security.dmi'
+ department = "Security"
+ req_access = list(1)
+
+/obj/item/device/doorbrace/engineering
+ icon = 'icons/obj/door_braces/engineering.dmi'
+ department = "Engineering"
+ req_access = null
+ req_one_access = list(11, 24)
+
+/obj/item/device/doorbrace/examine()
+ ..()
+
+ if (status == STATUS_BROKEN)
+ usr << "It looks broken!"
+ else
+ usr << "\blue This device has [department] department markings on it."
+
+/obj/item/device/doorbrace/attack_hand(var/mob/user)
+ if (status == STATUS_ACTIVE)
+ ui_interact(user)
+ else
+ ..()
+
+/obj/item/device/doorbrace/bullet_act(var/obj/item/projectile/Proj)
+ takedamage(Proj.damage)
+ ..()
+
+/obj/item/device/doorbrace/attackby(var/obj/item/I, var/mob/user)
+ if (status == STATUS_BROKEN)
+ user << "[src] is broken beyond repair!"
+ return
+
+ if (istype(I, /obj/item/weapon) && user.a_intent == "hurt")
+ if (I.force >= 8)
+ user.visible_message("[user] bashes [src] with [I]!", "You strike [src] with [I], damaging it!")
+ takedamage(I.force)
+ return
+ else
+ user.visible_message("[user] hits [src] with [I] to no visible effect.", "You hit [src] with [I], but it appears to have no effect.")
+ return
+
+ switch (constructionstate)
+ if (0)
+ if (istype(I, /obj/item/weapon/card/emag))
+ var/obj/item/weapon/card/emag/emagcard = I
+ emagcard.uses--
+ visible_message("[src] sparks and falls off the door!", "You emag [src], frying its circuitry[status == STATUS_ACTIVE ? " and making it drop onto the floor" : ""]!")
+
+ setstatus(STATUS_BROKEN)
+ return
+
+ if (status == STATUS_ACTIVE && istype(I, /obj/item/weapon/card/id))
+ if (check_access(I) && !constructionstate)
+ user << "You swipe your [I] through [src], making it drop onto the floor with a thud."
+ setstatus(STATUS_INACTIVE)
+ return
+ else if (constructionstate)
+ user << "You cannot swipe your [I] through [src] with it partially dismantled!"
+ return
+ else
+ user << "A red light flashes on [src] as you swipe your [I] through it."
+ flick("deny",src)
+ return
+
+ if (istype(I, /obj/item/weapon/screwdriver))
+ user << "You unfasten and remove the plastic cover from [src], revealing a thick metal shell."
+ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ setconstructionstate(1)
+ return
+
+ if (1)
+ if (istype(I, /obj/item/weapon/screwdriver))
+ user << "You put the metal cover of back onto [src], and screw it tight."
+ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ setconstructionstate(0)
+ return
+ if (istype(I, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = I
+ if (WT.remove_fuel(1, user))
+ user.visible_message("[user] starts welding through the metal shell of [src].", "You start welding through the metal covering of [src]")
+ playsound(loc, 'sound/items/Welder.ogg', 50, 1)
+ if (do_after(user, 25))
+ user << "You are able to weld through the metal shell of [src]."
+ setconstructionstate(2)
+ return
+ if (2)
+ if (istype(I, /obj/item/weapon/crowbar))
+ user << "You pry off the metal covering from [src]."
+ playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ setconstructionstate(3)
+ return
+ if (3)
+ if (istype(I, /obj/item/weapon/wirecutters))
+ user << "You cut the wires connecting the [src]'s magnets to their powersupply, [target ? "making the device fall off [target] and rendering it unusable." : "rendering the device unusable."]"
+ playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ setconstructionstate(4)
+ return
+
+/obj/item/device/doorbrace/proc/attachto(var/obj/machinery/door/airlock/newtarget, var/mob/user as mob)
+ if (status == STATUS_BROKEN)
+ user << "[src] is damaged beyond repair! It cannot be used!"
+ return
+
+ if (!newtarget.density || newtarget.operating)
+ user << "[newtarget] must be closed before you can attach [src] to it!"
+ return
+
+ if (newtarget.p_open)
+ user << "You must close [newtarget]'s maintenance panel before attaching [src] to it!"
+ return
+
+ user.visible_message("[user] starts mounting [src] onto [newtarget].", "You begin mounting [src] onto [newtarget].")
+ if (do_after(user, 35, 1))
+ if (status == STATUS_BROKEN)
+ user << "[src] is damaged beyond repair! It cannot be used!"
+ return
+
+ if (!newtarget.density)
+ user << "[newtarget] must be closed before you can attach [src] to it!"
+ return
+
+ if (newtarget.p_open)
+ user << "You must close [newtarget]'s maintenance panel before attaching [src] to it!"
+ return
+
+ user.visible_message("[user] attached [src] onto [newtarget] and flicks it on. The magnetic lock now seals [newtarget].", "You attached [src] onto [newtarget] and switched on the magnetic lock.")
+ user.drop_item()
+
+ setstatus(STATUS_ACTIVE, newtarget)
+ return
+
+/obj/item/device/doorbrace/proc/setstatus(var/newstatus, var/obj/machinery/door/airlock/newtarget as obj)
+ switch (newstatus)
+ if (STATUS_INACTIVE)
+ if (status != STATUS_ACTIVE)
+ return
+ if (!target)
+ return
+
+ detach()
+ icon_state = "inactive"
+ status = newstatus
+
+ if (STATUS_ACTIVE)
+ if (status != STATUS_INACTIVE)
+ return
+ if (!newtarget)
+ return
+
+ attach(newtarget)
+ icon_state = "active"
+ status = newstatus
+
+ if (STATUS_BROKEN)
+ spark()
+
+ if (target)
+ var/playflick = 1
+ if (constructionstate)
+ playflick = 0
+
+ detach(playflick)
+
+ icon_state = "broken"
+ status = newstatus
+
+/obj/item/device/doorbrace/proc/setconstructionstate(var/newstate)
+ constructionstate = newstate
+ if (newstate == 0)
+ if (status == STATUS_ACTIVE)
+ icon_state = "active"
+ else
+ icon_state = "inactive"
+ else if (newstate == 2)
+ flick("deconstruct_2_anim", src)
+ else if (newstate == 4)
+ setstatus(STATUS_BROKEN)
+ else
+ icon_state = "deconstruct_[constructionstate]"
+
+/obj/item/device/doorbrace/proc/detach(var/playflick = 1)
+ if (target)
+
+ if (playflick)
+ spawn(-15) flick("release", src)
+
+ adjustsprite(null)
+ layer = LAYER_NORMAL
+
+ target.bracer = null
+
+ anchored = 0
+
+/obj/item/device/doorbrace/proc/attach(var/obj/machinery/door/airlock/newtarget as obj)
+ adjustsprite(newtarget)
+ layer = LAYER_ATTACHED
+ flick("deploy", src)
+
+ newtarget.bracer = src
+ target = newtarget
+
+ anchored = 1
+
+/obj/item/device/doorbrace/proc/adjustsprite(var/obj/target as obj)
+ if (target)
+ switch (get_dir(src, target))
+ if (NORTH)
+ pixel_x = 0
+ pixel_y = 32
+ if (NORTHEAST)
+ pixel_x = 32
+ pixel_y = 32
+ if (EAST)
+ pixel_x = 32
+ pixel_y = 0
+ if (SOUTHEAST)
+ pixel_x = 32
+ pixel_y = -32
+ if (SOUTH)
+ pixel_x = 0
+ pixel_y = -32
+ if (SOUTHWEST)
+ pixel_x = -32
+ pixel_y = -32
+ if (WEST)
+ pixel_x = -32
+ pixel_y = 0
+ if (NORTHWEST)
+ pixel_x = -32
+ pixel_y = 32
+ else
+ pixel_x = 0
+ pixel_y = 0
+
+/obj/item/device/doorbrace/proc/takedamage(var/damage)
+ health -= damage
+
+ if (damage >= 40 && prob(50))
+ health = 0
+
+ if (health <= 0)
+ visible_message("[src] sparks[target ? " and falls off of \the [target]!" : "!"] It is now completely unusable!")
+ setstatus(STATUS_BROKEN)
+ return
+
+ if (prob(50))
+ spark()
+
+/obj/item/device/doorbrace/proc/spark()
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+
+ if (target)
+ s.set_up(5, 1, target)
+ else
+ s.set_up(5, 1, src)
+
+ s.start()
+ spawn(5)
+ del(s)
+
+#undef STATUS_INACTIVE
+#undef STATUS_ACTIVE
+#undef STATUS_BROKEN
+
+#undef LAYER_ATTACHED
+#undef LAYER_NORMAL
diff --git a/code/modules/secretsanta/submission_box.dm b/code/modules/secretsanta/submission_box.dm
new file mode 100644
index 00000000..f5699fc7
--- /dev/null
+++ b/code/modules/secretsanta/submission_box.dm
@@ -0,0 +1,266 @@
+/*
+* Contains the secret santa structures and procs.
+* Requires database modification to work.
+*/
+
+#define CUTOFF_DATE 19
+#define STATUS_CLOSED 0
+#define STATUS_SIGNUP 1
+#define STATUS_GIFTS 2
+
+/obj/structure/santa_signup_box
+ name = "Secret Santa Sign-up Box"
+ desc = "Sign up to participate in NSS Aurora secret santa extravaganza here!"
+ anchored = 1
+ density = 1
+
+ icon = 'icons/obj/secret_santa.dmi'
+ icon_state = "sign_up_box"
+
+ var/daysLeft
+ var/signupStatus
+
+/obj/structure/santa_signup_box/New()
+ ..()
+
+ daysLeft = CUTOFF_DATE - text2num(time2text(world.realtime, "DD"))
+
+ if (time2text(world.realtime, "MM") != "12")
+ signupStatus = STATUS_CLOSED
+ return
+
+ if (daysLeft > 0)
+ signupStatus = STATUS_SIGNUP
+ else
+ signupStatus = STATUS_GIFTS
+
+/obj/structure/santa_signup_box/examine()
+ ..()
+
+ switch (signupStatus)
+ if (STATUS_SIGNUP)
+ usr << "\blue Sign-ups to participate are still being accepted for the next [daysLeft] days!"
+ if (STATUS_GIFTS)
+ usr << "\blue Currently accepting gift submissions from assigned santas!"
+ else
+ usr << "\red Christmas is over! Go home, scrub!"
+
+/obj/structure/santa_signup_box/attack_hand(mob/user)
+ add_fingerprint(user)
+ ui_interact(user)
+
+/obj/structure/santa_signup_box/ui_interact(mob/user)
+ if (user.stat)
+ return
+
+ if (!ishuman(user))
+ user << "\red You must be human to use this machine!"
+ return
+
+ var/mob/living/carbon/human/M = user
+
+ if (!M.client || M.client.player_age < 14)
+ user << "\red You haven't been around for long enough to participate! Sorry, but this is kind of an anti-spam measure..."
+ return
+
+ var/explanation = "
Explanation:
"
+ explanation += "Everyone has until the 18th of December to sign up to participate. On the 19th of December, everyone who's signed up will be assigned a mark. You can return to this box on that day, or afterwards, to check up who you were assigned!
After that, until the 26th of December, you can submit a gift idea to this box. The gifts will be delivered by a NanoTrasen approved Santa Claus after the 24th!
"
+ explanation += "OOC remarks: Be creative, any item that is ingame is a go! Also, feel free to seek out your mark and try to figure out what would suit them best! The gifted items will spawn on the marked characters until mid-to-late-January.
No weapons or godmodded items -- the only rule.
If you were assigned a mark you don't know anything about, and cannot reasonably interact with due to timezone constraints, please contact Skull132 ASAP!"
+
+ var/dat
+
+ establish_db_connection()
+
+ if (dbcon.IsConnected())
+ switch (signupStatus)
+ if (STATUS_CLOSED)
+ dat += "
Christmas is over! Go home, scrub!"
+ if (STATUS_SIGNUP)
+ if (isSignedUp(M))
+ dat += "You are currently signed up to participate in the NSS Aurora secret santa extravaganza!
"
+ dat += "You have [daysLeft] days left to change your mind, should you want to!
"
+ dat += "Withdraw Participation"
+ else
+ dat += "You are currently not signed up to participate in the NSS Aurora secret santa extravaganza!
"
+ dat += "You have [daysLeft] days left to sign up!
"
+ dat += "Sign up to participate!"
+
+ dat += explanation
+
+ if (STATUS_GIFTS)
+ if (isSignedUp(M))
+ if (hasMark(M))
+ var/list/markInfo = getMarkInfo(hasMark(M))
+
+ dat += "Your mark is: [hasMark(M)]!
"
+ dat += "Figure out what they may like for Christmas, and submit the idea for NanoTrasen approval!
"
+ dat += "Your mark is a [markInfo["character_gender"]] [markInfo["character_species"]] working aboard the NSS Aurora as a [markInfo["character_job"]]. They like [markInfo["character_like"]].
"
+
+ if (markInfo["assigned_gift"])
+ dat += "You are giving them a [markInfo["assigned_gift"]]. Revise"
+ else
+ dat += "Submit Gift Idea"
+
+ else
+ dat += "You have no mark! This is bad! Contact an admin, pronto!"
+
+ dat += explanation
+ else
+ dat += "
You didn't sign up in time! Sorry!
"
+ dat += "Better luck next time!"
+ else
+ dat += "No database connection! System unable to operate!"
+
+ M << browse(dat, "window=secret_santa")
+ return
+
+/obj/structure/santa_signup_box/Topic(href, href_list)
+ ..()
+
+ var/mob/living/carbon/user = locate(href_list["user"])
+
+ switch (href_list["choice"])
+ if ("withdraw")
+ withdrawSignUp(user)
+ if ("signup")
+ signUp(user)
+ if ("reviseGift")
+ alterGift(user)
+ if ("submitGift")
+ assignGift(user)
+
+ ui_interact(user)
+ return
+
+/obj/structure/santa_signup_box/proc/signUp(var/mob/living/carbon/human/user)
+ if (!user.client || user.stat || !user.real_name)
+ user << "\red No. Die."
+ return
+
+ establish_db_connection()
+
+ if (!dbcon.IsConnected())
+ user << "\red No database connection! Bad!"
+ return
+
+ var/queryText
+
+ var/DBQuery/lookupQuery = dbcon.NewQuery("SELECT * FROM ss13_santa WHERE character_name = '[user.real_name]'")
+ lookupQuery.Execute()
+ if (lookupQuery.NextRow())
+ if (alert(user, "Your data already exists here. Do you just want to be added to the roster again?", "Choices, choices...", "Yes", "No") == "Yes")
+ queryText = "UPDATE ss13_santa SET participation_status = '1' WHERE character_name = '[user.real_name]'"
+ else
+ return
+
+ else
+ var/list/storeArray = list("character_name", "character_gender", "character_species", "character_job", "character_like")
+
+ storeArray["character_name"] = user.real_name
+ storeArray["character_gender"] = user.gender
+ storeArray["character_species"] = user.species.name
+ storeArray["character_job"] = input(user, "Please type in your character's normal job", "Character Job") as text
+ storeArray["character_like"] = input(user, "Please specific 1 of your character's likes", "Character Like") as message
+
+ storeArray["character_job"] = sanitizeSQL(storeArray["character_job"])
+ storeArray["character_like"] = sanitizeSQL(storeArray["character_like"])
+
+ queryText = "INSERT INTO ss13_santa (character_name, character_gender, character_species, character_job, character_like) VALUES ('[storeArray["character_name"]]', '[storeArray["character_gender"]]', '[storeArray["character_species"]]', '[storeArray["character_job"]]', '[storeArray["character_like"]]')"
+
+ var/DBQuery/query = dbcon.NewQuery(queryText)
+ if (!query.Execute())
+ user << "\red Something went wrong! Give this error to the coders: [query.ErrorMsg()]."
+ else
+ user << "\blue You are now signed up for the NSS Aurora secret santa extravaganza! Return here after the 18th of December to find out who your mark is!"
+
+ return
+
+/obj/structure/santa_signup_box/proc/isSignedUp(var/mob/living/carbon/human/user)
+ establish_db_connection()
+
+ if (!dbcon.IsConnected())
+ return 0
+
+ var/isSignedUp = 0
+
+ var/DBQuery/query = dbcon.NewQuery("SELECT participation_status FROM ss13_santa WHERE character_name = '[user.real_name]'")
+ query.Execute()
+ if (query.NextRow())
+ isSignedUp = text2num(query.item[1])
+
+ return isSignedUp
+
+/obj/structure/santa_signup_box/proc/withdrawSignUp(var/mob/living/carbon/human/user)
+ establish_db_connection()
+
+ if (!dbcon.IsConnected())
+ return
+
+ var/DBQuery/query = dbcon.NewQuery("UPDATE ss13_santa SET participation_status = '0' WHERE character_name = '[user.real_name]'")
+ query.Execute()
+ return
+
+/obj/structure/santa_signup_box/proc/hasMark(var/mob/living/carbon/human/user)
+ establish_db_connection()
+
+ if (!dbcon.IsConnected())
+ return 0
+
+ var/DBQuery/query = dbcon.NewQuery("SELECT mark_name FROM ss13_santa WHERE character_name = '[user.real_name]'")
+ query.Execute()
+ if (query.NextRow())
+ return query.item[1]
+
+ return 0
+
+/obj/structure/santa_signup_box/proc/getMarkInfo(var/markName)
+ if (!markName)
+ return 0
+
+ establish_db_connection()
+
+ if (!dbcon.IsConnected())
+ return 0
+
+ var/list/returnArray = list("character_name", "character_gender", "character_species", "character_job", "character_like")
+ var/DBQuery/query = dbcon.NewQuery("SELECT character_gender, character_species, character_job, character_like, assigned_gift WHERE character_name = '[markName]'")
+ query.Execute()
+ if (query.NextRow())
+ returnArray["character_gender"] = query.item[1]
+ returnArray["character_species"] = query.item[2]
+ returnArray["character_job"] = query.item[3]
+ returnArray["character_like"] = query.item[4]
+ returnArray["assigned_gift"] = query.item[5]
+
+ return returnArray
+
+ return 0
+
+/obj/structure/santa_signup_box/proc/assignGift(var/mob/living/carbon/user)
+ establish_db_connection()
+
+ if (!dbcon.IsConnected())
+ return
+
+ var/gift = input(user, "What would you like to gift your mark?", "Pick a Gift!") as text
+ gift = sanitizeSQL(gift)
+
+ var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_santa (gift_assigned) VALUES ('[gift]') WHERE character_name = '[hasMark(user)]'")
+ query.Execute()
+
+/obj/structure/santa_signup_box/proc/alterGift(var/mob/living/carbon/user)
+ establish_db_connection()
+
+ if (!dbcon.IsConnected())
+ return
+
+ var/gift = input(user, "What would you like to gift your mark?", "Pick a Gift!") as text
+ gift = sanitizeSQL(gift)
+
+ var/DBQuery/query = dbcon.NewQuery("UPDATE ss13_santa SET gift_assigned = '[gift]' WHERE character_name = '[hasMark(user)]'")
+ query.Execute()
+
+#undef CUTOFF_DATE
+#undef STATUS_CLOSED
+#undef STATUS_SIGNUP
+#undef STATUS_GIFTS
diff --git a/icons/obj/door_braces/centcom.dmi b/icons/obj/door_braces/centcom.dmi
new file mode 100644
index 00000000..97a97794
Binary files /dev/null and b/icons/obj/door_braces/centcom.dmi differ
diff --git a/icons/obj/door_braces/engineering.dmi b/icons/obj/door_braces/engineering.dmi
new file mode 100644
index 00000000..49323f4a
Binary files /dev/null and b/icons/obj/door_braces/engineering.dmi differ
diff --git a/icons/obj/door_braces/security.dmi b/icons/obj/door_braces/security.dmi
new file mode 100644
index 00000000..00a820fb
Binary files /dev/null and b/icons/obj/door_braces/security.dmi differ
diff --git a/icons/obj/secret_santa.dmi b/icons/obj/secret_santa.dmi
new file mode 100644
index 00000000..0da09e64
Binary files /dev/null and b/icons/obj/secret_santa.dmi differ
diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm
index beb222db..a954fa60 100644
--- a/maps/tgstation2.dmm
+++ b/maps/tgstation2.dmm
@@ -638,7 +638,7 @@
"amn" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/structure/window/reinforced{dir = 4},/obj/item/device/binoculars,/obj/item/device/binoculars,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/security/armoury)
"amo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/armoury)
"amp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/security/armoury)
-"amq" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/security/armoury)
+"amq" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/rack,/obj/item/device/doorbrace/security{pixel_x = 5; pixel_y = -5},/obj/item/device/doorbrace/security,/obj/item/device/doorbrace/security{pixel_x = -5; pixel_y = 5},/turf/simulated/floor,/area/security/armoury)
"amr" = (/obj/structure/dispenser{plasmatanks = 0},/obj/machinery/alarm{locked = 1; pixel_y = 23},/obj/machinery/atmospherics/unary/vent_pump/on{tag = "icon-map_vent_out (WEST)"; icon_state = "map_vent_out"; dir = 8},/obj/machinery/camera{dir = 8},/turf/simulated/floor{icon_state = "bot"},/area/security/armoury)
"ams" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/auxport)
"amt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/auxport)
@@ -3211,9 +3211,9 @@
"bjM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/cafeteria)
"bjN" = (/obj/structure/sign/double/barsign,/turf/simulated/wall,/area/crew_quarters/cafeteria)
"bjO" = (/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
-"bjP" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
-"bjQ" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
-"bjR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = -2; pixel_y = 0},/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = -2; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{tag = "icon-map_vent_out (EAST)"; icon_state = "map_vent_out"; dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"bjP" = (/obj/effect/overlay/snow{tag = "icon-snowfloor_w"; icon_state = "snowfloor_w"},/obj/effect/overlay/snow{tag = "icon-snowfloor_s"; icon_state = "snowfloor_s"},/obj/structure/sign/christmas/lights{tag = "icon-xmaslights (NORTH)"; icon_state = "xmaslights"; dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"bjQ" = (/obj/effect/overlay/snow{tag = "icon-snowwall_s"; icon_state = "snowwall_s"},/obj/structure/sign/christmas/lights{tag = "icon-xmaslights (NORTH)"; icon_state = "xmaslights"; dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"bjR" = (/obj/effect/overlay/snow,/obj/structure/santa_signup_box,/obj/structure/sign/christmas/lights{tag = "icon-xmaslights (NORTH)"; icon_state = "xmaslights"; dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
"bjS" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
"bjT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
"bjU" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
@@ -3396,7 +3396,7 @@
"bnp" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/turf/simulated/floor/wood,/area/crew_quarters/cafeteria)
"bnq" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (NORTHEAST)"; icon_state = "intact-scrubbers"; dir = 5},/turf/simulated/floor,/area/hallway/primary/central)
"bnr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{tag = "icon-map-scrubbers (NORTH)"; icon_state = "map-scrubbers"; dir = 1},/turf/simulated/floor,/area/hallway/primary/central)
-"bns" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{tag = "icon-map-scrubbers (NORTH)"; icon_state = "map-scrubbers"; dir = 1},/turf/simulated/floor,/area/hallway/primary/central)
+"bns" = (/obj/effect/overlay/snow,/obj/structure/sign/christmas/lights{tag = "icon-xmaslights (NORTH)"; icon_state = "xmaslights"; dir = 1},/obj/item/weapon/toy/xmas_cracker{pixel_x = 3; pixel_y = -3},/obj/item/weapon/toy/xmas_cracker,/obj/item/weapon/toy/xmas_cracker{pixel_x = -3; pixel_y = 3},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
"bnt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor,/area/hallway/primary/central)
"bnu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/central)
"bnv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor,/area/hallway/primary/central)
@@ -6605,7 +6605,7 @@
"cxa" = (/obj/structure/stool,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"cxb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft)
"cxc" = (/turf/simulated/wall/r_wall,/area/engine/storage_hard)
-"cxd" = (/obj/machinery/power/apc{dir = 8; name = "Engineering Storage APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engine/storage)
+"cxd" = (/obj/machinery/power/apc{dir = 8; name = "Engineering Storage APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/table/reinforced{icon_state = "table"},/obj/item/device/doorbrace/engineering{pixel_x = 5; pixel_y = -5},/obj/item/device/doorbrace/engineering,/obj/item/device/doorbrace/engineering{pixel_x = -5; pixel_y = 5},/turf/simulated/floor,/area/engine/storage)
"cxe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{tag = "icon-map-scrubbers (WEST)"; icon_state = "map-scrubbers"; dir = 8},/turf/simulated/floor,/area/engine/storage)
"cxf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor,/area/engine/storage)
"cxg" = (/obj/structure/table,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/cable_coil,/obj/item/weapon/cable_coil,/obj/item/clothing/glasses/welding,/obj/item/weapon/book/manual/supermatter_engine,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_scrubber/on{tag = "icon-map_scrubber_on (WEST)"; icon_state = "map_scrubber_on"; dir = 8},/turf/simulated/floor,/area/engine/storage)
@@ -11988,6 +11988,14 @@
"ewB" = (/obj/machinery/mineral/stacking_machine,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/production)
"ewC" = (/obj/machinery/mineral/input,/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/mine/production)
"ewD" = (/turf/space,/area/vox_station/mining)
+"ewE" = (/obj/effect/overlay/snow{tag = "icon-snowfloor_e"; icon_state = "snowfloor_e"},/obj/effect/overlay/snow{tag = "icon-snowfloor_s"; icon_state = "snowfloor_s"},/obj/structure/reagent_dispensers/water_cooler,/obj/structure/sign/christmas/lights{tag = "icon-xmaslights (NORTH)"; icon_state = "xmaslights"; dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"ewF" = (/obj/effect/overlay/snow,/obj/structure/sign/christmas/lights{tag = "icon-xmaslights (NORTH)"; icon_state = "xmaslights"; dir = 1},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"ewG" = (/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = -2; pixel_y = 0},/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/food/drinks/sillycup{pixel_x = -2; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{tag = "icon-map_vent_out (EAST)"; icon_state = "map_vent_out"; dir = 4},/obj/structure/table,/obj/structure/sign/christmas/lights{tag = "icon-xmaslights (NORTH)"; icon_state = "xmaslights"; dir = 1},/obj/item/clothing/head/festive,/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"ewH" = (/obj/effect/overlay/snow,/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"ewI" = (/obj/effect/overlay/snow{tag = "icon-snowfloor_s"; icon_state = "snowfloor_s"},/obj/effect/overlay/snow{tag = "icon-snowfloor_w"; icon_state = "snowfloor_w"},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"ewJ" = (/obj/effect/overlay/snow{tag = "icon-snowwall_e"; icon_state = "snowwall_e"},/turf/simulated/floor,/area/crew_quarters/fitness{name = "\improper Holodeck Control"})
+"ewK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{tag = "icon-map-scrubbers (NORTH)"; icon_state = "map-scrubbers"; dir = 1},/obj/effect/overlay/snow{tag = "icon-snowwall_s"; icon_state = "snowwall_s"},/turf/simulated/floor,/area/hallway/primary/central)
+"ewL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; name = "Air supply main pipe"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/effect/overlay/snow{tag = "icon-snowwall_s"; icon_state = "snowwall_s"},/turf/simulated/floor,/area/hallway/primary/central)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -12118,9 +12126,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckaaaaaaaaaaaaaaaaAoarPbePaBwaYYasSasSasSasSasSasSbeQbeRaVOaVOaVOaVOaVOaVOaVOaVOaVOaVObeSbeTbeUbaUbczbeVbeabeWbaUbeXbeYbeXaQTbcGbcHbeZbfaaQTaXCbeebcLbfbbfcbfdbfebffbcLbekbfgbfhbfhbfibfjbfkbcRbflaZxaLoaZyaWkaWlaWnbbqaWkbfmbfnbfobfpbfqbfraOCbfsaLoaTiaTjaTjaTjaTjaTjaTiaWwbftbfubfvbfwbfxaRuaZNbfyaThbfzbfAbfBbfCbdAbdybdybdAbdAbdAbfDbdAbfEbdybfFbdAbdAbdAbdAbdAbdAbdAbfGbfHbfIbfJbdAbdAbdAbfEbdAbfKbdAbfLbfMbdAbdAbfNbdAbfObdAbfPbdAbdAbdAbfFbdAbfQbfRbdAbdAbfSbfTbdAbfCbfKbfUbfVbfWbfXaVBbfYaVBbfZbfYbgaaYRaYQaYSbgbbgcbgcbgdaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeHbgebgfbggbghbgibgjbgkbgkbglbgmbgkbgnbgoaQRbgpbgqbgrbaUbaUbaUbgsbebbaUaQTaQTaQTaQTbcGbgtbgubgvaQTbgwbgxbcLbgybgzbgAbgBbgCbcLbekbgDbfhbfhbgEbfhbgFbcRbgGaZxaLobboaWkbgHbgIaZAaWkbgJbgKaLobgLbgMbgNaLobgLaLoaTiaTjaTjaTjaTjaTjaTibgObgPbgQbgRbdcbgSaRubgTbgUbgVbgWbgXbgYbgZbhabhbbhcbhabhabhabhabhabhabhdbhabhabhabhabhabhabhabhabhebhfbhgbhhbhabhabhabhabhabhibhjbhkbhlbbUbbUbbUbbUbbUbbUbbUbbUbbUbbUbbUbbUbbUbbUbbUbbUbhmbhnbbUbhobhpbhqbhrbhsbhtbhubhvbhwbhxbhvbhybhxbhzbaIbhAaaaaaabhBaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckaYWaVLaVLaVLaVLaVLaVLaVLaVLaVLbhCaVLaYXbhDbhEbhFbhGbhHbhGbhGbhIbhGbhGbhJaQRaQRaQRaQRbgrbaUbczbhKbhLbeWbaUbhMbhNbhMaQTaQTaQTaQTbhOaQTbhPbeebcLbhQbhRbfdbhSbhTbcLbekbcRbhUbfhbgEbfhbhVbcRaLoaZxaLoaRkbhWbhXbhYbhZbiaaJQbibbicbidbieaRobifbgLaLobigaRsaRsaRsaRsaRsbihaXYbiibijbikbilbimaRubinbioaLobipbiqbirbisbitbiubivbiubiubiubiubivbiwbiwbivbiubiubiubiubixbiubiybiubizbiAbiBbiCbiDbiDbiEbiEbiFbiGbiHbiIbdAbdAbiJbiJbdAbdAbiKbdAbdAbdAbdAbdAbdAbdAbdAbdAbdAbdAbdAbiLbfKbiMbfVaXmbiNaXmbiObiPbiQbiRbiSbiQbiTbiUbiVaTRaTRaTRaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckbiWbiXbiYbiZbjabjbbjcbjcbjdbjcbjeauNauNbjfbjgbjhbhGbjibhGbjjbjkbjlbjmbjnbjobjobjobjobjpbaUbaUbaUbeabjqbaUaQRaQRaQRaQRbjraXCaXCbjsbbhbjtbjubjvbjwbjxbjybjzbegbcLbjAbcRbjBbfhbgEbfhbjCbjDaLoaZxbjEbjFbjGbjHbjIbjFbjFbjJbjJbjKbjLbjMbjNbjJbgLaLobjObjPbjPbjPbjPbjQbjRbjSbjTbeubevbdcbjUaRubjVbjWbjVbjXbjXbjXbjXbjXbjYbjXbjZbkabkbbkcbkdbkebkfbkgbkcbkhbkabkibkjbkjbkjbkkbkjbkjbkjbkjbklbkmbknbkobkpbkqbkrbksbktbksbkubkubksbkvbkwbkxbkwbksbksbksbksbkybdAbkybkzbkybkybkAbkBbkBbkBbkBbkCbkpbkDaSiaSiaSiaSiaSiaSiaSiaSiaTRaTRaTRaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckbclbkEbkFbkFbkGbkFbkHaVLaVLbkIbkJbkKbhCbhDbhEbkLbhGbkMbkNbkObkPbkQbkRbbhbbhbkSbkTbkTbkUbkVbkWbkXbkYbkZbkVblablbblcbldbleblfblgblhbliblibljbcLblkbllblmblnblobjvblpbcRblqbfhbgEblrblsbltaLoaZxaLoblublvblwblxblyblzbjJblAblBblCblDblEbjJbgLaLobjObjObjObjObjObjOblFblGblHblIblJblKblLblMbdeblNaThbjXblOblPblQblRblSblTblUblVblWblXblYblZbmablYbmbbmcbmdbkabmebmfbmgbmhbmibmjbmibkjbkpbkpbmkbkpbkpbmlbkvbmmbmnbmobmpbmqbmqbmrbmsbmtbmubmvbmwbmxbmybmzbkybkAbkBbmAbmBbmAbkBbmCbmDbkBbmEbmFbmGbkpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFSaFSaFSaFSaFSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckbmHaaaaaaaaaaaaaaaaaaaaaaaaaNTbmIaNTbmJbmKbmLbmMbhGbmNbhGbmObkPbmPbhGaQRbmQaXCbmRaXCbmSbaUbaUbaUbaUbaUbaUbmTbmUbmVbmWbmXbcLbcLbcLbcLbcLbcLbcLbmYbmZbcLbcLbmZbcLbnabnbbncbndbnebndbnfbjDaLoaZxaLobjFbngbnhbnibnibnjbnkbnlbnmbnnbnobnpbjJbnqaOvbnraOvaOvbnsbntbntbnubnvbnwbgVbgVbnxbnybnzbnAbgLaLobnBbnCbnDbnEbnFbnGbnHbnIbnJbnKbnKbnKbnKbnLbnKbnKbnMbnNbkabnObnPbnQbnObmibnObmibkjbnRbkpbnSbnTbkpbmlbkvbnUbnVbnVbnWbmqbmqbnXbnYbnZboabobbocbodbmyboebofbogbkBbohboibojbokbolbombkBbonboobopbkpaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckbiWbiXbiYbiZbjabjbbjcbjcbjdbjcbjeauNauNbjfbjgbjhbhGbjibhGbjjbjkbjlbjmbjnbjobjobjobjobjpbaUbaUbaUbeabjqbaUaQRaQRaQRaQRbjraXCaXCbjsbbhbjtbjubjvbjwbjxbjybjzbegbcLbjAbcRbjBbfhbgEbfhbjCbjDaLoaZxbjEbjFbjGbjHbjIbjFbjFbjJbjJbjKbjLbjMbjNbjJbgLaLobjQbjPbnsbjRewFewEewGbjSbjTbeubevbdcbjUaRubjVbjWbjVbjXbjXbjXbjXbjXbjYbjXbjZbkabkbbkcbkdbkebkfbkgbkcbkhbkabkibkjbkjbkjbkkbkjbkjbkjbkjbklbkmbknbkobkpbkqbkrbksbktbksbkubkubksbkvbkwbkxbkwbksbksbksbksbkybdAbkybkzbkybkybkAbkBbkBbkBbkBbkCbkpbkDaSiaSiaSiaSiaSiaSiaSiaSiaTRaTRaTRaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaFSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckbclbkEbkFbkFbkGbkFbkHaVLaVLbkIbkJbkKbhCbhDbhEbkLbhGbkMbkNbkObkPbkQbkRbbhbbhbkSbkTbkTbkUbkVbkWbkXbkYbkZbkVblablbblcbldbleblfblgblhbliblibljbcLblkbllblmblnblobjvblpbcRblqbfhbgEblrblsbltaLoaZxaLoblublvblwblxblyblzbjJblAblBblCblDblEbjJbgLaLobjObjOewIewHewHewJblFblGblHblIblJblKblLblMbdeblNaThbjXblOblPblQblRblSblTblUblVblWblXblYblZbmablYbmbbmcbmdbkabmebmfbmgbmhbmibmjbmibkjbkpbkpbmkbkpbkpbmlbkvbmmbmnbmobmpbmqbmqbmrbmsbmtbmubmvbmwbmxbmybmzbkybkAbkBbmAbmBbmAbkBbmCbmDbkBbmEbmFbmGbkpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFSaFSaFSaFSaFSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckbckbckbckbckbmHaaaaaaaaaaaaaaaaaaaaaaaaaNTbmIaNTbmJbmKbmLbmMbhGbmNbhGbmObkPbmPbhGaQRbmQaXCbmRaXCbmSbaUbaUbaUbaUbaUbaUbmTbmUbmVbmWbmXbcLbcLbcLbcLbcLbcLbcLbmYbmZbcLbcLbmZbcLbnabnbbncbndbnebndbnfbjDaLoaZxaLobjFbngbnhbnibnibnjbnkbnlbnmbnnbnobnpbjJbnqaOvbnraOvaOvewKewLbntbnubnvbnwbgVbgVbnxbnybnzbnAbgLaLobnBbnCbnDbnEbnFbnGbnHbnIbnJbnKbnKbnKbnKbnLbnKbnKbnMbnNbkabnObnPbnQbnObmibnObmibkjbnRbkpbnSbnTbkpbmlbkvbnUbnVbnVbnWbmqbmqbnXbnYbnZboabobbocbodbmyboebofbogbkBbohboibojbokbolbombkBbonboobopbkpaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckbckaaaaaaaaaaaaaaaaAobePaBwbcmaVLaVLboqbkJborbosbotbouazabhGbmNbovbowbkPboxbhGbgoaXCaXCaXCaXCboybozbozbozblgblgblgblgblgblgboAboBbcLboCboDboEboFboGboHboIboJboKboLboMboNblpbjDboObfhbgEboPbcRbcRaLoaZxboQbjFboRblwboSboTboUboVboWboXboYboZbpabjJbpbbpcaPXaLoaLobpdbpeaLoaLmbpfaLoaLoaLobpgaLoaRqaLmaRjbphbjXbpibpjbpkbplbpmbpnbpobppbnKbnKbnKbnKbnKbnKbnKbnMbpqbkabprbpsbptbpubnObnObnObpvbpwbkpbpxbpybkpbmlbkvbpzbpAbpBbpCbmqbpDbnXbpEbpFbpGbpHbpIbpJbmybpKbpLbpMbkBbpNbolbolbpObpPbpQbkBbpRboobpSbkpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckbckaaaaaaaaaaaaaaaaaaaaaaaaaaabpTbpUbpVbpWbpXbpYbpZazabqaazabhGbkMbqbbhGbqcbqdbhGbhGbhGbqebqfbqgbqhbqgbqgbqgbqhbqgaQRaQRbcLbcLbmZbqibcLbqjbqjbqjbqjbqjbqjbqkbqlbqmbqnbqobqpbqqbqpbqrbqsbqtbqubqvbqwbqxbbnaZHbjFbqybqzbqAbqBbqCbqDbqEbqFbqGbqHbqIbjJbqJbqKbqLbjJbqMbqNbjJbqMbqObjJbqJbqPbqKbqKbqLbjJbqQaRjaLobnBbnCbnDbqRbqSbqTbqUbpobqVbnKbqWbqXbqYbqZbrabrbbrcbrdbkabrebrfbrgbrhbmibnObmibkjbpwbkpbribpSbkpbmlbkvbrjbrkbrlbpCbmqbrmbrnbrobrpbrqbrrbrrbrrbmybrsbrtbrubkBbrvbrwbrxbrybrzbrAbkBbpRboobrBbkpaaaaaaaaaaaaaeHaeHaeHaeHaeHaeHaeHaeHaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabckbckbckbckaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpTbrCbrDbrEbrFbrGbrGbrHbrIbrJbhGbrKbrLbrMbrNbrObrPbrQbrRbrSaeHbrTbrTbrTbrTbrTbrTbrTaaaaaabrUbrVbrWbrXbrYbrZbrZbrZbrZbrZbrZbsabsbbscbsdbsebsfbsgbshbcRbcRbsibcRbcRbcRbsjbskbslbjFbsmblwbsnbsobspbsqbsrbnmbsrbsrbssbstbsubsvbswbsxbsybszbjJbsybsAbsxbsBbsCbsDbsDbsEbjJbsFaRjaLobjXbsGbsHbsIbsJbsKbsLbpobsMbnKbsNbsObsPbsQbsRbsSbsTbsUbkabkjbsVbsWbsXbsYbsZbmibkjbpwbkpbtabtbbkpbtcbkvbpzbpAbpBbpCbmqbtdbkrbtebtfbtebrrbtgbtgbmybthbtibtjbkBbtkbtlbtmbtnbtobtpbkBbonboobtqbkpaaaaaaaaaaaaaeHbtrbtsbttbtsbttbtsbtuaeHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa