diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 2d3b85d7f1..4953f6166a 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -196,7 +196,7 @@ "aL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, -/obj/item/deck, +/obj/item/toy/cards/deck, /obj/item/folder/blue, /obj/item/pen, /turf/open/floor/plasteel/floorgrime, diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index df4976c7e4..e6d9a7cb68 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -17,7 +17,6 @@ dwidth = 4; height = 17; name = "delta arrivals shuttle"; - timid = 1; width = 9 }, /turf/closed/wall/mineral/plastitanium, diff --git a/_maps/shuttles/cargo_birdboat.dmm b/_maps/shuttles/cargo_birdboat.dmm index 4abd694656..8815239d65 100644 --- a/_maps/shuttles/cargo_birdboat.dmm +++ b/_maps/shuttles/cargo_birdboat.dmm @@ -112,8 +112,7 @@ }, /obj/docking_port/mobile/supply{ dwidth = 3; - width = 10; - timid = 1 + width = 10 }, /turf/open/floor/plating, /area/shuttle/supply) diff --git a/_maps/shuttles/cargo_box.dmm b/_maps/shuttles/cargo_box.dmm index 8f5a8ef1b4..e4da4bf228 100644 --- a/_maps/shuttles/cargo_box.dmm +++ b/_maps/shuttles/cargo_box.dmm @@ -49,8 +49,7 @@ }, /obj/docking_port/mobile/supply{ dwidth = 5; - width = 12; - timid = 1 + width = 12 }, /turf/open/floor/plating, /area/shuttle/supply) diff --git a/_maps/shuttles/cargo_delta.dmm b/_maps/shuttles/cargo_delta.dmm index ba8a8a555f..9fb96591fb 100644 --- a/_maps/shuttles/cargo_delta.dmm +++ b/_maps/shuttles/cargo_delta.dmm @@ -92,7 +92,6 @@ /obj/docking_port/mobile/supply{ dir = 4; dwidth = 4; - timid = 1; width = 12 }, /turf/open/floor/plating, diff --git a/_maps/shuttles/emergency_airless.dmm b/_maps/shuttles/emergency_airless.dmm index 1606703ac2..d58c5e7604 100644 --- a/_maps/shuttles/emergency_airless.dmm +++ b/_maps/shuttles/emergency_airless.dmm @@ -37,7 +37,6 @@ name = "Shuttle Under Construction"; port_direction = 4; preferred_direction = 2; - timid = 1; width = 30 }, /turf/open/floor/plating/airless, diff --git a/_maps/shuttles/emergency_arena.dmm b/_maps/shuttles/emergency_arena.dmm index 037af600f2..b20ffddbc6 100644 --- a/_maps/shuttles/emergency_arena.dmm +++ b/_maps/shuttles/emergency_arena.dmm @@ -57,8 +57,7 @@ "o" = ( /obj/effect/forcefield/arena_shuttle_entrance, /obj/docking_port/mobile/emergency{ - name = "The Arena"; - timid = 1 + name = "The Arena" }, /turf/open/indestructible/necropolis/air, /area/shuttle/escape/arena) diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index 01772ed706..d2f06cc036 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -35,8 +35,7 @@ dwidth = 10; height = 13; name = "Asteroid emergency shuttle"; - width = 28; - timid = 1 + width = 28 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 262ed4029b..46d86dfa30 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -242,8 +242,7 @@ name = "Emergency Shuttle Airlock" }, /obj/docking_port/mobile/emergency{ - name = "The Emergency Escape Bar"; - timid = 1 + name = "The Emergency Escape Bar" }, /turf/open/floor/plasteel/bar, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 3b62aa9d7b..df84efddfb 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -201,7 +201,6 @@ height = 18; port_direction = 4; width = 14; - timid = 1; name = "Birdboat emergency escape shuttle" }, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 6443518590..1b675f0538 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -203,8 +203,7 @@ name = "Emergency Shuttle Airlock" }, /obj/docking_port/mobile/emergency{ - name = "Box emergency shuttle"; - timid = 1 + name = "Box emergency shuttle" }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 3c9188b883..3d6550bdca 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -551,7 +551,6 @@ name = "Cere emergency shuttle"; port_direction = 4; preferred_direction = 2; - timid = 1; width = 42 }, /turf/open/floor/plating, diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index b0cd4e7113..9574676a18 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -191,8 +191,7 @@ name = "Emergency Shuttle Airlock" }, /obj/docking_port/mobile/emergency{ - name = "Snappop(tm)!"; - timid = 1 + name = "Snappop(tm)!" }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm index d8da16a7d9..6b5893ebd2 100644 --- a/_maps/shuttles/emergency_cramped.dmm +++ b/_maps/shuttles/emergency_cramped.dmm @@ -62,8 +62,7 @@ dwidth = 3; height = 5; name = "Secure Transport Vessel 5"; - width = 14; - timid = 1 + width = 14 }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 6a166bfe15..54d011ffc7 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -443,8 +443,7 @@ name = "Delta emergency shuttle"; width = 30; preferred_direction = 2; - port_direction = 4; - timid = 1 + port_direction = 4 }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm index 3cd9fc7890..e1631ba1c1 100644 --- a/_maps/shuttles/emergency_discoinferno.dmm +++ b/_maps/shuttles/emergency_discoinferno.dmm @@ -103,8 +103,7 @@ /area/shuttle/escape) "u" = ( /obj/docking_port/mobile/emergency{ - name = "Disco Inferno"; - timid = 1 + name = "Disco Inferno" }, /obj/machinery/door/airlock/gold{ armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100); diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index b79aa8c62c..a9f9a5b307 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -39,8 +39,7 @@ dir = 2; dwidth = 9; name = "NES Port"; - width = 19; - timid = 1 + width = 19 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index 403c75b1b6..8a33387a9d 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -13,8 +13,7 @@ dwidth = 1; height = 10; name = "Oh Hi Mark"; - width = 12; - timid = 1 + width = 12 }, /obj/machinery/door/airlock/wood, /turf/open/floor/wood, diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index 8306423ffd..46e49bfb57 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -24,7 +24,6 @@ dwidth = 5; height = 14; name = "Luxury emergency shuttle"; - timid = 1; width = 25 }, /obj/machinery/door/airlock/gold, diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 0bd4da4a7d..1f3b49b675 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -28,7 +28,6 @@ dwidth = 5; height = 14; name = "Meta emergency shuttle"; - timid = 1; width = 25 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/emergency_meteor.dmm b/_maps/shuttles/emergency_meteor.dmm index a4584813c1..aaf0be6de8 100644 --- a/_maps/shuttles/emergency_meteor.dmm +++ b/_maps/shuttles/emergency_meteor.dmm @@ -63,7 +63,6 @@ height = 40; movement_force = list("KNOCKDOWN" = 3, "THROW" = 6); name = "\proper a meteor with engines strapped to it"; - timid = 1; width = 40 }, /turf/open/floor/plating/asteroid, diff --git a/_maps/shuttles/emergency_mini.dmm b/_maps/shuttles/emergency_mini.dmm index 8bf882302b..a4636fd1c0 100644 --- a/_maps/shuttles/emergency_mini.dmm +++ b/_maps/shuttles/emergency_mini.dmm @@ -170,7 +170,6 @@ dwidth = 8; height = 9; name = "Mini emergency shuttle"; - timid = 1; width = 21 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index 165a2e5a2b..0f24d118ed 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -159,8 +159,7 @@ "E" = ( /obj/machinery/door/airlock/cult/friendly, /obj/docking_port/mobile/emergency{ - name = "shuttle 667"; - timid = 1 + name = "shuttle 667" }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index 92ad72d1c5..d13786c6ae 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -288,7 +288,6 @@ height = 15; name = "Pubby emergency shuttle"; port_direction = 4; - timid = 1; width = 18 }, /turf/open/floor/plating, diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index f1dbe29fbe..ea8bb30f86 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -614,7 +614,6 @@ dwidth = 14; height = 18; name = "CentCom Raven Battlecruiser"; - timid = 1; width = 32 }, /obj/machinery/door/airlock/hatch, diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index b68eeba8e3..85e0e00dbe 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -277,8 +277,7 @@ "aW" = ( /obj/docking_port/mobile/emergency{ height = 15; - name = "Box emergency shuttle"; - timid = 1 + name = "Box emergency shuttle" }, /obj/machinery/door/airlock/security/glass{ name = "Emergency Shuttle Airlock" diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm index c2452c1761..cd6a1b9fe9 100644 --- a/_maps/shuttles/emergency_scrapheap.dmm +++ b/_maps/shuttles/emergency_scrapheap.dmm @@ -217,8 +217,7 @@ name = "Emergency Shuttle Airlock" }, /obj/docking_port/mobile/emergency{ - name = "Scrapheap Challenge"; - timid = 1 + name = "Scrapheap Challenge" }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm index d5caf0ddb2..9e11d60d5f 100644 --- a/_maps/shuttles/emergency_supermatter.dmm +++ b/_maps/shuttles/emergency_supermatter.dmm @@ -141,8 +141,7 @@ name = "Emergency Shuttle Airlock" }, /obj/docking_port/mobile/emergency{ - name = "Hyperfractal Gigashuttle"; - timid = 1 + name = "Hyperfractal Gigashuttle" }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index facb14a15c..25d97e2bbf 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -154,7 +154,6 @@ name = "Emergency Shuttle Airlock" }, /obj/docking_port/mobile/emergency{ - timid = 1; name = "NT Lepton Violet" }, /turf/open/floor/plating, diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index e0cdfc2c38..cb9d6c4834 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -55,8 +55,7 @@ id = "ferry"; name = "ferry shuttle"; port_direction = 2; - width = 5; - timid = 1 + width = 5 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) diff --git a/_maps/shuttles/ferry_fancy.dmm b/_maps/shuttles/ferry_fancy.dmm index 83795f0c55..a79903533e 100644 --- a/_maps/shuttles/ferry_fancy.dmm +++ b/_maps/shuttles/ferry_fancy.dmm @@ -72,7 +72,6 @@ name = "ferry shuttle"; port_direction = 1; preferred_direction = 4; - timid = 1; width = 5 }, /turf/open/floor/pod/light, diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index f1c7bb5e69..b94e82c049 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -165,7 +165,6 @@ height = 27; id = "ferry"; name = "The Lighthouse"; - timid = 1; port_direction = 2; width = 16 }, diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index d7802a6773..2fd1c308c6 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -111,8 +111,7 @@ id = "ferry"; name = "ferry shuttle"; port_direction = 2; - width = 5; - timid = 1 + width = 5 }, /turf/open/floor/plasteel/freezer, /area/shuttle/transport) diff --git a/_maps/shuttles/labour_box.dmm b/_maps/shuttles/labour_box.dmm index dac173c279..315c40b8b9 100644 --- a/_maps/shuttles/labour_box.dmm +++ b/_maps/shuttles/labour_box.dmm @@ -111,7 +111,6 @@ id = "laborcamp"; name = "labor camp shuttle"; port_direction = 4; - timid = 1; width = 9 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/mining_box.dmm b/_maps/shuttles/mining_box.dmm index 2b1771e0c7..7378c8013d 100644 --- a/_maps/shuttles/mining_box.dmm +++ b/_maps/shuttles/mining_box.dmm @@ -41,7 +41,6 @@ id = "mining"; name = "mining shuttle"; port_direction = 4; - timid = 1; width = 7 }, /turf/open/floor/plating, diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index d51176b1b8..2daa647497 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -19,7 +19,6 @@ name = "NT Medical Ship"; port_direction = 8; preferred_direction = 4; - timid = 1; width = 35 }, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/whiteship_cere.dmm b/_maps/shuttles/whiteship_cere.dmm index 913f005c17..f189ba7478 100644 --- a/_maps/shuttles/whiteship_cere.dmm +++ b/_maps/shuttles/whiteship_cere.dmm @@ -23,7 +23,6 @@ name = "NT Recovery White-Ship"; port_direction = 8; preferred_direction = 1; - timid = 1; width = 16 }, /turf/open/floor/plating, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index 2c818c2ece..1bf4ae78d4 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -1518,7 +1518,6 @@ name = "White-Ship"; port_direction = 8; preferred_direction = 8; - timid = 0; width = 32 }, /turf/open/floor/plasteel/neutral, diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 9052339cf8..a45cfd00ae 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -39,7 +39,6 @@ name = "NT Recovery White-Ship"; port_direction = 8; preferred_direction = 4; - timid = 1; width = 28 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 3ef386e265..c1171c899d 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -94,7 +94,6 @@ name = "White Ship"; port_direction = 4; preferred_direction = 1; - timid = 1; width = 9 }, /turf/open/floor/plasteel/dark, diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index f50cf8dc87..8d4aca5fbf 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -54,7 +54,7 @@ if(..()) return var/mob/living/silicon/ai/AI = usr - GLOB.crewmonitor.show(AI) + GLOB.crewmonitor.show(AI,AI) /obj/screen/ai/crew_manifest name = "Crew Manifest" diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index 3f72ff995b..be7e6360aa 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -57,8 +57,6 @@ GLOBAL_LIST_EMPTY(cinematics) //Close all open windows if global if(is_global) - for (var/datum/html_interface/hi in GLOB.html_interfaces) - hi.closeAll() SStgui.close_all_uis() diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 1adddf7d58..585feba979 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -143,10 +143,6 @@ var/datum/atom_hud/data/human/medical/basic/B = GLOB.huds[DATA_HUD_MEDICAL_BASIC] B.update_suit_sensors(src) - var/turf/T = get_turf(src) - if (T) - GLOB.crewmonitor.queueUpdate(T.z) - //called when a living mob changes health /mob/living/proc/med_hud_set_health() var/image/holder = hud_list[HEALTH_HUD] @@ -158,10 +154,6 @@ /mob/living/carbon/med_hud_set_health() ..() - var/turf/T = get_turf(src) - if(T) - GLOB.crewmonitor.queueUpdate(T.z) - //called when a carbon changes stat, virus or XENO_HOST /mob/living/proc/med_hud_set_status() var/image/holder = hud_list[STATUS_HUD] @@ -216,10 +208,6 @@ holder.icon_state = "hud[ckey(wear_id.GetJobName())]" sec_hud_set_security_status() - var/turf/T = get_turf(src) - if (T) - GLOB.crewmonitor.queueUpdate(T.z) - /mob/living/carbon/human/proc/sec_hud_set_implants() var/image/holder for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD)) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 22978e9ea2..d901fa007b 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -456,21 +456,6 @@ Class Procs: /obj/machinery/proc/on_deconstruction() return -// Hook for html_interface module to prevent updates to clients who don't have this as their active machine. -/obj/machinery/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi) - if (hclient.client.mob && (hclient.client.mob.stat == 0 || IsAdminGhost(hclient.client.mob))) - if (isAI(hclient.client.mob) || IsAdminGhost(hclient.client.mob)) - return TRUE - else - return hclient.client.mob.machine == src && Adjacent(hclient.client.mob) - else - return FALSE - -// Hook for html_interface module to unset the active machine when the window is closed by the player. -/obj/machinery/proc/hiOnHide(datum/html_interface_client/hclient) - if (hclient.client.mob && hclient.client.mob.machine == src) - hclient.client.mob.unset_machine() - /obj/machinery/proc/can_be_overridden() . = 1 diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 4386c73ef6..c327f4c17a 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -20,13 +20,14 @@ switchCamera(cameras[camera]) /datum/trackable + var/initialized = FALSE var/list/names = list() var/list/namecounts = list() var/list/humans = list() var/list/others = list() /mob/living/silicon/ai/proc/trackable_mobs() - + track.initialized = TRUE track.names.Cut() track.namecounts.Cut() track.humans.Cut() @@ -63,6 +64,9 @@ if(!target_name) return + if(!track.initialized) + trackable_mobs() + var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) ai_actual_track(target) diff --git a/code/game/machinery/computer/crew.css b/code/game/machinery/computer/crew.css deleted file mode 100644 index 2ebb2e2dda..0000000000 --- a/code/game/machinery/computer/crew.css +++ /dev/null @@ -1,154 +0,0 @@ -body -{ - padding-left: 53%; - cursor: default; -} - -#ntbgcenter -{ - background-position: 550px 0px !important; -} - -#minimap -{ - position: fixed; - top: 8px; - left: 8px; - border: 2px inset #888; - overflow: hidden; - min-width: 480px; - min-height: 480px; - width: 53%; - height: 100%; - max-width: 480px; - max-height: 480px; -} - -#textbased -{ - width: 100%; - padding-left: 20px; -} - -#textbased table -{ - min-width: 380px; - width: 100%; - table-layout: fixed; -} - -#textbased td -{ - vertical-align: top; - padding: 2px; -} - -#textbased tbody td -{ - transition: .2s all; -} - -#textbased tbody tr:hover td, #textbased tbody tr.hover td -{ - background-color: #515151; -} - -#textarea:after -{ - content: ""; - clear: both; -} - -.health -{ - width: 16px; - height: 16px; - background-color: #FFF; - border: 1px solid #434343; - position: relative; - top: 2px; -} - -.health-5 { background-color: #17d568; } -.health-4 { background-color: #2ecc71; } -.health-3 { background-color: #e67e22; } -.health-2 { background-color: #ed5100; } -.health-1 { background-color: #e74c3c; } -.health-0 { background-color: #ed2814; } - -.health > div -{ - margin-left: 20px; - margin-top: -4px; -} - -.tt -{ - position: relative; - display: inline-block; - height: 16px; -} - -.tt > div -{ - display: none; -} - -.tt:hover > div -{ - position: absolute; - bottom: -30px; - left: 50%; - margin-left: -64px; - - display: block; - width: 128px; - height: 24px; - border: 1px solid #313131; - background-color: #434343; - padding: 4px; - z-index: 999; - text-align: center; -} - -.tt > div > span -{ - position: relative; - top: -2px; -} - -.dot -{ - position: absolute; - width: 3px; - height: 3px; - margin-top: 0px; - margin-left: 0px; - border: 1px solid transparent; -} - -.dot.active -{ - z-index: 9999 !important; - width: 8px; - height: 8px; - margin-top: -2px; - margin-left: -3px; -} - -.zoom -{ - position: fixed; - left: 53%; - top: 10px; - display: block; - width: 24px; - height: 24px; - text-align: center; - margin-left: 20px !important; -} - -.zoom.in -{ - margin-left: -3px !important; -} \ No newline at end of file diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 7397b2a064..40d03a8f5a 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -1,3 +1,5 @@ +#define SENSORS_UPDATE_PERIOD 100 //How often the sensor data updates. + /obj/machinery/computer/crew name = "crew monitoring console" desc = "Used to monitor active health sensors built into most of the crew's uniforms." @@ -16,21 +18,22 @@ /obj/machinery/computer/crew/attack_ai(mob/user) if(stat & (BROKEN|NOPOWER)) return - GLOB.crewmonitor.show(user) + GLOB.crewmonitor.show(user,src) /obj/machinery/computer/crew/attack_hand(mob/user) if(..()) return if(stat & (BROKEN|NOPOWER)) return - GLOB.crewmonitor.show(user) + GLOB.crewmonitor.show(user,src) GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) /datum/crewmonitor + var/list/ui_sources = list() //List of user -> ui source var/list/jobs - var/list/interfaces - var/list/data + var/list/data_by_z = list() + var/list/last_update = list() /datum/crewmonitor/New() . = ..() @@ -77,196 +80,119 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) jobs["Assistant"] = 999 //Unknowns/custom jobs should appear after civilians, and before assistants src.jobs = jobs - src.interfaces = list() - src.data = list() - register_asset("crewmonitor.js",'crew.js') - register_asset("crewmonitor.css",'crew.css') /datum/crewmonitor/Destroy() - if (src.interfaces) - for (var/datum/html_interface/hi in interfaces) - qdel(hi) - src.interfaces = null - return ..() -/datum/crewmonitor/proc/show(mob/mob, z) - if (mob.client) - sendResources(mob.client) - if (!z) - z = mob.z +/datum/crewmonitor/ui_interact(mob/user, ui_key = "crew", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if (!ui) + ui = new(user, src, ui_key, "crew", "crew monitor", 800, 600 , master_ui, state) + ui.open() - if (z > 0 && src.interfaces) - var/datum/html_interface/hi +/datum/crewmonitor/proc/show(mob/M, source) + ui_sources[M] = source + ui_interact(M) - if (!src.interfaces["[z]"]) - src.interfaces["[z]"] = new/datum/html_interface/nanotrasen(src, "Crew Monitoring", 900, 540, "") +/datum/crewmonitor/ui_host(mob/user) + return ui_sources[user] - hi = src.interfaces["[z]"] +/datum/crewmonitor/ui_data(mob/user) + var/z = user.z + if(!z) + var/turf/T = get_turf(user) + z = T.z + var/list/zdata = update_data(z) + . = list() + .["sensors"] = zdata + .["link_allowed"] = isAI(user) - hi.updateContent("content", "
+-
") +/datum/crewmonitor/proc/update_data(z) + if(data_by_z["[z]"] && last_update["[z]"] && world.time <= last_update["[z]"] + SENSORS_UPDATE_PERIOD) + return data_by_z["[z]"] - src.update(z, TRUE) - else - hi = src.interfaces["[z]"] - src.update(z,TRUE) + var/list/results = list() + var/obj/item/clothing/under/U + var/obj/item/card/id/I + var/turf/pos + var/ijob + var/name + var/assignment + var/oxydam + var/toxdam + var/burndam + var/brutedam + var/area + var/pos_x + var/pos_y + var/life_status - // Debugging purposes - mob << browse_rsc(file("code/game/machinery/computer/crew.js"), "crew.js") - mob << browse_rsc(file("code/game/machinery/computer/crew.css"), "crew.css") + for(var/mob/living/carbon/human/H in GLOB.carbon_list) + // Check if their z-level is correct and if they are wearing a uniform. + // Accept H.z==0 as well in case the mob is inside an object. + if ((H.z == 0 || H.z == z) && istype(H.w_uniform, /obj/item/clothing/under)) + U = H.w_uniform - hi = src.interfaces["[z]"] - hi.show(mob) - src.updateFor(mob, hi, z) + // Are the suit sensors on? + if ((U.has_sensor > 0) && U.sensor_mode) + pos = H.z == 0 || U.sensor_mode == SENSOR_COORDS ? get_turf(H) : null -/datum/crewmonitor/proc/updateFor(hclient_or_mob, datum/html_interface/hi, z) - // This check will succeed if updateFor is called after showing to the player, but will fail - // on regular updates. Since we only really need this once we don't care if it fails. - hi.callJavaScript("clearAll", null, hclient_or_mob) + // Special case: If the mob is inside an object confirm the z-level on turf level. + if (H.z == 0 && (!pos || pos.z != z)) + continue - for (var/list/L in data) - hi.callJavaScript("add", L, hclient_or_mob) + I = H.wear_id ? H.wear_id.GetID() : null - hi.callJavaScript("onAfterUpdate", null, hclient_or_mob) + if (I) + name = I.registered_name + assignment = I.assignment + ijob = jobs[I.assignment] + else + name = "Unknown" + assignment = "" + ijob = 80 -/datum/crewmonitor/proc/update(z, ignore_unused = FALSE) - if (src.interfaces["[z]"]) - var/datum/html_interface/hi = src.interfaces["[z]"] + if (U.sensor_mode >= SENSOR_LIVING) + life_status = (!H.stat ? TRUE : FALSE) + else + life_status = null - if (ignore_unused || hi.isUsed()) - var/list/results = list() - var/obj/item/clothing/under/U - var/obj/item/card/id/I - var/turf/pos - var/ijob - var/name - var/assignment - var/dam1 - var/dam2 - var/dam3 - var/dam4 - var/area - var/pos_x - var/pos_y - var/life_status + if (U.sensor_mode >= SENSOR_VITALS) + oxydam = round(H.getOxyLoss(),1) + toxdam = round(H.getToxLoss(),1) + burndam = round(H.getFireLoss(),1) + brutedam = round(H.getBruteLoss(),1) + else + oxydam = null + toxdam = null + burndam = null + brutedam = null - for(var/mob/living/carbon/human/H in GLOB.carbon_list) - // Check if their z-level is correct and if they are wearing a uniform. - // Accept H.z==0 as well in case the mob is inside an object. - if ((H.z == 0 || H.z == z) && istype(H.w_uniform, /obj/item/clothing/under)) - U = H.w_uniform + if (U.sensor_mode >= SENSOR_COORDS) + if (!pos) + pos = get_turf(H) + area = get_area_name(H, TRUE) + pos_x = pos.x + pos_y = pos.y + else + area = null + pos_x = null + pos_y = null - // Are the suit sensors on? - if ((U.has_sensor > 0) && U.sensor_mode) - pos = H.z == 0 || U.sensor_mode == SENSOR_COORDS ? get_turf(H) : null + results[++results.len] = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null)) + + data_by_z["[z]"] = results + last_update["[z]"] = world.time + + return results - // Special case: If the mob is inside an object confirm the z-level on turf level. - if (H.z == 0 && (!pos || pos.z != z)) - continue +/datum/crewmonitor/ui_act(action,params) + var/mob/living/silicon/ai/AI = usr + if(!istype(AI)) + return + switch (action) + if ("select_person") + AI.ai_camera_track(params["name"]) - I = H.wear_id ? H.wear_id.GetID() : null - - if (I) - name = I.registered_name - assignment = I.assignment - ijob = jobs[I.assignment] - else - name = "Unknown" - assignment = "" - ijob = 80 - - if (U.sensor_mode >= SENSOR_LIVING) - life_status = (!H.stat ? "true" : "false") - else - life_status = null - - if (U.sensor_mode >= SENSOR_VITALS) - dam1 = round(H.getOxyLoss(),1) - dam2 = round(H.getToxLoss(),1) - dam3 = round(H.getFireLoss(),1) - dam4 = round(H.getBruteLoss(),1) - else - dam1 = null - dam2 = null - dam3 = null - dam4 = null - - if (U.sensor_mode >= SENSOR_COORDS) - if (!pos) - pos = get_turf(H) - area = get_area_name(H, TRUE) - pos_x = pos.x - pos_y = pos.y - else - area = null - pos_x = null - pos_y = null - - results[++results.len] = list(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, pos_x, pos_y, H.can_track(null)) - - src.data = results - src.updateFor(null, hi, z) // updates for everyone - -/datum/crewmonitor/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi) - var/z = "" - - for (z in src.interfaces) - if (src.interfaces[z] == hi) - break - - if(hclient.client.mob && IsAdminGhost(hclient.client.mob)) - return TRUE - - if (hclient.client.mob && hclient.client.mob.stat == 0 && hclient.client.mob.z == text2num(z)) - if (isAI(hclient.client.mob)) - return TRUE - else if (iscyborg(hclient.client.mob)) - return (locate(/obj/machinery/computer/crew, range(world.view, hclient.client.mob))) || (locate(/obj/item/device/sensor_device, hclient.client.mob.contents)) - else - return (locate(/obj/machinery/computer/crew, range(1, hclient.client.mob))) || (locate(/obj/item/device/sensor_device, hclient.client.mob.contents)) - else - return FALSE - -/datum/crewmonitor/Topic(href, href_list[], datum/html_interface_client/hclient) - if (istype(hclient)) - if (hclient && hclient.client && hclient.client.mob && isAI(hclient.client.mob)) - var/mob/living/silicon/ai/AI = hclient.client.mob - - switch (href_list["action"]) - if ("select_person") - AI.ai_camera_track(href_list["name"]) - - if ("select_position") - var/x = text2num(href_list["x"]) - var/y = text2num(href_list["y"]) - var/turf/tile = locate(x, y, AI.z) - - var/obj/machinery/camera/C = locate(/obj/machinery/camera) in range(5, tile) - - if (!C) - C = locate(/obj/machinery/camera) in urange(10, tile) - if (!C) - C = locate(/obj/machinery/camera) in urange(15, tile) - - if (C) - addtimer(CALLBACK(src, .proc/update_ai, AI, C, AI.eyeobj.loc), min(30, get_dist(get_turf(C), AI.eyeobj) / 4)) - -/datum/crewmonitor/proc/update_ai(mob/living/silicon/ai/AI, obj/machinery/camera/C, turf/current_loc) - if (AI && AI.eyeobj && current_loc == AI.eyeobj.loc) - AI.switchCamera(C) - -/mob/living/carbon/human/Move() - var/old_z = src.z - . = ..() - if (src.w_uniform) - if (old_z != src.z) - GLOB.crewmonitor.queueUpdate(old_z) - GLOB.crewmonitor.queueUpdate(src.z) - -/datum/crewmonitor/proc/queueUpdate(z) - addtimer(CALLBACK(src, .proc/update, z), 5, TIMER_UNIQUE) - -/datum/crewmonitor/proc/sendResources(var/client/client) - send_asset(client, "crewmonitor.js") - send_asset(client, "crewmonitor.css") - SSminimap.send(client) +#undef SENSORS_UPDATE_PERIOD \ No newline at end of file diff --git a/code/game/machinery/computer/crew.js b/code/game/machinery/computer/crew.js deleted file mode 100644 index 7a2e3caeba..0000000000 --- a/code/game/machinery/computer/crew.js +++ /dev/null @@ -1,588 +0,0 @@ -/*! - * jQuery scrollintoview() plugin and :scrollable selector filter - * - * Version 1.8 (14 Jul 2011) - * Requires jQuery 1.4 or newer - */ - -(function ($) { - var converter = { - vertical: { x: false, y: true }, - horizontal: { x: true, y: false }, - both: { x: true, y: true }, - x: { x: true, y: false }, - y: { x: false, y: true } - }; - - var settings = { - duration: "fast", - direction: "both" - }; - - var rootrx = /^(?:html)$/i; - - // gets border dimensions - var borders = function (domElement, styles) { - styles = styles || (document.defaultView && document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(domElement, null) : domElement.currentStyle); - var px = document.defaultView && document.defaultView.getComputedStyle ? true : false; - var b = { - top: (parseFloat(px ? styles.borderTopWidth : $.css(domElement, "borderTopWidth")) || 0), - left: (parseFloat(px ? styles.borderLeftWidth : $.css(domElement, "borderLeftWidth")) || 0), - bottom: (parseFloat(px ? styles.borderBottomWidth : $.css(domElement, "borderBottomWidth")) || 0), - right: (parseFloat(px ? styles.borderRightWidth : $.css(domElement, "borderRightWidth")) || 0) - }; - return { - top: b.top, - left: b.left, - bottom: b.bottom, - right: b.right, - vertical: b.top + b.bottom, - horizontal: b.left + b.right - }; - }; - - var dimensions = function ($element) { - var win = $(window); - var isRoot = rootrx.test($element[0].nodeName); - return { - border: isRoot ? { top: 0, left: 0, bottom: 0, right: 0} : borders($element[0]), - scroll: { - top: (isRoot ? win : $element).scrollTop(), - left: (isRoot ? win : $element).scrollLeft() - }, - scrollbar: { - right: isRoot ? 0 : $element.innerWidth() - $element[0].clientWidth, - bottom: isRoot ? 0 : $element.innerHeight() - $element[0].clientHeight - }, - rect: (function () { - var r = $element[0].getBoundingClientRect(); - return { - top: isRoot ? 0 : r.top, - left: isRoot ? 0 : r.left, - bottom: isRoot ? $element[0].clientHeight : r.bottom, - right: isRoot ? $element[0].clientWidth : r.right - }; - })() - }; - }; - - $.fn.extend({ - scrollintoview: function (options) { - /// Scrolls the first element in the set into view by scrolling its closest scrollable parent. - /// Additional options that can configure scrolling: - /// duration (default: "fast") - jQuery animation speed (can be a duration string or number of milliseconds) - /// direction (default: "both") - select possible scrollings ("vertical" or "y", "horizontal" or "x", "both") - /// complete (default: none) - a function to call when scrolling completes (called in context of the DOM element being scrolled) - /// - /// Returns the same jQuery set that this function was run on. - - options = $.extend({}, settings, options); - options.direction = converter[typeof (options.direction) === "string" && options.direction.toLowerCase()] || converter.both; - - var dirStr = ""; - if (options.direction.x === true) dirStr = "horizontal"; - if (options.direction.y === true) dirStr = dirStr ? "both" : "vertical"; - - var el = this.eq(0); - var scroller = el.closest(":scrollable(" + dirStr + ")"); - - // check if there's anything to scroll in the first place - if (scroller.length > 0) - { - scroller = scroller.eq(0); - - var dim = { - e: dimensions(el), - s: dimensions(scroller) - }; - - var rel = { - top: dim.e.rect.top - (dim.s.rect.top + dim.s.border.top), - bottom: dim.s.rect.bottom - dim.s.border.bottom - dim.s.scrollbar.bottom - dim.e.rect.bottom, - left: dim.e.rect.left - (dim.s.rect.left + dim.s.border.left), - right: dim.s.rect.right - dim.s.border.right - dim.s.scrollbar.right - dim.e.rect.right - }; - - var animOptions = {}; - - // vertical scroll - if (options.direction.y === true) - { - if (rel.top < 0) - { - animOptions.scrollTop = dim.s.scroll.top + rel.top; - } - else if (rel.top > 0 && rel.bottom < 0) - { - animOptions.scrollTop = dim.s.scroll.top + Math.min(rel.top, -rel.bottom); - } - } - - // horizontal scroll - if (options.direction.x === true) - { - if (rel.left < 0) - { - animOptions.scrollLeft = dim.s.scroll.left + rel.left; - } - else if (rel.left > 0 && rel.right < 0) - { - animOptions.scrollLeft = dim.s.scroll.left + Math.min(rel.left, -rel.right); - } - } - - // scroll if needed - if (!$.isEmptyObject(animOptions)) - { - if (rootrx.test(scroller[0].nodeName)) - { - scroller = $("html,body"); - } - scroller - .animate(animOptions, options.duration) - .eq(0) // we want function to be called just once (ref. "html,body") - .queue(function (next) { - $.isFunction(options.complete) && options.complete.call(scroller[0]); - next(); - }); - } - else - { - // when there's nothing to scroll, just call the "complete" function - $.isFunction(options.complete) && options.complete.call(scroller[0]); - } - } - - // return set back - return this; - } - }); - - var scrollValue = { - auto: true, - scroll: true, - visible: false, - hidden: false - }; - - $.extend($.expr[":"], { - scrollable: function (element, index, meta, stack) { - var direction = converter[typeof (meta[3]) === "string" && meta[3].toLowerCase()] || converter.both; - var styles = (document.defaultView && document.defaultView.getComputedStyle ? document.defaultView.getComputedStyle(element, null) : element.currentStyle); - var overflow = { - x: scrollValue[styles.overflowX.toLowerCase()] || false, - y: scrollValue[styles.overflowY.toLowerCase()] || false, - isRoot: rootrx.test(element.nodeName) - }; - - // check if completely unscrollable (exclude HTML element because it's special) - if (!overflow.x && !overflow.y && !overflow.isRoot) - { - return false; - } - - var size = { - height: { - scroll: element.scrollHeight, - client: element.clientHeight - }, - width: { - scroll: element.scrollWidth, - client: element.clientWidth - }, - // check overflow.x/y because iPad (and possibly other tablets) don't dislay scrollbars - scrollableX: function () { - return (overflow.x || overflow.isRoot) && this.width.scroll > this.width.client; - }, - scrollableY: function () { - return (overflow.y || overflow.isRoot) && this.height.scroll > this.height.client; - } - }; - return direction.y && size.scrollableY() || direction.x && size.scrollableX(); - } - }); -})(jQuery); - -/*! - * Crew manifest script - */ - -var minimap_height = 480; -var scale_x; -var scale_y; -var zoom_factor = null; -var minimap_mousedown = false; -var minimap_mousedown_scrollLeft; -var minimap_mousedown_scrollTop; -var minimap_mousedown_clientX; -var minimap_mousedown_clientY; -var minimap_mousedown_counter = 0; - -function disableSelection(){ return false; }; - -$(window).on("onUpdateContent", function() -{ - $("#textbased").html("

Name

 

Position

"); - - $("#minimap").append(""); - - $("body")[0].onselectstart = disableSelection; - - $("#minimap").on("click", function(e) - { - if (!$(e.target).is(".zoom,.dot")) - { - var x = ((((e.clientX + this.scrollLeft - 8) / scale_x) / tile_size) + 1).toFixed(0); - var y = ((maxy - (((e.clientY + this.scrollTop - 8) / scale_y) / tile_size)) + 1).toFixed(0); - - window.location.href = "byond://?src=" + hSrc + "&action=select_position&x=" + x + "&y=" + y; - } - }).on("mousedown", function(e) - { - minimap_mousedown_scrollLeft = this.scrollLeft; - minimap_mousedown_scrollTop = this.scrollTop; - minimap_mousedown_clientX = e.clientX; - minimap_mousedown_clientY = e.clientY; - - var c = ++minimap_mousedown_counter; - setTimeout(function() - { - if (c == minimap_mousedown_counter) - { - minimap_mousedown = true; - $("#minimap").css("cursor", "move"); - } - }, 100); - }); - - $(document).on("mousemove", function(e) - { - if (minimap_mousedown) - { - var offsetX = minimap_mousedown_clientX - e.clientX; - var offsetY = minimap_mousedown_clientY - e.clientY; - - var minimap = document.getElementById("minimap"); - minimap.scrollLeft = minimap_mousedown_scrollLeft + offsetX; - minimap.scrollTop = minimap_mousedown_scrollTop + offsetY; - } - }).on("mouseup", function() - { - ++minimap_mousedown_counter; - if (minimap_mousedown) - { - document.body.focus(); - minimap_mousedown = false; - $("#minimap").css("cursor", ""); - } - }); - - $(window).on("resize", onResize); - - scaleMinimap(1.00); -}); - -function zoomIn() -{ - scaleMinimap(Math.min(6.00, zoom_factor + 1.00)); -} - -function zoomOut() -{ - scaleMinimap(Math.max(1.00, zoom_factor - 1.00)); -} - -function scaleMinimap(factor) -{ - var $minimap = $("#minimap"); - - if (factor != zoom_factor) - { - zoom_factor = factor; - - var old_map_width = $minimap.width(); - var old_map_height = $minimap.height(); - var old_canvas_size = $("#minimap > img").height(); // height is assumed to be the same - var new_canvas_size = minimap_height * factor; // ditto - - var old_scrollLeft = $minimap[0].scrollLeft; - var old_scrollTop = $minimap[0].scrollTop; - - var old_factor = old_canvas_size / minimap_height; - var diff_factor = factor - old_factor; - - var old_centerX = ((old_map_width / 2) * diff_factor) + old_scrollLeft; - var old_centerY = ((old_map_height / 2) * diff_factor) + old_scrollTop; - - $("#minimap > img").css("height", new_canvas_size + "px"); - $minimap.css("max-width", new_canvas_size + "px"); - - var new_map_width = $minimap.width(); - var new_map_height = $minimap.height(); - - var new_centerX = (new_map_width / 2) + old_centerX; - var new_centerY = (new_map_height / 2) + old_centerY; - - var scrollLeft = new_centerX - (new_map_width / 2); - var scrollTop = new_centerY - (new_map_height / 2); - - scale_x = new_canvas_size / (maxx * tile_size); - scale_y = new_canvas_size / (maxy * tile_size); - - onResize(); - - $minimap[0].scrollLeft = scrollLeft; - $minimap[0].scrollTop = scrollTop; - - $(".dot").each(function() - { - var $this = $(this); - var tx = translateX(parseInt($this.attr("data-x"))); - var ty = translateY(parseInt($this.attr("data-y"))); - - // Workaround for IE bug where it doesn't modify the positions. - setTimeout(function(){ $this.css({ "top": ty + "px", "left": tx + "px" });}, 0); - }); - } -} - -function onResize() -{ - if (zoom_factor == 1.00) - { - $(".zoom").css("left", "442px"); - $("#minimap").css("max-height", Math.min($(window).height() - 16, 480) + "px"); - } - else - { - $(".zoom").css("left", ($("#minimap").width() - 34) + "px"); - $("#minimap").css("max-height", Math.min($(window).height() - 16, $("#minimap > img").height()) + "px"); - } - - if (expandHealth()) - { - $(".colhealth").css("width", "150px"); - $(".health").removeClass("tt"); - } - else - { - $(".colhealth").css("width", "24px"); - $(".health").addClass("tt"); - } - - $("body").css("padding-left", Math.min($(window).width() - 400, $("#minimap").width() - 10) + "px"); -} - -function expandHealth() -{ - return $("#textbased").width() > 510; -} - -var updateMap = true; - -function switchTo(i) -{ - if (i == 1) - { - $("#minimap").hide(); - $("#textbased").show(); - } - else - { - $("#textbased").hide(); - $("#minimap").show(); - } -} - -var orig_scrollTop = 0; - -function clearAll() -{ - orig_scrollTop = $(window).scrollTop(); - $("#textbased-tbody").empty(); - $("#minimap .dot").remove(); -} - -function onAfterUpdate() -{ - $(window).scrollTop(orig_scrollTop); -} - -function isHead(ijob) -{ - return (ijob % 10 == 0); // head roles always end in 0 -} - -function getColor(ijob) -{ - if (ijob == 0) { return "#C06616"; } // captain - else if (ijob >= 10 && ijob < 20) { return "#E74C3C"; } // security - else if (ijob >= 20 && ijob < 30) { return "#3498DB"; } // medical - else if (ijob >= 30 && ijob < 40) { return "#9B59B6"; } // science - else if (ijob >= 40 && ijob < 50) { return "#F1C40F"; } // engineering - else if (ijob >= 50 && ijob < 60) { return "#F39C12"; } // cargo - else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // CentCom - else { return "#C38312"; } // other / unknown -} - -function add(name, assignment, ijob, life_status, dam1, dam2, dam3, dam4, area, pos_x, pos_y, in_range) -{ - try { ijob = parseInt(ijob); } - catch (ex) { ijob = 0; } - - var ls = ""; - - if (life_status === null) { ls = (life_status ? "Deceased" : "Living"); } - - var healthHTML = ""; - - if (dam1 != "" || dam2 != "" || dam3 != "" || dam4 != "") - { - var avg_dam = parseInt(dam1) + parseInt(dam2) + parseInt(dam3) + parseInt(dam4); - var i; - - if (avg_dam <= 0) { i = 5; } - else if (avg_dam <= 25) { i = 4; } - else if (avg_dam <= 50) { i = 3; } - else if (avg_dam <= 75) { i = 2; } - else { i = 0; } - - healthHTML = "
(" + dam1 + "/" + dam2 + "/" + dam3 + "/" + dam4 + ")
"; - } - else - { - healthHTML = "
Not Available
"; - } - - var trElem = $("").attr("data-ijob", ijob); - var tdElem; - var spanElem; - - tdElem = $(""); - - var italics = false; - - if (name.length >= 7 && name.substring(0, 3) == "") - { - name = name.substring(3, name.length - 4); - italics = true; - } - - spanElem = $("").text(name); - - if (italics) - { - spanElem.css("font-style", "italic"); - } - - if (isHead(ijob)) { spanElem.css("font-weight", "bold"); } - - var color = getColor(ijob); - - if (color) { spanElem.css("color", color); } - - tdElem.append(spanElem); - - if (assignment) { tdElem.append($("").text(" (" + assignment + ")")); } - - trElem.append(tdElem); - - tdElem = $(""); - tdElem.html(healthHTML); - - trElem.append(tdElem); - - tdElem = $(""); - - if (area && pos_x && pos_y) - { - tdElem.append($("
").text(area).addClass("tt").append($("
").append($("").text("(" + pos_x + ", " + pos_y + ")")))); - tdElem.css("cursor", "pointer").on("click", function() - { - window.clipboardData.setData("Text", pos_x + ", " + pos_y); - }); - } - else { tdElem.text("Not Available"); } - - trElem.append(tdElem); - - var item = $("#textbased-tbody > tr").filter(function(){ return parseInt($(this).attr("data-ijob")) >= ijob; }).eq(0); - - if (item.length > 0) { trElem.insertBefore(item); } - else { $("#textbased-tbody").append(trElem); } - - if (updateMap && pos_x && pos_y && (in_range == "1")) - { - var x = parseInt(pos_x); - var y = maxy - parseInt(pos_y); - - var tx = translateX(x); - var ty = translateY(y); - - var dotElem = $("
"); - - $("#minimap").append(dotElem); - - var counter = 0; - - function enable() - { - ++counter; - dotElem.addClass("active").css({ "border-color": color }); - } - - function disable() - { - ++counter; - dotElem.removeClass("active").css({ "border-color": "transparent" }); - } - - function click(e) - { - e.preventDefault(); - e.stopPropagation(); - - window.location.href = "byond://?src=" + hSrc + "&action=select_person&name=" + encodeURIComponent(name); - } - - trElem.on("mouseover", function() - { - enable(); - - if (zoom_factor > 1.00) - { - var c = counter; - setTimeout(function() - { - if (c == counter) - { - var minimap = document.getElementById("minimap"); - var half = $(minimap).height() / 2; - var offset = $(dotElem).offset(); - - minimap.scrollLeft = offset.left + minimap.scrollLeft - half; - minimap.scrollTop = offset.top + minimap.scrollTop - half; - } - }, 100); - } - }).on("mouseout", disable).on("click", click); - dotElem.on("mouseover", function() - { - trElem.addClass("hover"); - enable(); - trElem.scrollintoview(); - }).on("mouseout", function() - { - trElem.removeClass("hover"); - disable(); - }).on("click", click); - } -} - -function translateX(n) { return (translate(n - 1.5, scale_x) ).toFixed(0); } -function translateY(n) { return (translate(n + 0.75, scale_y) ).toFixed(0); } - -function translate(n, scale) -{ - return (n * tile_size) * scale; -} \ No newline at end of file diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 6f0c281730..529b070062 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -34,19 +34,7 @@ charges-- insisting = 0 - user.dna.add_mutation(HULK) - user.dna.add_mutation(XRAY) - user.dna.add_mutation(COLDRES) - user.dna.add_mutation(TK) - - user.mind.special_role = "Avatar of the Wish Granter" - - var/datum/objective/hijack/hijack = new - hijack.owner = user.mind - user.mind.objectives += hijack - user.mind.add_antag_datum(/datum/antagonist/auto_custom) - - user.mind.announce_objectives() + user.mind.add_antag_datum(/datum/antagonist/wishgranter) to_chat(user, "You have a very bad feeling about this.") diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index f842c579c1..f423249b70 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -20,6 +20,7 @@ var/ghetto = FALSE lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + var/datum/component/mobhook /obj/item/twohanded/rcl/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/cable_coil)) @@ -84,7 +85,7 @@ /obj/item/twohanded/rcl/Destroy() QDEL_NULL(loaded) last = null - active = FALSE + setActive(FALSE, null) // setactive(FALSE) removes mobhook return ..() /obj/item/twohanded/rcl/update_icon() @@ -115,18 +116,19 @@ QDEL_NULL(loaded) loaded = null unwield(user) - active = wielded + setActive(wielded, user) return TRUE return FALSE /obj/item/twohanded/rcl/dropped(mob/wearer) ..() - active = FALSE + if(mobhook) + setActive(FALSE, mobhook.parent) last = null /obj/item/twohanded/rcl/attack_self(mob/user) ..() - active = wielded + setActive(wielded, user) if(!active) last = null else if(!last) @@ -135,9 +137,15 @@ last = C break -/obj/item/twohanded/rcl/on_mob_move(direct, mob/user) - if(active) - trigger(user) +/obj/item/twohanded/rcl/proc/setActive(toggle, mob/user) + active = toggle + if (active && user) + if (mobhook && mobhook.parent != user) + QDEL_NULL(mobhook) + if (!mobhook) + mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/trigger, user)) + else + QDEL_NULL(mobhook) /obj/item/twohanded/rcl/proc/trigger(mob/user) if(!isturf(user.loc)) @@ -148,7 +156,7 @@ if(prob(2) && ghetto) //Give ghetto RCLs a 2% chance to jam, requiring it to be reactviated manually. to_chat(user, "[src]'s wires jam!") - active = FALSE + setActive(FALSE, user) return else if(last) diff --git a/code/game/objects/items/devices/sensor_device.dm b/code/game/objects/items/devices/sensor_device.dm index e42a42bf01..edfd4368ff 100644 --- a/code/game/objects/items/devices/sensor_device.dm +++ b/code/game/objects/items/devices/sensor_device.dm @@ -7,4 +7,4 @@ slot_flags = SLOT_BELT /obj/item/device/sensor_device/attack_self(mob/user) - GLOB.crewmonitor.show(user) //Proc already exists, just had to call it + GLOB.crewmonitor.show(user,src) //Proc already exists, just had to call it diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index e048599225..6e4c8d5a7b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -202,15 +202,6 @@ /obj/proc/check_uplink_validity() return 1 -/obj/proc/on_mob_move(dir, mob, oldLoc, forced) - return - -/obj/proc/on_mob_turn(dir, mob) - return - -/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc) - return - /obj/vv_get_dropdown() . = ..() .["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]" diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 129a8c119a..c73dd50e44 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -139,12 +139,13 @@ return 1 if(..()) return 1 - if(intact && istype(C, /obj/item/crowbar)) - return pry_tile(C, user) if(intact && istype(C, /obj/item/stack/tile)) try_replace_tile(C, user, params) return 0 +/turf/open/floor/crowbar_act(mob/living/user, obj/item/I) + return intact ? pry_tile(I, user) : FALSE + /turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index d3a340965f..e664c62023 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -17,12 +17,8 @@ ..() to_chat(user, "There's a few screws and a small crack visible.") -/turf/open/floor/wood/attackby(obj/item/C, mob/user, params) - if(..()) - return - if(istype(C, /obj/item/screwdriver)) - pry_tile(C, user) - return +/turf/open/floor/wood/screwdriver_act(mob/living/user, obj/item/I) + return pry_tile(I, user) /turf/open/floor/wood/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) @@ -38,9 +34,8 @@ P.attackby(T, user, params) /turf/open/floor/wood/pry_tile(obj/item/C, mob/user, silent = FALSE) - var/is_screwdriver = istype(C, /obj/item/screwdriver) C.play_tool_sound(src, 80) - return remove_tile(user, silent, make_tile = is_screwdriver) + return remove_tile(user, silent, (C.tool_behaviour == TOOL_SCREWDRIVER)) /turf/open/floor/wood/remove_tile(mob/user, silent = FALSE, make_tile = TRUE) if(broken || burnt) @@ -80,7 +75,7 @@ update_icon() /turf/open/floor/grass/attackby(obj/item/C, mob/user, params) - if(istype(C, /obj/item/shovel) && params) + if((C.tool_behaviour == TOOL_SHOVEL) && params) new ore_type(src, 2) user.visible_message("[user] digs up [src].", "You [turfverb] [src].") playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) @@ -99,10 +94,11 @@ initial_gas_mix = "o2=22;n2=82;TEMP=180" slowdown = 2 -/turf/open/floor/grass/snow/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar))//You need to dig this turf out instead of crowbarring it - return - ..() +/turf/open/floor/grass/snow/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + +/turf/open/floor/grass/snow/crowbar_act(mob/living/user, obj/item/I) + return /turf/open/floor/grass/snow/basalt //By your powers combined, I am captain planet name = "volcanic floor" diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index 8ad09829b2..07e324bb02 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -42,7 +42,7 @@ if(exposed_temperature > 300) PlasmaBurn(exposed_temperature) -/turf/open/floor/mineral/plasma/attackby(obj/item/W as obj, mob/user as mob, params) +/turf/open/floor/mineral/plasma/attackby(obj/item/W, mob/user, params) if(W.is_hot() > 300)//If the temperature of the object is over 300, then ignite message_admins("Plasma flooring was ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1) log_game("Plasma flooring was ignited by [key_name(user)] in [COORD(src)]") diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 721cb12e9d..73e99d7b41 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -196,6 +196,9 @@ flick_overlay(I, viewing, 8) L.adjustToxLoss(-3, TRUE, TRUE) +/turf/open/floor/clockwork/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + /turf/open/floor/clockwork/crowbar_act(mob/living/user, obj/item/I) if(baseturfs == type) return TRUE diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index be55db5408..c2322fd594 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -123,3 +123,6 @@ /turf/open/floor/plating/foam/ex_act() ..() ScrapeAway() + +/turf/open/floor/plating/foam/tool_act(mob/living/user, obj/tool/I, tool_type) + return diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index d60192796c..2b8400abdb 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -26,6 +26,10 @@ if(LAZYLEN(archdrops)) AddComponent(/datum/component/archaeology, 100, archdrops) + +/turf/open/floor/plating/asteroid/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + /turf/open/floor/plating/asteroid/burn_tile() return diff --git a/code/game/turfs/simulated/floor/plating/dirt.dm b/code/game/turfs/simulated/floor/plating/dirt.dm index a9ddd4180e..ff16addd33 100644 --- a/code/game/turfs/simulated/floor/plating/dirt.dm +++ b/code/game/turfs/simulated/floor/plating/dirt.dm @@ -10,3 +10,6 @@ /turf/open/floor/plating/dirt/dark icon_state = "greenerdirt" + +/turf/open/floor/plating/dirt/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index eeed718aba..6e66d5deba 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -22,6 +22,8 @@ /turf/open/floor/plating/abductor2/burn_tile() return //unburnable +/turf/open/floor/plating/abductor2/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return /turf/open/floor/plating/astplate icon_state = "asteroidplating" @@ -49,6 +51,9 @@ icon = smooth_icon . = ..() +/turf/open/floor/plating/ashplanet/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + /turf/open/floor/plating/ashplanet/break_tile() return @@ -84,6 +89,9 @@ flags_1 = NONE attachment_holes = FALSE +/turf/open/floor/plating/beach/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + /turf/open/floor/plating/beach/ex_act(severity, target) contents_explosion(severity, target) @@ -122,6 +130,9 @@ /turf/open/floor/plating/ironsand/burn_tile() return +/turf/open/floor/plating/ironsand/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + /turf/open/floor/plating/ice name = "ice sheet" desc = "A sheet of solid ice. Looks slippery." @@ -135,6 +146,9 @@ wet = TURF_WET_PERMAFROST attachment_holes = FALSE +/turf/open/floor/plating/ice/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + /turf/open/floor/plating/ice/HandleWet() if(wet == TURF_WET_ICE) return diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 0bd4572b35..71887fa08e 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -25,6 +25,12 @@ ..() return //unplateable +/turf/open/floor/engine/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + +/turf/open/floor/engine/crowbar_act(mob/living/user, obj/item/I) + return + /turf/open/floor/engine/wrench_act(mob/living/user, obj/item/I) to_chat(user, "You begin removing rods...") if(I.use_tool(src, user, 30, volume=80)) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index c886a77e88..0246431e89 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -286,26 +286,22 @@ newmob.real_name = newmob.dna.species.random_name(newmob.gender,1) newmob.dna.update_dna_identity() newmob.key = chosen_candidate.key - newmob.mind.assigned_role = "CentCom Official" - newmob.equipOutfit(/datum/outfit/centcom_official) + - //Assign antag status and the mission + //Job + newmob.mind.assigned_role = "CentCom Official" newmob.mind.special_role = "official" + //Mission var/datum/objective/missionobj = new missionobj.owner = newmob.mind missionobj.explanation_text = mission missionobj.completed = 1 - newmob.mind.objectives += missionobj - newmob.mind.add_antag_datum(/datum/antagonist/auto_custom) + var/datum/antagonist/official/O = new + O.mission = missionobj - if(CONFIG_GET(flag/enforce_human_authority)) - newmob.set_species(/datum/species/human) - - //Greet the official - to_chat(newmob, "You are a CentCom Official.") - to_chat(newmob, "
Central Command is sending you to [station_name()] with the task: [mission]") + newmob.mind.add_antag_datum(O) //Logging and cleanup message_admins("CentCom Official [key_name_admin(newmob)] has spawned with the task: [mission]") diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index c49b724633..b2fab75eb4 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -46,6 +46,7 @@ /datum/antagonist/ert/proc/forge_objectives() if(ert_team) objectives |= ert_team.objectives + owner.objectives |= objectives /datum/antagonist/ert/proc/equipERT() var/mob/living/carbon/human/H = owner.current diff --git a/code/modules/antagonists/nightmare/nightmare.dm b/code/modules/antagonists/nightmare/nightmare.dm new file mode 100644 index 0000000000..41a3f181d0 --- /dev/null +++ b/code/modules/antagonists/nightmare/nightmare.dm @@ -0,0 +1,4 @@ +/datum/antagonist/nightmare + name = "Nightmare" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE \ No newline at end of file diff --git a/code/modules/antagonists/official/official.dm b/code/modules/antagonists/official/official.dm new file mode 100644 index 0000000000..0182547d74 --- /dev/null +++ b/code/modules/antagonists/official/official.dm @@ -0,0 +1,33 @@ +/datum/antagonist/official + name = "CentCom Official" + show_name_in_check_antagonists = TRUE + show_in_antagpanel = FALSE + var/datum/objective/mission + +/datum/antagonist/official/greet() + to_chat(owner, "You are a CentCom Official.") + to_chat(owner, "Central Command is sending you to [station_name()] with the task: [mission.explanation_text]") + +/datum/antagonist/official/proc/equip_official() + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + return + H.equipOutfit(/datum/outfit/centcom_official) + + if(CONFIG_GET(flag/enforce_human_authority)) + H.set_species(/datum/species/human) + +/datum/antagonist/official/proc/forge_objectives() + if(!mission) + var/datum/objective/missionobj = new + missionobj.owner = owner + missionobj.explanation_text = "Conduct a routine preformance review of [station_name()] and its Captain." + missionobj.completed = 1 + mission = missionobj + objectives |= mission + owner.objectives |= objectives + +/datum/antagonist/official/on_gain() + forge_objectives() + . = ..() + equip_official() \ No newline at end of file diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 5be923ddcc..a578b06042 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -62,6 +62,15 @@ var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?) var/generated_objectives_and_spells = FALSE +/mob/living/simple_animal/revenant/Initialize(mapload) + . = ..() + AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) + AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) + AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) + /mob/living/simple_animal/revenant/Login() ..() to_chat(src, "You are a revenant.") @@ -73,26 +82,10 @@ to_chat(src, "Be sure to read the wiki page at https://tgstation13.org/wiki/Revenant to learn more.") if(!generated_objectives_and_spells) generated_objectives_and_spells = TRUE - mind.remove_all_antag() - mind.wipe_memory() - SEND_SOUND(src, sound('sound/effects/ghost.ogg')) - var/datum/objective/revenant/objective = new - objective.owner = mind - mind.objectives += objective - to_chat(src, "Objective #1: [objective.explanation_text]") - var/datum/objective/revenantFluff/objective2 = new - objective2.owner = mind - mind.objectives += objective2 - to_chat(src, "Objective #2: [objective2.explanation_text]") mind.assigned_role = ROLE_REVENANT mind.special_role = ROLE_REVENANT - mind.add_antag_datum(/datum/antagonist/auto_custom) - AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null)) - AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/overload(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/blight(null)) - AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/malfunction(null)) + SEND_SOUND(src, sound('sound/effects/ghost.ogg')) + mind.add_antag_datum(/datum/antagonist/revenant) //Life, Stat, Hud Updates, and Say /mob/living/simple_animal/revenant/Life() @@ -219,7 +212,7 @@ var/reforming_essence = essence_regen_cap //retain the gained essence capacity var/obj/item/ectoplasm/revenant/R = new(get_turf(src)) R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls - R.client_to_revive = client //If the essence reforms, the old revenant is put back in the body + R.old_key = client.key //If the essence reforms, the old revenant is put back in the body R.revenant = src invisibility = INVISIBILITY_ABSTRACT revealed = FALSE @@ -328,7 +321,7 @@ var/essence = 75 //the maximum essence of the reforming revenant var/reforming = TRUE var/inert = FALSE - var/client/client_to_revive + var/old_key //key of the previous revenant, will have first pick on reform. var/mob/living/simple_animal/revenant/revenant /obj/item/ectoplasm/revenant/New() @@ -375,11 +368,11 @@ message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") forceMove(drop_location()) //In case it's in a backpack or someone's hand revenant.forceMove(loc) - if(client_to_revive) + if(old_key) for(var/mob/M in GLOB.dead_mob_list) - if(M.client == client_to_revive) //Only recreates the mob if the mob the client is in is dead - revenant.client = client_to_revive - key_of_revenant = client_to_revive.key + if(M.client && M.client.key == old_key) //Only recreates the mob if the mob the client is in is dead + key_of_revenant = old_key + break if(!key_of_revenant) message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") var/list/candidates = pollCandidatesForMob("Do you want to be [revenant.name] (reforming)?", ROLE_REVENANT, null, ROLE_REVENANT, 50, revenant) @@ -390,7 +383,6 @@ visible_message("[src] settles down and seems lifeless.") return var/client/C = pick(candidates) - revenant.client = C key_of_revenant = C.key if(!key_of_revenant) qdel(revenant) @@ -399,8 +391,8 @@ visible_message("[src] settles down and seems lifeless.") return - message_admins("[key_of_revenant] has been [client_to_revive ? "re":""]made into a revenant by reforming ectoplasm.") - log_game("[key_of_revenant] was [client_to_revive ? "re":""]made as a revenant by reforming ectoplasm.") + message_admins("[key_of_revenant] has been [old_key == key_of_revenant ? "re":""]made into a revenant by reforming ectoplasm.") + log_game("[key_of_revenant] was [old_key == key_of_revenant ? "re":""]made as a revenant by reforming ectoplasm.") visible_message("[src] suddenly rises into the air before fading away.") revenant.essence = essence diff --git a/code/modules/antagonists/revenant/revenant_antag.dm b/code/modules/antagonists/revenant/revenant_antag.dm new file mode 100644 index 0000000000..d50aed24e3 --- /dev/null +++ b/code/modules/antagonists/revenant/revenant_antag.dm @@ -0,0 +1,21 @@ +/datum/antagonist/revenant + name = "Revenant" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE + +/datum/antagonist/revenant/greet() + owner.announce_objectives() + +/datum/antagonist/revenant/proc/forge_objectives() + var/datum/objective/revenant/objective = new + objective.owner = owner + objectives += objective + var/datum/objective/revenantFluff/objective2 = new + objective2.owner = owner + objectives += objective2 + + owner.objectives |= objectives + +/datum/antagonist/revenant/on_gain() + forge_objectives() + . = ..() \ No newline at end of file diff --git a/code/modules/antagonists/separatist/separatist.dm b/code/modules/antagonists/separatist/separatist.dm new file mode 100644 index 0000000000..cb7e0bf28e --- /dev/null +++ b/code/modules/antagonists/separatist/separatist.dm @@ -0,0 +1,19 @@ +/datum/team/nation + name = "Nation" + +/datum/antagonist/separatist + name = "Separatists" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE + var/datum/team/nation/nation + +/datum/antagonist/separatist/create_team(datum/team/nation/new_team) + if(!new_team) + return + nation = new_team + +/datum/antagonist/separatist/get_team() + return nation + +/datum/antagonist/separatist/greet() + to_chat(owner, "You are a separatist! [nation.name] forever! Protect the sovereignty of your newfound land with your comrades in arms!") \ No newline at end of file diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm index a018603cf1..54bfc19acf 100644 --- a/code/modules/antagonists/slaughter/slaughter_antag.dm +++ b/code/modules/antagonists/slaughter/slaughter_antag.dm @@ -26,6 +26,8 @@ new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]." objectives += new_objective2 + owner.objectives |= objectives + /datum/antagonist/slaughter/laughter name = "Laughter demon" objective_verb = "Hug and Tickle" \ No newline at end of file diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm new file mode 100644 index 0000000000..93a2170dab --- /dev/null +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -0,0 +1,39 @@ +/datum/antagonist/survivalist + name = "Survivalist" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE + var/greet_message = "" + +/datum/antagonist/survivalist/proc/forge_objectives() + var/datum/objective/survive/survive = new + survive.owner = owner + objectives += survive + owner.objectives |= objectives + +/datum/antagonist/survivalist/on_gain() + owner.special_role = "survivalist" + forge_objectives() + . = ..() + +/datum/antagonist/survivalist/greet() + to_chat(owner, "You are the survivalist![greet_message]") + owner.announce_objectives() + +/datum/antagonist/survivalist/guns + greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way." + +/datum/antagonist/survivalist/guns/forge_objectives() + var/datum/objective/steal_five_of_type/summon_guns/guns = new + guns.owner = owner + objectives += guns + ..() + +/datum/antagonist/survivalist/magic + name = "Amateur Magician" + greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way." + +/datum/antagonist/survivalist/magic/forge_objectives() + var/datum/objective/steal_five_of_type/summon_magic/magic = new + magic.owner = owner + objectives += magic + ..() \ No newline at end of file diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm new file mode 100644 index 0000000000..8661151c93 --- /dev/null +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -0,0 +1,24 @@ +/datum/antagonist/heartbreaker + name = "heartbreaker" + roundend_category = "valentines" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE + + +/datum/antagonist/heartbreaker/proc/forge_objectives() + var/datum/objective/martyr/normiesgetout = new + normiesgetout.owner = owner + objectives += normiesgetout + owner.objectives += objectives + +/datum/antagonist/heartbreaker/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/heartbreaker/on_removal() + owner.objectives -= objectives + . = ..() + +/datum/antagonist/heartbreaker/greet() + to_chat(owner, "You didn't get a date! They're all having fun without you! you'll show them though...") + owner.announce_objectives() \ No newline at end of file diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm new file mode 100644 index 0000000000..1ca8e39318 --- /dev/null +++ b/code/modules/antagonists/valentines/valentine.dm @@ -0,0 +1,37 @@ +/datum/antagonist/valentine + name = "valentine" + roundend_category = "valentines" //there's going to be a ton of them so put them in separate category + show_in_antagpanel = FALSE + var/datum/mind/date + +/datum/antagonist/valentine/proc/forge_objectives() + var/datum/objective/protect/protect_objective = new /datum/objective/protect + protect_objective.owner = owner + protect_objective.target = date + protect_objective.explanation_text = "Protect [date.name], your date." + objectives += protect_objective + owner.objectives += objectives + +/datum/antagonist/valentine/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/valentine/on_removal() + owner.objectives -= objectives + +/datum/antagonist/valentine/greet() + to_chat(owner, "You're on a date with [date.name]! Protect them at all costs. This takes priority over all other loyalties.") + +//Squashed up a bit +/datum/antagonist/valentine/roundend_report() + var/objectives_complete = TRUE + if(owner.objectives.len) + for(var/datum/objective/objective in owner.objectives) + if(!objective.check_completion()) + objectives_complete = FALSE + break + + if(objectives_complete) + return "[owner.name] protected their date" + else + return "[owner.name] date failed!" \ No newline at end of file diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm new file mode 100644 index 0000000000..3f7fac9d18 --- /dev/null +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -0,0 +1,29 @@ +/datum/antagonist/wishgranter + name = "Wishgranter Avatar" + show_in_antagpanel = FALSE + show_name_in_check_antagonists = TRUE + +/datum/antagonist/wishgranter/proc/forge_objectives() + var/datum/objective/hijack/hijack = new + hijack.owner = owner + objectives += hijack + owner.objectives |= objectives + +/datum/antagonist/wishgranter/on_gain() + owner.special_role = "Avatar of the Wish Granter" + forge_objectives() + . = ..() + give_powers() + +/datum/antagonist/wishgranter/greet() + to_chat(owner, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") + owner.announce_objectives() + +/datum/antagonist/wishgranter/proc/give_powers() + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + return + H.dna.add_mutation(HULK) + H.dna.add_mutation(XRAY) + H.dna.add_mutation(COLDRES) + H.dna.add_mutation(TK) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 96ea588bfa..b8d6b87f84 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -113,14 +113,7 @@ if("To Kill") to_chat(user, "Your wish is granted, but at a terrible cost...") to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") - user.mind.special_role = ROLE_TRAITOR - - var/datum/objective/hijack/hijack = new - hijack.owner = user.mind - user.mind.objectives += hijack - user.mind.add_antag_datum(/datum/antagonist/auto_custom) - to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") - user.mind.announce_objectives() + user.mind.add_antag_datum(/datum/antagonist/wishgranter) user.set_species(/datum/species/shadow) if("Peace") to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 03a13e0beb..cccdb199bb 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/simple/goonchat verify = FALSE assets = list( - "jquery.min.js" = 'code/modules/html_interface/js/jquery.min.js', + "jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js', "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', "errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js', "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', @@ -350,12 +350,6 @@ GLOBAL_LIST_EMPTY(asset_datums) "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', ) -//Registers HTML Interface assets. -/datum/asset/HTML_interface/register() - for(var/path in typesof(/datum/html_interface)) - var/datum/html_interface/hi = new path() - hi.registerResources() - //this exists purely to avoid meta by pre-loading all language icons. /datum/asset/language/register() for(var/path in typesof(/datum/language)) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 9ae87488ce..193d23e7bf 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -49,9 +49,6 @@ var/obj/screen/click_catcher/void - // Used by html_interface module. - var/hi_last_pos - var/ip_intel = "Disabled" //datum that controls the displaying and hiding of tooltips diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index f515dacc74..06772fc314 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -97,16 +97,19 @@ var/atom/movable/cached_pull //recipe for disaster again. var/afterForceMove = FALSE + var/datum/component/mobhook /obj/item/device/flightpack/proc/changeWearer(mob/changeto) if(wearer) LAZYREMOVE(wearer.user_movement_hooks, src) wearer = null + QDEL_NULL(mobhook) cached_pull = null if(istype(changeto)) wearer = changeto LAZYADD(wearer.user_movement_hooks, src) cached_pull = changeto.pulling + mobhook = changeto.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move, changeto)) /obj/item/device/flightpack/Initialize() ion_trail = new @@ -180,6 +183,7 @@ QDEL_NULL(part_laser) QDEL_NULL(part_bin) QDEL_NULL(ion_trail) + QDEL_NULL(mobhook) STOP_PROCESSING(SSflightpacks, src) . = ..() @@ -205,27 +209,6 @@ momentum_y = CLAMP(momentum_y + amounty, -momentum_max, momentum_max) calculate_momentum_speed() -/obj/item/device/flightpack/intercept_user_move(dir, mob, newLoc, oldLoc) - if(!flight) - return - var/momentum_increment = momentum_gain - if(boost) - momentum_increment = boost_power - if(brake) - momentum_increment = 0 - if(!gravity && !pressure) - momentum_increment -= 10 - switch(dir) - if(NORTH) - adjust_momentum(0, momentum_increment) - if(SOUTH) - adjust_momentum(0, -momentum_increment) - if(EAST) - adjust_momentum(momentum_increment, 0) - if(WEST) - adjust_momentum(-momentum_increment, 0) - return ..() - //The wearer has momentum left. Move them and take some away, while negating the momentum that moving the wearer would gain. Or force the wearer to lose control if they are incapacitated. /obj/item/device/flightpack/proc/momentum_drift() if(!flight || !wearer || (momentum_speed == 0)) @@ -252,7 +235,7 @@ if(prob(emp_damage * 15)) step(wearer, pick(GLOB.alldirs)) -/obj/item/device/flightpack/on_mob_move(dir, mob/mob, turf/oldLoc, forced) +/obj/item/device/flightpack/proc/on_mob_move(mob/mob, turf/oldLoc, dir, forced) if(forced) if(cached_pull && istype(oldLoc) && (get_dist(oldLoc, loc) <= 1) && !oldLoc.density) cached_pull.forceMove(oldLoc) @@ -270,7 +253,22 @@ afterForceMove = FALSE if(flight) ion_trail.generate_effect() - . = ..() + var/momentum_increment = momentum_gain + if(boost) + momentum_increment = boost_power + if(brake) + momentum_increment = 0 + if(!gravity && !pressure) + momentum_increment -= 10 + switch(dir) + if(NORTH) + adjust_momentum(0, momentum_increment) + if(SOUTH) + adjust_momentum(0, -momentum_increment) + if(EAST) + adjust_momentum(momentum_increment, 0) + if(WEST) + adjust_momentum(-momentum_increment, 0) //Make the wearer lose some momentum. /obj/item/device/flightpack/proc/momentum_decay() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index ae3fb11fbe..98eed7649b 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -585,6 +585,7 @@ armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75) item_color = "ancient" resistance_flags = FIRE_PROOF + var/datum/component/mobhook /obj/item/clothing/suit/space/hardsuit/ancient name = "prototype RIG hardsuit" @@ -596,8 +597,9 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient resistance_flags = FIRE_PROOF var/footstep = 1 + var/datum/component/mobhook -/obj/item/clothing/suit/space/hardsuit/ancient/on_mob_move() +/obj/item/clothing/suit/space/hardsuit/ancient/proc/on_mob_move() var/mob/living/carbon/human/H = loc if(!istype(H) || H.wear_suit != src) return @@ -607,6 +609,24 @@ else footstep++ +/obj/item/clothing/suit/space/hardsuit/ancient/equipped(mob/user, slot) + . = ..() + if (slot == slot_wear_suit) + if (mobhook && mobhook.parent != user) + QDEL_NULL(mobhook) + if (!mobhook) + mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move)) + else + QDEL_NULL(mobhook) + +/obj/item/clothing/suit/space/hardsuit/ancient/dropped() + . = ..() + QDEL_NULL(mobhook) + +/obj/item/clothing/suit/space/hardsuit/ancient/Destroy() + QDEL_NULL(mobhook) // mobhook is not our component + return ..() + /////////////SHIELDED////////////////////////////////// /obj/item/clothing/suit/space/hardsuit/shielded diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 4de5069859..fe9ef700c2 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -33,34 +33,19 @@ forge_valentines_objective(L, date) - forge_valentines_objective(date, L) if(valentines.len && prob(4)) var/mob/living/notgoodenough = pick_n_take(valentines) forge_valentines_objective(notgoodenough, date) - - else - to_chat(L, "You didn't get a date! They're all having fun without you! you'll show them though...") - var/datum/objective/martyr/normiesgetout = new - normiesgetout.owner = L.mind - L.mind.special_role = "heartbreaker" - L.mind.objectives += normiesgetout - L.mind.add_antag_datum(/datum/antagonist/auto_custom) + L.mind.add_antag_datum(/datum/antagonist/heartbreaker) /proc/forge_valentines_objective(mob/living/lover,mob/living/date) lover.mind.special_role = "valentine" - var/datum/objective/protect/protect_objective = new /datum/objective/protect - protect_objective.owner = lover.mind - protect_objective.target = date.mind - protect_objective.explanation_text = "Protect [date.real_name], your date." - lover.mind.objectives += protect_objective - - lover.mind.add_antag_datum(/datum/antagonist/auto_custom) - - to_chat(lover, "You're on a date with [date]! Protect them at all costs. This takes priority over all other loyalties.") - + var/datum/antagonist/valentine/V = new + V.date = date.mind + lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now /datum/round_event/valentines/announce(fake) priority_announce("It's Valentine's Day! Give a valentine to that special someone!") diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 1a6c99d6ed..b1cebb98c5 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -34,7 +34,7 @@ player_mind.transfer_to(S) player_mind.assigned_role = "Nightmare" player_mind.special_role = "Nightmare" - player_mind.add_antag_datum(/datum/antagonist/auto_custom) + player_mind.add_antag_datum(/datum/antagonist/nightmare) S.set_species(/datum/species/shadow/nightmare) playsound(S, 'sound/magic/ethereal_exit.ogg', 50, 1, -1) message_admins("[key_name_admin(S)] has been made into a Nightmare by an event.") diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm index 22fe7d91d4..bf6de2bfe0 100644 --- a/code/modules/events/wizard/departmentrevolt.dm +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -9,31 +9,34 @@ var/list/tidecolor var/list/jobs_to_revolt = list() - var/nation + var/nation_name var/list/citizens = list() tidecolor = pick("grey", "white", "yellow", "purple", "brown", "whatevercolorrepresentstheservicepeople") switch(tidecolor) if("grey") //God help you jobs_to_revolt = list("Assistant") - nation = pick("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi") + nation_name = pick("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi") if("white") jobs_to_revolt = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist") - nation = pick("Mede", "Healtha", "Recova", "Chemi", "Geneti", "Viro", "Psych") + nation_name = pick("Mede", "Healtha", "Recova", "Chemi", "Geneti", "Viro", "Psych") if("yellow") jobs_to_revolt = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") - nation = pick("Atomo", "Engino", "Power", "Teleco") + nation_name = pick("Atomo", "Engino", "Power", "Teleco") if("purple") jobs_to_revolt = list("Research Director","Scientist", "Roboticist") - nation = pick("Sci", "Griffa", "Explosi", "Mecha", "Xeno") + nation_name = pick("Sci", "Griffa", "Explosi", "Mecha", "Xeno") if("brown") jobs_to_revolt = list("Quartermaster", "Cargo Technician", "Shaft Miner") - nation = pick("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf") + nation_name = pick("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf") if("whatevercolorrepresentstheservicepeople") //the few, the proud, the technically aligned jobs_to_revolt = list("Bartender", "Cook", "Botanist", "Clown", "Mime", "Janitor", "Chaplain") - nation = pick("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi") + nation_name = pick("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi") - nation += pick("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka") + nation_name += pick("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka") + + var/datum/team/nation/nation = new + nation.name = nation_name for(var/mob/living/carbon/human/H in GLOB.carbon_list) if(H.mind) @@ -42,12 +45,11 @@ for(var/job in jobs_to_revolt) if(M.assigned_role == job) citizens += H - M.special_role = "separatist" - M.add_antag_datum(/datum/antagonist/auto_custom) - H.log_message("Was made into a separatist, long live [nation]!", INDIVIDUAL_ATTACK_LOG) - to_chat(H, "You are a separatist! [nation] forever! Protect the sovereignty of your newfound land with your comrades in arms!") + M.add_antag_datum(/datum/antagonist/separatist,nation) + H.log_message("Was made into a separatist, long live [nation_name]!", INDIVIDUAL_ATTACK_LOG) + if(citizens.len) var/message for(var/job in jobs_to_revolt) message += "[job]," - message_admins("The nation of [nation] has been formed. Affected jobs are [message]") + message_admins("The nation of [nation_name] has been formed. Affected jobs are [message]") diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 867a12f2d4..e07844c4b4 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -283,15 +283,17 @@ var/field_type = /datum/proximity_monitor/advanced/debug var/operating = FALSE var/datum/proximity_monitor/advanced/current = null + var/datum/component/mobhook -/obj/item/device/multitool/field_debug/New() +/obj/item/device/multitool/field_debug/Initialize() + . = ..() START_PROCESSING(SSobj, src) - ..() /obj/item/device/multitool/field_debug/Destroy() STOP_PROCESSING(SSobj, src) QDEL_NULL(current) - ..() + QDEL_NULL(mobhook) + return ..() /obj/item/device/multitool/field_debug/proc/setup_debug_field() var/list/new_params = field_params.Copy() @@ -301,12 +303,18 @@ /obj/item/device/multitool/field_debug/attack_self(mob/user) operating = !operating to_chat(user, "You turn [src] [operating? "on":"off"].") + QDEL_NULL(mobhook) if(!istype(current) && operating) + mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move)) setup_debug_field() else if(!operating) QDEL_NULL(current) -/obj/item/device/multitool/field_debug/on_mob_move() +/obj/item/device/multitool/field_debug/dropped() + . = ..() + QDEL_NULL(mobhook) + +/obj/item/device/multitool/field_debug/proc/on_mob_move() check_turf(get_turf(src)) /obj/item/device/multitool/field_debug/process() diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index e7bf3ea9d7..e69de29bb2 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -1,279 +0,0 @@ -/datum/playingcard - var/name = "playing card" - var/card_icon = "card_back" - var/suit - var/number - -/* Deck */ - -/obj/item/deck - name = "deck of cards" - desc = "A simple deck of playing cards." - icon = 'icons/obj/playing_cards.dmi' - icon_state = "deck" - w_class = WEIGHT_CLASS_SMALL - flags_1 = NOBLUDGEON_1 - - var/list/cards = list() - -/obj/item/deck/Initialize() - . = ..() - - var/cardcolor - var/datum/playingcard/card - - for (var/suit in list("spades", "clubs", "diamonds", "hearts")) - if (suit == "spades" || suit == "clubs") - cardcolor = "black_" - else - cardcolor = "red_" - - for (var/number in list("ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten")) - card = new() - card.name = "[number] of [suit]" - card.card_icon = "[cardcolor]num" - card.suit = suit - card.number = number - - src.cards.Add(card) - - for (var/number in list("jack", "queen", "king")) - card = new() - card.name = "[number] of [suit]" - card.card_icon = "[cardcolor]col" - card.suit = suit - card.number = number - - src.cards.Add(card) - - for (var/i = 0, i < 2, i++) - card = new() - card.name = "joker" - card.card_icon = "joker" - card.suit = "joker" - card.number = "" - - src.cards.Add(card) - -/obj/item/deck/attackby(obj/O, mob/user) - if (istype(O, /obj/item/hand)) - var/obj/item/hand/H = O - - for (var/datum/playingcard/P in H.cards) - src.cards.Add(P) - - qdel (O) - - user.show_message("You place your cards on the bottom of the deck.") - else - return ..() - -/obj/item/deck/attack_self(mob/user) - var/list/newcards = list() - var/datum/playingcard/card - - while (cards.len) - card = pick(cards) - newcards.Add(card) - src.cards.Remove(card) - - src.cards = newcards - - user.visible_message("\The [user] shuffles [src].") - -/obj/item/deck/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) - if(flag) - return //It's adjacent, is the user, or is on the user's person - - if(isliving(A)) - src.dealTo(A, user) - else - return ..() - -/obj/item/deck/attack(mob/living/M, mob/living/user, def_zone) - if (istype(M)) - src.dealTo(M, user) - else - return ..() - -/obj/item/deck/proc/dealTo(mob/living/target, mob/living/source) - if (!cards.len) - source.show_message("There are no cards in the deck.") - return - - var/datum/playingcard/card = src.cards[1] - - src.cards.Remove(card) - - var/obj/item/hand/H = new(get_turf(src)) - - H.concealed = 1 - H.update_conceal() - - H.cards.Add(card) - H.update_icon() - - source.visible_message("\The [source] deals a card to \the [target].") - H.throw_at(get_step(target, target.dir), 10, 1, source) - -/* Hand */ - -/obj/item/hand - name = "hand of cards" - desc = "Some playing cards." - icon = 'icons/obj/playing_cards.dmi' - icon_state = "empty" - w_class = WEIGHT_CLASS_TINY - - var/concealed = 0 - var/blank = 0 - var/list/cards = list() - var/datum/html_interface/hi - resistance_flags = FLAMMABLE - -/obj/item/hand/New(loc) - . = ..() - - src.hi = new/datum/html_interface/cards(src, "Your hand", 540, 302) - src.update_conceal() - -/obj/item/hand/Destroy() - if (src.hi) - qdel(src.hi) - - return ..() - -/obj/item/hand/attackby(obj/O, mob/user) - if(cards.len == 1 && istype(O, /obj/item/pen)) - var/datum/playingcard/P = cards[1] - if(!blank) - to_chat(user, "You cannot write on that card.") - return - var/cardtext = sanitize(input(user, "What do you wish to write on the card?", "Card Writing") as text|null, 50) - if(!cardtext) - return - P.name = cardtext - blank = 0 - else if(istype(O, /obj/item/hand)) - var/obj/item/hand/H = O - - for(var/datum/playingcard/P in src.cards) - H.cards.Add(P) - - H.update_icon() - - qdel(src) - else - return ..() - -/obj/item/hand/verb/discard(datum/playingcard/card in cards) - set category = "Object" - set name = "Discard" - set desc = "Place a card from your hand in front of you." - - if (!card) - return - - var/obj/item/hand/H = new(src.loc) - - H.concealed = 0 - H.update_conceal() - - H.cards.Add(card) - src.cards.Remove(card) - - H.update_icon() - - ASSERT(H) - - usr.visible_message("\The [usr] plays \the [card.name].") - H.forceMove(get_step(usr,usr.dir)) - - src.update_icon() - -/obj/item/hand/verb/toggle_conceal() - set category = "Object" - set name = "Toggle conceal" - set desc = "Toggle concealment of your hand" - - src.concealed = !src.concealed - - src.update_conceal() - - usr.visible_message("\The [usr] [concealed ? "conceals" : "reveals"] their hand.") - - src.update_icon() - -/obj/item/hand/attack_self(mob/user) - src.hi.show(user) - -/obj/item/hand/examine() - . = ..() - - if((!concealed || src.loc == usr) && cards.len) - usr.show_message("It contains: ", 1) - - for (var/datum/playingcard/card in cards) - usr.show_message("The [card.name].", 1) - -/obj/item/hand/proc/update_conceal() - if (src.concealed) - src.hi.updateContent("headbar", "You are currently concealing your hand. Reveal your hand.") - else - src.hi.updateContent("headbar", "You are currently revealing your hand. Conceal your hand.") - -/obj/item/hand/update_icon() - if (!cards.len) - qdel (src) - else - if(cards.len > 1) - name = "hand of cards" - desc = "Some playing cards." - else - name = "a playing card" - desc = "A playing card." - - cut_overlays() - - if (cards.len == 1) - var/datum/playingcard/P = cards[1] - var/mutable_appearance/card_overlay = mutable_appearance(icon, (concealed ? "card_back" : "[P.card_icon]") ) - - card_overlay.pixel_x = card_overlay.pixel_x + (-5 + rand(10)) - card_overlay.pixel_y = card_overlay.pixel_y + (-5 + rand(10)) - - add_overlay(card_overlay) - else - var/origin = -12 - var/offset = round(32 / cards.len) - - var/i = 0 - var/mutable_appearance/card_overlay - - for(var/datum/playingcard/P in cards) - card_overlay = mutable_appearance(icon, (concealed ? "card_back" : P.card_icon)) - card_overlay.pixel_x = origin + (offset * i) - - add_overlay(card_overlay) - i = i + 1 - - var/html = "" - - for(var/datum/playingcard/card in cards) - html = html + "" - - src.hi.updateContent("hand", html) - -/obj/item/hand/Topic(href, href_list[], datum/html_interface_client/hclient) - if (istype(hclient)) - switch (href_list["action"]) - if ("play_card") - var/datum/playingcard/card = locate(href_list["card"]) in cards - if (card && istype(card)) - src.discard(card) - if ("toggle_conceal") - src.toggle_conceal() - -// Hook for html_interface module to prevent updates to clients who don't have this in their inventory. -/obj/item/hand/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi) - return (hclient.client.mob && hclient.client.mob.stat == 0 && (src in hclient.client.mob.contents)) diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index 7dadcda1a2..39772b1216 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -3,7 +3,11 @@ // which is licensed under CC BY-NC-SA 2.0, the full text of which can be found at the following URL: // https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode // Original code by Zuhayr, Polaris Station, ported with modifications - +/datum/playingcard + var/name = "playing card" + var/card_icon = "card_back" + var/suit + var/number /obj/item/toy/cards/deck/cas name = "\improper CAS deck (white)" diff --git a/code/modules/html_interface/js/jquery.min.js b/code/modules/goonchat/browserassets/js/jquery.min.js similarity index 100% rename from code/modules/html_interface/js/jquery.min.js rename to code/modules/goonchat/browserassets/js/jquery.min.js diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index ab49f5c042..a9ec1ac9f1 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -6,6 +6,9 @@ /turf/open/floor/holofloor/attackby(obj/item/I, mob/living/user) return // HOLOFLOOR DOES NOT GIVE A FUCK +/turf/open/floor/holofloor/tool_act(mob/living/user, obj/item/I, tool_type) + return + /turf/open/floor/holofloor/burn_tile() return //you can't burn a hologram! diff --git a/code/modules/html_interface/cards/cards.css b/code/modules/html_interface/cards/cards.css deleted file mode 100644 index dbcb6e52e0..0000000000 --- a/code/modules/html_interface/cards/cards.css +++ /dev/null @@ -1,112 +0,0 @@ -html, body, div.wrapper > table -{ - width: 100%; - height: 100%; -} - -body -{ - background-color: #EAEAEA; - font-family: verdana,Geneva,sans-serif; - font-size: 12px; - color: #272727; -} - -a -{ - color: #5353B1; -} - -div.wrapper -{ - position: absolute; top: 24px; left: 0px; right: 0px; bottom: 0px; -} - -div#headbar -{ - background-color: #B2B2B2; - border-bottom: 1px solid #C2C2C2; - height: 24px; - padding: 4px 8px; - box-sizing: border-box; -} - -div#hand -{ - padding: 8px 8px; - padding-bottom: 4px; - background-color: #EAEAEA; - text-align: center; -} - -a.card -{ - display: inline-block; - margin: 0px 2px; - - background-image: url(cards.png); - background-repeat: no-repeat; - width: 94px; - height: 129px; - - box-sizing: border-box; - background-position: 0px 0px; - background-origin: border-box; - - text-decoration: none; - font-size: 0px; -} - -a.card.clubs.ten { background-position: -5px -5px; } -a.card.diamonds.ten { background-position: -109px -5px; } -a.card.hearts.ten { background-position: -213px -5px; } -a.card.spades.ten { background-position: -317px -5px; } -a.card.clubs.two { background-position: -421px -5px; } -a.card.diamonds.two { background-position: -525px -5px; } -a.card.hearts.two { background-position: -629px -5px; } -a.card.spades.two { background-position: -733px -5px; } -a.card.clubs.three { background-position: -5px -144px; } -a.card.diamonds.three { background-position: -109px -144px; } -a.card.hearts.three { background-position: -213px -144px; } -a.card.spades.three { background-position: -317px -144px; } -a.card.clubs.four { background-position: -421px -144px; } -a.card.diamonds.four { background-position: -525px -144px; } -a.card.hearts.four { background-position: -629px -144px; } -a.card.spades.four { background-position: -733px -144px; } -a.card.clubs.five { background-position: -5px -283px; } -a.card.diamonds.five { background-position: -109px -283px; } -a.card.hearts.five { background-position: -213px -283px; } -a.card.spades.five { background-position: -317px -283px; } -a.card.clubs.six { background-position: -421px -283px; } -a.card.diamonds.six { background-position: -525px -283px; } -a.card.hearts.six { background-position: -629px -283px; } -a.card.spades.six { background-position: -733px -283px; } -a.card.clubs.seven { background-position: -5px -422px; } -a.card.diamonds.seven { background-position: -109px -422px; } -a.card.hearts.seven { background-position: -213px -422px; } -a.card.spades.seven { background-position: -317px -422px; } -a.card.clubs.eight { background-position: -421px -422px; } -a.card.diamonds.eight { background-position: -525px -422px; } -a.card.hearts.eight { background-position: -629px -422px; } -a.card.spades.eight { background-position: -733px -422px; } -a.card.clubs.nine { background-position: -5px -561px; } -a.card.diamonds.nine { background-position: -109px -561px; } -a.card.hearts.nine { background-position: -213px -561px; } -a.card.spades.nine { background-position: -317px -561px; } -a.card.clubs.ace { background-position: -421px -561px; } -a.card.diamonds.ace { background-position: -525px -561px; } -a.card.hearts.ace { background-position: -629px -561px; } -a.card.spades.ace { background-position: -733px -561px; } -a.card.clubs.jack { background-position: -5px -700px; } -a.card.diamonds.jack { background-position: -109px -700px; } -a.card.hearts.jack { background-position: -213px -700px; } -a.card.spades.jack { background-position: -317px -700px; } -a.card.clubs.king { background-position: -421px -700px; } -a.card.diamonds.king { background-position: -525px -700px; } -a.card.hearts.king { background-position: -629px -700px; } -a.card.spades.king { background-position: -733px -700px; } -a.card.clubs.queen { background-position: -837px -5px; } -a.card.diamonds.queen { background-position: -837px -144px; } -a.card.hearts.queen { background-position: -837px -283px; } -a.card.spades.queen { background-position: -837px -422px; } -a.card.joker { background-position: -837px -561px; } \ No newline at end of file diff --git a/code/modules/html_interface/cards/cards.dm b/code/modules/html_interface/cards/cards.dm deleted file mode 100644 index 38b851a5fd..0000000000 --- a/code/modules/html_interface/cards/cards.dm +++ /dev/null @@ -1,13 +0,0 @@ -// Used by playing cards; /obj/item/hand -// Subtype exists because of sendResources; these must be sent when the client connects. - -/datum/html_interface/cards/New() - . = ..() - - src.head = src.head + "" - src.updateLayout("
") - -/datum/html_interface/cards/registerResources(var/list/resources = list()) - resources["cards.css"] = 'cards.css' - resources["cards.png"] = 'cards.png' - ..(resources) \ No newline at end of file diff --git a/code/modules/html_interface/cards/cards.png b/code/modules/html_interface/cards/cards.png deleted file mode 100644 index 8001168246..0000000000 Binary files a/code/modules/html_interface/cards/cards.png and /dev/null differ diff --git a/code/modules/html_interface/css/bootstrap.min.css b/code/modules/html_interface/css/bootstrap.min.css deleted file mode 100644 index f3e39a0bff..0000000000 --- a/code/modules/html_interface/css/bootstrap.min.css +++ /dev/null @@ -1,10 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! - * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=979b48f103c9d446c891) - * Config saved to config.json and https://gist.github.com/979b48f103c9d446c891 - *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:240px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:240px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:240px){.container{width:750px}}@media (min-width:600px){.container{width:970px}}@media (min-width:960px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:240px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:600px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:960px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:239px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:240px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:240px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:240px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:240px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:240px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:240px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:240px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:240px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:240px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:240px){.navbar{border-radius:4px}}@media (min-width:240px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:240px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:180px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:240px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:240px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@media (min-width:240px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:240px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:240px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:239px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:240px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:240px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:240px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:239px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:240px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:240px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:239px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:239px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:240px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{color:#777;min-width:30px;background-color:transparent;background-image:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:240px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:600px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:240px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:239px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:239px){.visible-xs-block{display:block !important}}@media (max-width:239px){.visible-xs-inline{display:inline !important}}@media (max-width:239px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:240px) and (max-width:599px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:240px) and (max-width:599px){.visible-sm-block{display:block !important}}@media (min-width:240px) and (max-width:599px){.visible-sm-inline{display:inline !important}}@media (min-width:240px) and (max-width:599px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:600px) and (max-width:959px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:600px) and (max-width:959px){.visible-md-block{display:block !important}}@media (min-width:600px) and (max-width:959px){.visible-md-inline{display:inline !important}}@media (min-width:600px) and (max-width:959px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:960px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:960px){.visible-lg-block{display:block !important}}@media (min-width:960px){.visible-lg-inline{display:inline !important}}@media (min-width:960px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:239px){.hidden-xs{display:none !important}}@media (min-width:240px) and (max-width:599px){.hidden-sm{display:none !important}}@media (min-width:600px) and (max-width:959px){.hidden-md{display:none !important}}@media (min-width:960px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/code/modules/html_interface/css/html_interface.css b/code/modules/html_interface/css/html_interface.css deleted file mode 100644 index 85c07f3b85..0000000000 --- a/code/modules/html_interface/css/html_interface.css +++ /dev/null @@ -1,11 +0,0 @@ -html -{ - -ms-overflow-style: scrollbar; -} - -body -{ - font-family: Arial; - overflow-y: scroll; - overflow-x: auto; -} \ No newline at end of file diff --git a/code/modules/html_interface/html_interface.dm b/code/modules/html_interface/html_interface.dm deleted file mode 100644 index a8b48079fa..0000000000 --- a/code/modules/html_interface/html_interface.dm +++ /dev/null @@ -1,391 +0,0 @@ -/* -Author: NullQuery -Created on: 2014-09-24 - - ** CAUTION - A WORD OF WARNING ** - -If there is no getter or setter available and you aren't extending my code with a sub-type, DO NOT ACCESS VARIABLES DIRECTLY! - -Add a getter/setter instead, even if it does nothing but return or set the variable. Thank you for your patience with me. -NQ - - ** Public API ** - - var/datum/html_interface/hi = new/datum/html_interface(ref, title, width = 700, height = 480, head = "") - -Creates a new HTML interface object with [ref] as the object and [title] as the initial title of the page. [width] and [height] is the initial width and height -of the window. The text in [head] is added just before the end tag. - - hi.setTitle(title) - -Changes the title of the page. - - hi.getTitle() - -Returns the current title of the page. - - hi.updateLayout(layout) - -Updates the overall layout of the page (the HTML code between the body tags). - -This should be used sparingly. - - hi.updateContent(id, content, ignore_cache = FALSE) - -Updates a portion of the page, i.e., the DOM element with the appropriate ID. The contents of the element are replaced with the provided HTML. - -The content is cached on the server-side to minimize network traffic when the client "should have" the same HTML. The client may not have -the same HTML if scripts cause the content to change. In this case set the ignore_cache parameter. - - hi.executeJavaScript(jscript, client = null) - -Executes Javascript on the browser. - -The client is optional and may be a /mob, /client or /html_interface_client object. If not specified the code is executed on all clients. - - hi.show(client) - -Shows the HTML interface to the provided client. This will create a window, apply the current layout and contents. It will then wait for events. - - hi.hide(client) - -Hides the HTML interface from the provided client. This will close the browser window. - - hi.isUsed() - -Returns TRUE if the interface is being used (has an active client) or FALSE if not. - - hi.closeAll() - -Closes the interface on all clients. - - ** Additional notes ** - -When working with byond:// links make sure to reference the HTML interface object and NOT the original object. Topic() will still be called on -your object, but it will pass through the HTML interface first allowing interception at a higher level. - -If you want to use custom resources(images/css/js) with an existing interface: -You have to use modules/client/asset_cache to ensure they get sent BEFORE the interface opens - - ** Sample code ** - -/mob/var/datum/html_interface/hi - -/mob/verb/test() - if (!hi) - hi = new/datum/html_interface(src, "[src.key]") - - hi.updateLayout("
") - hi.updateContent("content", "

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

") - - hi.show(src) - -*/ - -GLOBAL_LIST_EMPTY(html_interfaces) - -/datum/html_interface - // The atom we should report to. - var/atom/ref - - // The current title of the browser window. - var/title - - // A list of content elements that have been changed. This is necessary when showing the browser control to new clients. - var/list/content_elements = new/list() - - // The HTML layout, typically what's in-between the tag. May be overridden by extensions. - var/layout - - // An associative list of clients currently viewing this screen. The key is the /client object, the value is the /datum/html_interface_client object. - var/list/clients - - // This goes just before the closing HEAD tag. I haven't exposed any getters/setters for it because it's only being used by extensions. - var/head = "" - - // The initial width of the browser control, used when the window is first shown to a client. - var/width - - // The initial height of the browser control, used when the window is first shown to a client. - var/height - - // A type associated list of assets the interface needs. - //Sent to the client when the interface opens on the client for the first time. - var/static/list/asset_list - -/datum/html_interface/New(atom/ref, title, width = 700, height = 480, head = "") - GLOB.html_interfaces.Add(src) - - . = ..() - - src.ref = ref - src.title = title - src.width = width - src.height = height - src.head = head - -/datum/html_interface/Destroy() - src.closeAll() - - GLOB.html_interfaces.Remove(src) - - return ..() - -/* * Hooks */ -/datum/html_interface/proc/specificRenderTitle(datum/html_interface_client/hclient, ignore_cache = FALSE) - -//if you need to override this, either call ..() or add your resources to asset_list -/datum/html_interface/proc/registerResources(var/list/resources = list()) - resources["jquery.min.js"] = 'js/jquery.min.js' - resources["bootstrap.min.js"] = 'js/bootstrap.min.js' - resources["bootstrap.min.css"] = 'css/bootstrap.min.css' - resources["html_interface.css"] = 'css/html_interface.css' - resources["html_interface.js"] = 'js/html_interface.js' - var/assetlist = list() - for (var/R in resources) - register_asset(R,resources[R]) - assetlist += R - if (!asset_list) - asset_list = list() - asset_list[type] = assetlist - -/datum/html_interface/proc/createWindow(datum/html_interface_client/hclient) - winclone(hclient.client, "window", "browser_[REF(src)]") - - var/list/params = list( - "size" = "[width]x[height]", - "statusbar" = "false", - "on-close" = "byond://?src=[REF(src)]&html_interface_action=onclose" - ) - - if (hclient.client.hi_last_pos) - params["pos"] = "[hclient.client.hi_last_pos]" - - winset(hclient.client, "browser_[REF(src)]", list2params(params)) - - winset(hclient.client, "browser_[REF(src)].browser", list2params(list("parent" = "browser_[REF(src)]", "type" = "browser", "pos" = "0,0", "size" = "[width]x[height]", "anchor1" = "0,0", "anchor2" = "100,100", "use-title" = "true", "auto-format" = "false"))) - -/* * Public API */ -/datum/html_interface/proc/getTitle() - return src.title - -/datum/html_interface/proc/setTitle(title, ignore_cache = FALSE) - src.title = title - - var/datum/html_interface_client/hclient - - for (var/client in src.clients) - hclient = src._getClient(src.clients[client]) - - if (hclient && hclient.active) - src._renderTitle(src.clients[client], ignore_cache) - -/datum/html_interface/proc/executeJavaScript(jscript, datum/html_interface_client/hclient = null) - if (hclient) - hclient = getClient(hclient) - - if (istype(hclient)) - if (hclient.is_loaded) - hclient.client << output(list2params(list(jscript)), "browser_[REF(src)].browser:eval") - else - for (var/client in src.clients) - if(src.clients[client]) - src.executeJavaScript(jscript, src.clients[client]) - -/datum/html_interface/proc/callJavaScript(func, list/arguments, datum/html_interface_client/hclient = null) - if (!arguments) - arguments = new/list() - - if (hclient) - hclient = getClient(hclient) - - if (istype(hclient)) - if (hclient.is_loaded) - hclient.client << output(list2params(arguments), "browser_[REF(src)].browser:[func]") - else - for (var/client in src.clients) - if (src.clients[client]) - src.callJavaScript(func, arguments, src.clients[client]) - -/datum/html_interface/proc/updateLayout(layout) - src.layout = layout - - var/datum/html_interface_client/hclient - - for (var/client in src.clients) - hclient = src._getClient(src.clients[client]) - - if (hclient && hclient.active) - src._renderLayout(hclient) - -/datum/html_interface/proc/updateContent(id, content, ignore_cache = FALSE) - src.content_elements[id] = content - - var/datum/html_interface_client/hclient - - for (var/client in src.clients) - hclient = src._getClient(src.clients[client]) - - if (hclient && hclient.active) - spawn (-1) src._renderContent(id, hclient, ignore_cache) - -/datum/html_interface/proc/show(datum/html_interface_client/hclient) - hclient = getClient(hclient, TRUE) - - if (istype(hclient)) - if ((type in asset_list) && islist(asset_list[type])) - send_asset_list(hclient.client, asset_list[type], TRUE) - - if (!winexists(hclient.client, "browser_[REF(src)]")) - src.createWindow(hclient) - //src._renderTitle(hclient, TRUE) - //src._renderLayout(hclient) - - hclient.is_loaded = FALSE - hclient.client << output(replacetextEx(replacetextEx(file2text('html_interface.html'), "\[hsrc\]", "[REF(src)]"), "", "[head]"), "browser_[REF(src)].browser") - - winshow(hclient.client, "browser_[REF(src)]", TRUE) - - while (hclient.client && hclient.active && !hclient.is_loaded) - sleep(2) - -/datum/html_interface/proc/hide(datum/html_interface_client/hclient) - hclient = getClient(hclient) - - if (istype(hclient)) - if (src.clients) - src.clients.Remove(hclient.client) - - if (!src.clients.len) - src.clients = null - - hclient.client.hi_last_pos = winget(hclient.client, "browser_[REF(src)]" ,"pos") - - winshow(hclient.client, "browser_[REF(src)]", FALSE) - winset(hclient.client, "browser_[REF(src)]", "parent=none") - - if (hascall(src.ref, "hiOnHide")) - call(src.ref, "hiOnHide")(hclient) - -// Convert a /mob to /client, and /client to /datum/html_interface_client -/datum/html_interface/proc/getClient(client, create_if_not_exist = FALSE) - if (istype(client, /datum/html_interface_client)) - return src._getClient(client) - else if (ismob(client)) - var/mob/mob = client - client = mob.client - - if (istype(client, /client)) - if (create_if_not_exist && (!src.clients || !(client in src.clients))) - if (!src.clients) - src.clients = new/list() - if (!(client in src.clients)) - src.clients[client] = new/datum/html_interface_client(client) - - if (src.clients && (client in src.clients)) - return src._getClient(src.clients[client]) - else - return null - else - return null - -/datum/html_interface/proc/enableFor(datum/html_interface_client/hclient) - hclient.active = TRUE - - src.show(hclient) - -/datum/html_interface/proc/disableFor(datum/html_interface_client/hclient) - hclient.active = FALSE - -/datum/html_interface/proc/isUsed() - if (src.clients && src.clients.len > 0) - var/datum/html_interface_client/hclient - - for (var/key in clients) - hclient = _getClient(clients[key]) - - if (hclient) - if (hclient.active) - return TRUE - else - clients.Remove(key) - - return FALSE - -/datum/html_interface/proc/closeAll() - if (src.clients) - for (var/client in src.clients) - src.hide(src.clients[client]) - -/* * Danger Zone */ - -/datum/html_interface/proc/_getClient(datum/html_interface_client/hclient) - if (hclient) - if (hclient.client) - // res = if the client has been active in the past 10 minutes and the client is allowed to view the object (context-sensitive). - var/res = hclient.client.inactivity <= 6000 && (hascall(src.ref, "hiIsValidClient") ? call(src.ref, "hiIsValidClient")(hclient, src) : TRUE) - - if (res) - if (!hclient.active) src.enableFor(hclient) - else - if (hclient.active) src.disableFor(hclient) - - return hclient - else - return null - else - return null - -/datum/html_interface/proc/_renderTitle(datum/html_interface_client/hclient, ignore_cache = FALSE, ignore_loaded = FALSE) - if (hclient && (ignore_loaded || hclient.is_loaded)) - // Only render if we have new content. - - if (ignore_cache || src.title != hclient.title) - hclient.title = title - - src.specificRenderTitle(hclient) - - hclient.client << output(list2params(list(title)), "browser_[REF(src)].browser:setTitle") - -/datum/html_interface/proc/_renderLayout(datum/html_interface_client/hclient, ignore_loaded = FALSE) - if (hclient && (ignore_loaded || hclient.is_loaded)) - var/html = src.layout - - // Only render if we have new content. - if (html != hclient.layout) - hclient.layout = html - - hclient.client << output(list2params(list(html)), "browser_[REF(src)].browser:updateLayout") - - for (var/id in src.content_elements) - src._renderContent(id, hclient, ignore_loaded = ignore_loaded) - -/datum/html_interface/proc/_renderContent(id, datum/html_interface_client/hclient, ignore_cache = FALSE, ignore_loaded = FALSE) - if (hclient && (ignore_loaded || hclient.is_loaded)) - var/html = src.content_elements[id] - - // Only render if we have new content. - if (ignore_cache || !(id in hclient.content_elements) || html != hclient.content_elements[id]) - hclient.content_elements[id] = html - - hclient.client << output(list2params(list(id, html)), "browser_[REF(src)].browser:updateContent") - -/datum/html_interface/Topic(href, href_list[]) - var/datum/html_interface_client/hclient = getClient(usr.client) - - if (istype(hclient)) - if ("html_interface_action" in href_list) - switch (href_list["html_interface_action"]) - - if ("onload") - hclient.layout = null - hclient.content_elements.len = 0 - - src._renderTitle(hclient, TRUE, TRUE) - src._renderLayout(hclient, TRUE) - - hclient.is_loaded = TRUE - - if ("onclose") - src.hide(hclient) - else if (src.ref && hclient.active) - src.ref.Topic(href, href_list, hclient) \ No newline at end of file diff --git a/code/modules/html_interface/html_interface.html b/code/modules/html_interface/html_interface.html deleted file mode 100644 index 4bf76c6180..0000000000 --- a/code/modules/html_interface/html_interface.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/code/modules/html_interface/html_interface_client.dm b/code/modules/html_interface/html_interface_client.dm deleted file mode 100644 index b9bac9b4d3..0000000000 --- a/code/modules/html_interface/html_interface_client.dm +++ /dev/null @@ -1,46 +0,0 @@ -/datum/html_interface_client - // The /client object represented by this model. - var/client/client - - // The layout currently visible to the client. - var/layout - - // The content elements (mirrored from /datum/html_interface) currently visible to the client. - var/list/content_elements = new/list() - - // The current title for this client - var/title - - // TRUE if the browser control has loaded and will accept input, FALSE if not. - var/is_loaded = FALSE - - // TRUE if this client should receive updates, FALSE if not. - var/active = TRUE - - // A list of extra variables, for use by extensions. - var/list/extra_vars - -/datum/html_interface_client/New(client/client) - . = ..() - - src.client = client - -/datum/html_interface_client/proc/putExtraVar(key, value) - if (!src.extra_vars) - src.extra_vars = new/list() - src.extra_vars[key] = value - -/datum/html_interface_client/proc/removeExtraVar(key) - if (src.extra_vars) - . = src.extra_vars[key] - - src.extra_vars.Remove(key) - - if (!src.extra_vars.len) - src.extra_vars = null - - return . - -/datum/html_interface_client/proc/getExtraVar(key) - if (src.extra_vars) - return src.extra_vars[key] \ No newline at end of file diff --git a/code/modules/html_interface/js/bootstrap.min.js b/code/modules/html_interface/js/bootstrap.min.js deleted file mode 100644 index e33d8a5324..0000000000 --- a/code/modules/html_interface/js/bootstrap.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! - * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=d0f6f16a67c7502ee009) - * Config saved to config.json and https://gist.github.com/d0f6f16a67c7502ee009 - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),s=i.data("bs.alert");s||i.data("bs.alert",s=new o(this)),"string"==typeof e&&s[e].call(i)})}var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.2.0",o.prototype.close=function(e){function i(){n.detach().trigger("closed.bs.alert").remove()}var o=t(this),s=o.attr("data-target");s||(s=o.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var n=t(s);e&&e.preventDefault(),n.length||(n=o.hasClass("alert")?o:o.parent()),n.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(n.removeClass("in"),t.support.transition&&n.hasClass("fade")?n.one("bsTransitionEnd",i).emulateTransitionEnd(150):i())};var s=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=s,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.button"),n="object"==typeof e&&e;s||o.data("bs.button",s=new i(this,n)),"toggle"==e?s.toggle():e&&s.setState(e)})}var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.isLoading=!1};i.VERSION="3.2.0",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",o=this.$element,s=o.is("input")?"val":"html",n=o.data();e+="Text",null==n.resetText&&o.data("resetText",o[s]()),o[s](null==n[e]?this.options[e]:n[e]),setTimeout(t.proxy(function(){"loadingText"==e?(this.isLoading=!0,o.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,o.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")&&(i.prop("checked")&&this.$element.hasClass("active")?t=!1:e.find(".active").removeClass("active")),t&&i.prop("checked",!this.$element.hasClass("active")).trigger("change")}t&&this.$element.toggleClass("active")};var o=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=o,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var o=t(i.target);o.hasClass("btn")||(o=o.closest(".btn")),e.call(o,"toggle"),i.preventDefault()})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),s=o.data("bs.carousel"),n=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e),r="string"==typeof e?e:n.slide;s||o.data("bs.carousel",s=new i(this,n)),"number"==typeof e?s.to(e):r?s[r]():n.interval&&s.pause().cycle()})}var i=function(e,i){this.$element=t(e).on("keydown.bs.carousel",t.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.2.0",i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},i.prototype.keydown=function(t){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.to=function(e){var i=this,o=this.getItemIndex(this.$active=this.$element.find(".item.active"));return e>this.$items.length-1||0>e?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){i.to(e)}):o==e?this.pause().cycle():this.slide(e>o?"next":"prev",t(this.$items[e]))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){return this.sliding?void 0:this.slide("next")},i.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},i.prototype.slide=function(e,i){var o=this.$element.find(".item.active"),s=i||o[e](),n=this.interval,r="next"==e?"left":"right",a="next"==e?"first":"last",l=this;if(!s.length){if(!this.options.wrap)return;s=this.$element.find(".item")[a]()}if(s.hasClass("active"))return this.sliding=!1;var h=s[0],p=t.Event("slide.bs.carousel",{relatedTarget:h,direction:r});if(this.$element.trigger(p),!p.isDefaultPrevented()){if(this.sliding=!0,n&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var c=t(this.$indicators.children()[this.getItemIndex(s)]);c&&c.addClass("active")}var d=t.Event("slid.bs.carousel",{relatedTarget:h,direction:r});return t.support.transition&&this.$element.hasClass("slide")?(s.addClass(e),s[0].offsetWidth,o.addClass(r),s.addClass(r),o.one("bsTransitionEnd",function(){s.removeClass([e,r].join(" ")).addClass("active"),o.removeClass(["active",r].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(d)},0)}).emulateTransitionEnd(1e3*o.css("transition-duration").slice(0,-1))):(o.removeClass("active"),s.addClass("active"),this.sliding=!1,this.$element.trigger(d)),n&&this.cycle(),this}};var o=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=o,this},t(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(i){var o,s=t(this),n=t(s.attr("data-target")||(o=s.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""));if(n.hasClass("carousel")){var r=t.extend({},n.data(),s.data()),a=s.attr("data-slide-to");a&&(r.interval=!1),e.call(n,r),a&&n.data("bs.carousel").to(a),i.preventDefault()}}),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),+function(t){"use strict";function e(e){e&&3===e.which||(t(s).remove(),t(n).each(function(){var o=i(t(this)),s={relatedTarget:this};o.hasClass("open")&&(o.trigger(e=t.Event("hide.bs.dropdown",s)),e.isDefaultPrevented()||o.removeClass("open").trigger("hidden.bs.dropdown",s))}))}function i(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new r(this)),"string"==typeof e&&o[e].call(i)})}var s=".dropdown-backdrop",n='[data-toggle="dropdown"]',r=function(e){t(e).on("click.bs.dropdown",this.toggle)};r.VERSION="3.2.0",r.prototype.toggle=function(o){var s=t(this);if(!s.is(".disabled, :disabled")){var n=i(s),r=n.hasClass("open");if(e(),!r){"ontouchstart"in document.documentElement&&!n.closest(".navbar-nav").length&&t('