diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 6651f68556..cf57668e21 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -236,7 +236,7 @@
return FALSE
if(cooldown > world.time)
if(!CM.active)
- owner << "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target! "
+ to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target! ")
return FALSE
return ..()
diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm
index 5c1bdf37e6..40b0f02360 100644
--- a/code/game/gamemodes/gang/gang_pen.dm
+++ b/code/game/gamemodes/gang/gang_pen.dm
@@ -66,4 +66,4 @@
cooldown = 0
icon_state = "pen"
var/mob/M = get(src, /mob)
- to_chat(M, "[bicon(src)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again. ")
+ to_chat(M, "[bicon(src)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again. ")
diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm
index 22fc4208c5..7c7f75a22a 100644
--- a/code/game/gamemodes/gang/recaller.dm
+++ b/code/game/gamemodes/gang/recaller.dm
@@ -179,35 +179,35 @@
gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.")
recalling = 1
- to_chat(loc, "\icon[src]Generating shuttle recall order with codes retrieved from last call signal... ")
+ to_chat(loc, "[bicon(src)]Generating shuttle recall order with codes retrieved from last call signal... ")
sleep(rand(100,300))
if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station
- to_chat(user, "\icon[src]Emergency shuttle cannot be recalled at this time. ")
+ to_chat(user, "[bicon(src)]Emergency shuttle cannot be recalled at this time. ")
recalling = 0
return 0
- to_chat(loc, "\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays... ")
+ to_chat(loc, "[bicon(src)]Shuttle recall order generated. Accessing station long-range communication arrays... ")
sleep(rand(100,300))
if(!gang.dom_attempts)
- to_chat(user, "\icon[src]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts. ")
+ to_chat(user, "[bicon(src)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts. ")
recalling = 0
return 0
var/turf/userturf = get_turf(user)
if(userturf.z != ZLEVEL_STATION) //Shuttle can only be recalled while on station
- to_chat(user, "\icon[src]Error: Device out of range of station communication arrays. ")
+ to_chat(user, "[\bicon(src)]Error: Device out of range of station communication arrays. ")
recalling = 0
return 0
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
if((100 * GLOB.start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged
- to_chat(user, "\icon[src]Error: Station communication systems compromised. Unable to establish connection. ")
+ to_chat(user, "[bicon(src)]Error: Station communication systems compromised. Unable to establish connection. ")
recalling = 0
return 0
- to_chat(loc, "\icon[src]Comm arrays accessed. Broadcasting recall signal... ")
+ to_chat(loc, "[bicon(src)]Comm arrays accessed. Broadcasting recall signal... ")
sleep(rand(100,300))
@@ -220,7 +220,7 @@
gang.recalls -= 1
return 1
- to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time. ")
+ to_chat(loc, "[bicon(src)]No response recieved. Emergency shuttle cannot be recalled at this time. ")
return 0
/obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 7f8eb32648..41b2fb3cf2 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -413,26 +413,26 @@
customrecepient.tnote += "← From [customsender] ([customjob]): [custommessage] "
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
- customrecepient.audible_message("\icon[customrecepient] *[customrecepient.ttone]*", null, 3)
+ customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3)
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
- to_chat(H, "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply )")
+ to_chat(H, "[bicon(customrecepient)] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply )")
log_pda("[usr]/([usr.ckey]) (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
customrecepient.cut_overlays()
- customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
+ customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
//Sender is faking as someone who exists
else
src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
customrecepient.tnote += "← From [PDARec.owner] ([customjob]): [custommessage] "
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
- customrecepient.audible_message("\icon[customrecepient] *[customrecepient.ttone]*", null, 3)
+ customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3)
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
- to_chat(H, "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply )")
+ to_chat(H, "[bicon(customrecepient)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply )")
log_pda("[usr]/([usr.ckey]) (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
customrecepient.cut_overlays()
- customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
+ customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
//Finally..
ResetMessage()
@@ -455,16 +455,16 @@
name = "monitor decryption key"
var/obj/machinery/message_server/server = null
-/obj/item/weapon/paper/monitorkey/Initialize()
+/obj/item/weapon/paper/monitorkey/Initialize()
..()
- return INITIALIZE_HINT_LATELOAD
-
-/obj/item/weapon/paper/monitorkey/LateInitialize()
- if(GLOB.message_servers)
- for(var/obj/machinery/message_server/server in GLOB.message_servers)
- if(!isnull(server))
- if(!isnull(server.decryptkey))
- info = "
Daily Key Reset The new message monitor key is '[server.decryptkey]'. Please keep this a secret and away from the clown. If necessary, change the password to a more secure one."
- info_links = info
- add_overlay("paper_words")
- break
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/item/weapon/paper/monitorkey/LateInitialize()
+ if(GLOB.message_servers)
+ for(var/obj/machinery/message_server/server in GLOB.message_servers)
+ if(!isnull(server))
+ if(!isnull(server.decryptkey))
+ info = "Daily Key Reset The new message monitor key is '[server.decryptkey]'. Please keep this a secret and away from the clown. If necessary, change the password to a more secure one."
+ info_links = info
+ add_overlay("paper_words")
+ break
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index c60fde8aaa..54afadb8f6 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -51,7 +51,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/obj/item/device/paicard/pai = null // A slot for a personal AI device
- var/icon/photo //Scanned photo
+ var/icon/photo //Scanned photo
var/list/contained_item = list(/obj/item/weapon/pen, /obj/item/toy/crayon, /obj/item/weapon/lipstick, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/cigarette)
var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above.
@@ -82,24 +82,24 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/device/pda/update_icon()
cut_overlays()
- var/mutable_appearance/overlay = new()
- overlay.pixel_x = overlays_x_offset
+ var/mutable_appearance/overlay = new()
+ overlay.pixel_x = overlays_x_offset
if(id)
- overlay.icon_state = "id_overlay"
- add_overlay(new /mutable_appearance(overlay))
+ overlay.icon_state = "id_overlay"
+ add_overlay(new /mutable_appearance(overlay))
if(inserted_item)
- overlay.icon_state = "insert_overlay"
- add_overlay(new /mutable_appearance(overlay))
+ overlay.icon_state = "insert_overlay"
+ add_overlay(new /mutable_appearance(overlay))
if(fon)
- overlay.icon_state = "light_overlay"
- add_overlay(new /mutable_appearance(overlay))
+ overlay.icon_state = "light_overlay"
+ add_overlay(new /mutable_appearance(overlay))
if(pai)
if(pai.pai)
- overlay.icon_state = "pai_overlay"
- add_overlay(new /mutable_appearance(overlay))
+ overlay.icon_state = "pai_overlay"
+ add_overlay(new /mutable_appearance(overlay))
else
- overlay.icon_state = "pai_off_overlay"
- add_overlay(new /mutable_appearance(overlay))
+ overlay.icon_state = "pai_off_overlay"
+ add_overlay(new /mutable_appearance(overlay))
/obj/item/device/pda/MouseDrop(obj/over_object, src_location, over_location)
var/mob/M = usr
@@ -622,7 +622,7 @@ GLOBAL_LIST_EMPTY(PDAs)
if (!silent)
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
- audible_message("[bicon(src)] *[ttone]*", null, 3)
+ audible_message("[bicon(src)] *[ttone]*", null, 3)
//Search for holder of the PDA.
var/mob/living/L = null
if(loc && isliving(loc))
@@ -632,17 +632,17 @@ GLOBAL_LIST_EMPTY(PDAs)
L = get(src, /mob/living/silicon)
if(L && L.stat != UNCONSCIOUS)
-
- var/hrefstart
- var/hrefend
- if (isAI(L))
- hrefstart = ""
- hrefend = " "
-
- to_chat(L, "\icon[src.icon] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply )")
+
+ var/hrefstart
+ var/hrefend
+ if (isAI(L))
+ hrefstart = ""
+ hrefend = " "
+
+ to_chat(L, "[\bicon(src)] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply )")
update_icon()
- add_overlay(icon_alert)
+ add_overlay(icon_alert)
/obj/item/device/pda/proc/show_to_ghosts(mob/living/user, datum/data_pda_msg/msg,multiple = 0)
for(var/mob/M in GLOB.player_list)
@@ -897,9 +897,9 @@ GLOBAL_LIST_EMPTY(PDAs)
if(T)
T.hotspot_expose(700,125)
if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
- explosion(T, -1, 1, 3, 4)
+ explosion(T, -1, 1, 3, 4)
else
- explosion(T, -1, -1, 2, 3)
+ explosion(T, -1, -1, 2, 3)
qdel(src)
return
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 143e6dabbe..d5eead74f0 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -92,15 +92,15 @@
if(mapload && access_txt)
access = text2access(access_txt)
-/obj/item/weapon/card/id/vv_edit_var(var_name, var_value)
- . = ..()
- if(.)
- switch(var_name)
- if("assignment","registered_name")
- update_label()
-
+/obj/item/weapon/card/id/vv_edit_var(var_name, var_value)
+ . = ..()
+ if(.)
+ switch(var_name)
+ if("assignment","registered_name")
+ update_label()
+
/obj/item/weapon/card/id/attack_self(mob/user)
- user.visible_message("[user] shows you: \icon[src] [src.name]. ", \
+ user.visible_message("[user] shows you: [bicon(src)] [src.name]. ", \
"You show \the [src.name]. ")
src.add_fingerprint(user)
return
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 5a1caafc43..d083624909 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -17,23 +17,23 @@
if(src.client.handle_spam_prevention(msg,MUTE_PRAY))
return
- var/mutable_appearance/cross = mutable_appearance('icons/obj/storage.dmi', "bible")
+ var/mutable_appearance/cross = mutable_appearance('icons/obj/storage.dmi', "bible")
var/font_color = "purple"
var/prayer_type = "PRAYER"
var/deity
if(usr.job == "Chaplain")
- cross.icon_state = "kingyellow"
+ cross.icon_state = "kingyellow"
font_color = "blue"
prayer_type = "CHAPLAIN PRAYER"
if(SSreligion.deity)
deity = SSreligion.deity
else if(iscultist(usr))
- cross.icon_state = "tome"
+ cross.icon_state = "tome"
font_color = "red"
prayer_type = "CULTIST PRAYER"
deity = "Nar-Sie"
- msg = "\icon[cross][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg] "
+ msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg] "
for(var/client/C in GLOB.admins)
if(C.prefs.chat_toggles & CHAT_PRAYER)
@@ -43,7 +43,7 @@
C << 'sound/effects/pray.ogg'
to_chat(usr, "Your prayers have been received by the gods.")
- SSblackbox.add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
/proc/Centcomm_announce(text , mob/Sender)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 2073645e73..932be0abba 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -244,6 +244,8 @@ GLOBAL_LIST(external_rsc_urls)
. = ..() //calls mob.Login()
+ chatOutput.start() // Starts the chat
+
if(alert_mob_dupe_login)
set waitfor = FALSE
alert(mob, "You have logged in already with another key this round, please log out of this one NOW or risk being banned!")
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
new file mode 100644
index 0000000000..d928397728
--- /dev/null
+++ b/code/modules/goonchat/browserOutput.dm
@@ -0,0 +1,289 @@
+/*********************************
+For the main html chat area
+*********************************/
+
+//Precaching a bunch of shit
+GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of icons for the browser output
+
+//On client, created on login
+/datum/chatOutput
+ var/client/owner //client ref
+ var/loaded = FALSE // Has the client loaded the browser output area?
+ var/list/messageQueue //If they haven't loaded chat, this is where messages will go until they do
+ var/cookieSent = FALSE // Has the client sent a cookie for analysis
+ var/list/connectionHistory //Contains the connection history passed from chat cookie
+ var/broken = FALSE
+
+/datum/chatOutput/New(client/C)
+ owner = C
+ messageQueue = list()
+ connectionHistory = list()
+ // log_world("chatOutput: New()")
+
+/datum/chatOutput/proc/start()
+ //Check for existing chat
+ if(!owner)
+ return FALSE
+
+ if(!winexists(owner, "browseroutput")) // Oh goddamnit.
+ alert(owner.mob, "Updated chat window does not exist. If you are using a custom skin file please allow the game to update.")
+ broken = TRUE
+ return FALSE
+
+ if(winget(owner, "browseroutput", "is-disabled") == "false") //Already setup
+ doneLoading()
+
+ else //Not setup
+ load()
+
+ return TRUE
+
+/datum/chatOutput/proc/load()
+ set waitfor = FALSE
+ if(!owner)
+ return
+
+ var/static/list/chatResources = list(
+ "code/modules/html_interface/js/jquery.min.js",
+ "goon/browserassets/js/json2.min.js",
+ "goon/browserassets/js/browserOutput.js",
+ "tgui/assets/fonts/fontawesome-webfont.eot",
+ "tgui/assets/fonts/fontawesome-webfont.svg",
+ "tgui/assets/fonts/fontawesome-webfont.ttf",
+ "tgui/assets/fonts/fontawesome-webfont.woff",
+ "goon/browserassets/css/font-awesome.css",
+ "goon/browserassets/css/browserOutput.css"
+ )
+
+ // to_chat(world.log, "chatOutput: load()")
+ for(var/attempts in 1 to 5)
+ for(var/asset in chatResources)
+ owner << browse_rsc(file(asset))
+
+ //log_world("Sending main chat window to client [owner.ckey]")
+ owner << browse(file("goon/browserassets/html/browserOutput.html"), "window=browseroutput")
+ sleep(14 + (chatResources.len * 7))
+ if(!owner || loaded)
+ break
+
+ if(owner && !loaded)
+ doneLoading() // try doing this manually
+ CRASH("[owner] failed to load chat. Attempting doneLoading() manually")
+ // log_world("chatOutput: [owner.ckey] load() completed")
+
+/datum/chatOutput/Topic(href, list/href_list)
+ if(usr.client != owner)
+ return TRUE
+
+ // Build arguments.
+ // Arguments are in the form "param[paramname]=thing"
+ var/list/params = list()
+ for(var/key in href_list)
+ if(length(key) > 7 && findtext(key, "param")) // 7 is the amount of characters in the basic param key template.
+ var/param_name = copytext(key, 7, -1)
+ var/item = href_list[key]
+
+ params[param_name] = item
+
+ var/data // Data to be sent back to the chat.
+ switch(href_list["proc"])
+ if("doneLoading")
+ data = doneLoading(arglist(params))
+
+ if("debug")
+ data = debug(arglist(params))
+
+ if("ping")
+ data = ping(arglist(params))
+
+ if("analyzeClientData")
+ data = analyzeClientData(arglist(params))
+
+ if(data)
+ ehjax_send(data = data)
+
+//Called on chat output done-loading by JS.
+/datum/chatOutput/proc/doneLoading()
+ if(loaded)
+ return
+
+ loaded = TRUE
+ winset(owner, "browseroutput", "is-disabled=false")
+ for(var/message in messageQueue)
+ to_chat(owner, message)
+
+ messageQueue = null
+ sendClientData()
+
+ pingLoop()
+
+/datum/chatOutput/proc/pingLoop()
+ set waitfor = FALSE
+
+ while (owner)
+ ehjax_send(data = owner.is_afk(29) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang.
+ sleep(30)
+
+/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data)
+ if(islist(data))
+ data = json_encode(data)
+ C << output("[data]", "[window]:ehjaxCallback")
+
+//Sends client connection details to the chat to handle and save
+/datum/chatOutput/proc/sendClientData()
+ //Get dem deets
+ var/list/deets = list("clientData" = list())
+ deets["clientData"]["ckey"] = owner.ckey
+ deets["clientData"]["ip"] = owner.address
+ deets["clientData"]["compid"] = owner.computer_id
+ var/data = json_encode(deets)
+ ehjax_send(data = data)
+
+//Called by client, sent data to investigate (cookie history so far)
+/datum/chatOutput/proc/analyzeClientData(cookie = "")
+ if(!cookie)
+ return
+
+ if(cookie != "none")
+ var/list/connData = json_decode(cookie)
+ if (connData && islist(connData) && connData.len > 0 && connData["connData"])
+ connectionHistory = connData["connData"] //lol fuck
+ var/list/found = new()
+ for(var/i in connectionHistory.len to 1 step -1)
+ var/list/row = src.connectionHistory[i]
+ if (!row || row.len < 3 || (!row["ckey"] && !row["compid"] && !row["ip"])) //Passed malformed history object
+ return
+ if (world.IsBanned(row["ckey"], row["compid"], row["ip"]))
+ found = row
+ break
+
+ //Uh oh this fucker has a history of playing on a banned account!!
+ if (found.len > 0)
+ //TODO: add a new evasion ban for the CURRENT client details, using the matched row details
+ message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
+ log_admin("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
+
+ cookieSent = TRUE
+
+//Called by js client every 60 seconds
+/datum/chatOutput/proc/ping()
+ return "pong"
+
+//Called by js client on js error
+/datum/chatOutput/proc/debug(error)
+ log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]")
+
+#ifdef TESTING
+/client/verb/debug_chat()
+ set hidden = TRUE
+ chatOutput.ehjax_send(data = list("firebug" = TRUE))
+#endif
+//Global chat procs
+
+GLOBAL_LIST_EMPTY(bicon_cache)
+
+//Converts an icon to base64. Operates by putting the icon in the iconCache savefile,
+// exporting it as text, and then parsing the base64 from that.
+// (This relies on byond automatically storing icons in savefiles as base64)
+/proc/icon2base64(icon/icon, iconKey = "misc")
+ if (!isicon(icon))
+ return FALSE
+ GLOB.iconCache[iconKey] << icon
+ var/iconData = GLOB.iconCache.ExportText(iconKey)
+ var/list/partial = splittext(iconData, "{")
+ return replacetext(copytext(partial[2], 3, -5), "\n", "")
+
+/proc/bicon(obj)
+ if (!obj)
+ return
+
+ if (isicon(obj))
+ //Icons get pooled constantly, references are no good here.
+ /*if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it.
+ bicon_cache["\ref[obj]"] = icon2base64(obj)
+ return " "*/
+ return " "
+
+ // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
+ var/atom/A = obj
+ var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]"
+ if (!GLOB.bicon_cache[key]) // Doesn't exist, make it.
+ var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1)
+ if (ishuman(obj)) // Shitty workaround for a BYOND issue.
+ var/icon/temp = I
+ I = icon()
+ I.Insert(temp, dir = SOUTH)
+ GLOB.bicon_cache[key] = icon2base64(I, key)
+
+ return " "
+
+//Costlier version of bicon() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs.
+/proc/costly_bicon(obj)
+ if (!obj)
+ return
+
+ if (isicon(obj))
+ return bicon(obj)
+
+ var/icon/I = getFlatIcon(obj)
+ return bicon(I)
+
+/proc/to_chat(target, message)
+ if(isnull(target))
+ return
+ //Ok so I did my best but I accept that some calls to this will be for shit like sound and images
+ //It stands that we PROBABLY don't want to output those to the browser output so just handle them here
+ if (istype(message, /image) || istype(message, /sound) || istype(target, /savefile) || !(ismob(target) || islist(target) || istype(target, /client) || istype(target, /datum/log) || target == world))
+ target << message
+ if (!istype(target, /atom)) // Really easy to mix these up, and not having to make sure things are mobs makes the code cleaner.
+ CRASH("DEBUG: Boutput called with invalid message")
+ return
+
+ //Otherwise, we're good to throw it at the user
+ else if (istext(message))
+ if (istext(target))
+ return
+
+ //Some macros remain in the string even after parsing and fuck up the eventual output
+ if (findtext(message, "\improper"))
+ message = replacetext(message, "\improper", "")
+ if (findtext(message, "\proper"))
+ message = replacetext(message, "\proper", "")
+
+ //Grab us a client if possible
+ var/client/C = grab_client(target)
+
+ if (C && C.chatOutput)
+ if(C.chatOutput.broken) // A player who hasn't updated his skin file.
+ to_chat(C, message)
+ return TRUE
+ if(!C.chatOutput.loaded && C.chatOutput.messageQueue && islist(C.chatOutput.messageQueue))
+ //Client sucks at loading things, put their messages in a queue
+ C.chatOutput.messageQueue.Add(message)
+ return
+
+ if(istype(target, /datum/log))
+ var/datum/log/L = target
+ L.log += (message + "\n")
+ return
+
+ message = replacetext(message, "\n", " ")
+ message = replacetext(message, "\t", " ")
+
+ // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
+ target << output(url_encode(url_encode(message)), "browseroutput:output")
+
+/proc/grab_client(target)
+ if(istype(target, /client))
+ return target
+ else if(istype(target, /mob))
+ var/mob/M = target
+ if(M.client)
+ return M.client
+ else if(istype(target, /datum/mind))
+ var/datum/mind/M = target
+ if(M.current && M.current.client)
+ return M.current.client
+
+/datum/log //exists purely to capture to_chat() output
+ var/log = ""
\ No newline at end of file
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
new file mode 100644
index 0000000000..8532e3f6cf
--- /dev/null
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -0,0 +1,376 @@
+/*****************************************
+*
+* GLOBAL STYLES
+*
+******************************************/
+html, body {
+ padding: 0;
+ margin: 0;
+ height: 100%;
+ color: #000000;
+}
+body {
+ background: #fff;
+ font-family: Verdana, sans-serif;
+ font-size: 9pt;
+ line-height: 1.4;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ word-wrap: break-word;
+}
+
+em {
+ font-style: normal;
+ font-weight: bold;
+}
+
+img {
+ margin: 0;
+ padding: 0;
+ line-height: 1;
+}
+img.icon {
+ width: 16px;
+ height: 16px;
+}
+
+a {color: #0000ff;}
+a.visited {color: #ff00ff;}
+a:visited {color: #ff00ff;}
+a.popt {text-decoration: none;}
+
+/*****************************************
+*
+* OUTPUT NOT RELATED TO ACTUAL MESSAGES
+*
+******************************************/
+#loading {
+ position: fixed;
+ width: 300px;
+ height: 150px;
+ text-align: center;
+ left: 50%;
+ top: 50%;
+ margin: -75px 0 0 -150px;
+}
+#loading i {display: block; padding-bottom: 3px;}
+
+#messages {
+ font-size: 13px;
+ padding: 3px;
+ margin: 0;
+ word-wrap: break-word;
+}
+#newMessages {
+ position: fixed;
+ display: block;
+ bottom: 0;
+ right: 0;
+ padding: 8px;
+ background: #ddd;
+ text-decoration: none;
+ font-variant: small-caps;
+ font-size: 1.1em;
+ font-weight: bold;
+ color: #333;
+}
+#newMessages:hover {background: #ccc;}
+#newMessages i {vertical-align: middle; padding-left: 3px;}
+#ping {
+ position: fixed;
+ top: 0;
+ right: 40px;
+ width: 45px;
+ background: #ddd;
+ height: 30px;
+ padding: 8px 0 2px 0;
+}
+#ping i {display: block; text-align: center;}
+#ping .ms {
+ display: block;
+ text-align: center;
+ font-size: 8pt;
+ padding-top: 2px;
+}
+#options {
+ position: fixed;
+ top: 0;
+ right: 0;
+}
+#options a {
+ background: #ddd;
+ height: 30px;
+ padding: 5px 0;
+ display: block;
+ color: #333;
+ text-decoration: none;
+ line-height: 28px;
+ border-top: 1px solid #b4b4b4;
+}
+#options a:hover {background: #ccc;}
+#options .toggle {
+ width: 40px;
+ background: #ccc;
+ border-top: 0;
+ float: right;
+ text-align: center;
+}
+#options .sub {clear: both; display: none; width: 160px;}
+#options .sub.scroll {overflow-y: scroll;}
+#options .sub a {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
+#options .sub span {
+ display: block;
+ line-height: 30px;
+ float: left;
+}
+#options .sub i {
+ display: block;
+ padding: 0 5px;
+ font-size: 1.1em;
+ width: 22px;
+ text-align: center;
+ line-height: 30px;
+ float: right;
+}
+#options .decreaseFont {border-top: 0;}
+
+/* POPUPS */
+.popup {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ background: #ddd;
+}
+.popup .close {
+ position: absolute;
+ background: #aaa;
+ top: 0;
+ right: 0;
+ color: #333;
+ text-decoration: none;
+ z-index: 2;
+ padding: 0 10px;
+ height: 30px;
+ line-height: 30px;
+}
+.popup .close:hover {background: #999;}
+.popup .head {
+ background: #999;
+ color: #ddd;
+ padding: 0 10px;
+ height: 30px;
+ line-height: 30px;
+ text-transform: uppercase;
+ font-size: 0.9em;
+ font-weight: bold;
+ border-bottom: 2px solid green;
+}
+.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;}
+.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;}
+.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
+.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;}
+
+.changeFont {padding: 10px;}
+.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;}
+.changeFont a:hover {background: #ccc;}
+
+.highlightPopup {padding: 10px; text-align: center;}
+.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;}
+.highlightPopup input.highlightColor {background-color: #FFFF00;}
+.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
+
+/* ADMIN CONTEXT MENU */
+.contextMenu {
+ background-color: #ddd;
+ position: fixed;
+ margin: 2px;
+ width: 150px;
+}
+.contextMenu a {
+ display: block;
+ padding: 2px 5px;
+ text-decoration: none;
+ color: #333;
+}
+
+.contextMenu a:hover {
+ background-color: #ccc;
+}
+
+/* ADMIN FILTER MESSAGES MENU */
+.filterMessages {padding: 5px;}
+.filterMessages div {padding: 2px 0;}
+.filterMessages input {}
+.filterMessages label {}
+
+.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
+
+
+/*****************************************
+*
+* OUTPUT ACTUALLY RELATED TO MESSAGES
+*
+******************************************/
+
+/* MOTD */
+.motd {color: #638500; font-family: Verdana, sans-serif;}
+.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;}
+.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;}
+
+/* ADD HERE FOR BOLD */
+.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
+
+/* ADD HERE FOR ITALIC */
+.italic, .italics, .emote {font-style: italic;}
+
+/* OUTPUT COLORS */
+.highlight {background: yellow;}
+
+h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;}
+h1.alert, h2.alert {color: #000000;}
+
+em {font-style: normal; font-weight: bold;}
+
+.ooc { font-weight: bold;}
+.adminobserverooc {color: #0099cc; font-weight: bold;}
+.adminooc {color: #700038; font-weight: bold;}
+
+.adminobserver {color: #996600; font-weight: bold;}
+.admin {color: #386aff; font-weight: bold;}
+
+.name { font-weight: bold;}
+
+.say {}
+.deadsay {color: #5c00e6;}
+.radio {color: #008000;}
+.sciradio {color: #993399;}
+.comradio {color: #948f02;}
+.secradio {color: #a30000;}
+.medradio {color: #337296;}
+.engradio {color: #fb5613;}
+.suppradio {color: #a8732b;}
+.servradio {color: #6eaa2c;}
+.syndradio {color: #6d3f40;}
+.centcomradio {color: #686868;}
+.aiprivradio {color: #ff00ff;}
+.redteamradio {color: #ff0000;}
+.blueteamradio {color: #0000ff;}
+
+.yell { font-weight: bold;}
+
+.alert {color: #ff0000;}
+h1.alert, h2.alert {color: #000000;}
+
+.emote { font-style: italic;}
+.selecteddna {color: #ffffff; background-color: #001B1B}
+
+.attack {color: #ff0000;}
+.disarm {color: #990000;}
+.passive {color: #660000;}
+
+.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
+.danger {color: #ff0000;}
+.warning {color: #ff0000; font-style: italic;}
+.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
+.announce {color: #228b22; font-weight: bold;}
+.boldannounce {color: #ff0000; font-weight: bold;}
+.greenannounce {color: #00ff00; font-weight: bold;}
+.rose {color: #ff5050;}
+.info {color: #0000CC;}
+.notice {color: #000099;}
+.boldnotice {color: #000099; font-weight: bold;}
+.adminnotice {color: #0000ff;}
+.adminhelp {color: #ff0000; font-weight: bold;}
+.unconscious {color: #0000ff; font-weight: bold;}
+.suicide {color: #ff5050; font-style: italic;}
+.green {color: #03ff39;}
+.shadowling {color: #3b2769;}
+.cult {color: #960000;}
+.cultitalic {color: #960000; font-style: italic;}
+.cultlarge {color: #960000; font-weight: bold; font-size: 24px;}
+.narsie {color: #960000; font-weight: bold; font-size: 120px;}
+.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;}
+.colossus {color: #7F282A; font-size: 40px;}
+.hierophant {color: #660099; font-weight: bold; font-style: italic;}
+.hierophant_warning {color: #660099; font-style: italic;}
+.purple {color: #5e2d79;}
+.holoparasite {color: #35333a;}
+.holoparasitebold {color: #35333a; font-weight: bold;}
+
+.revennotice {color: #1d2953;}
+.revenboldnotice {color: #1d2953; font-weight: bold;}
+.revenbignotice {color: #1d2953; font-weight: bold; font-size: 24px;}
+.revenminor {color: #823abb}
+.revenwarning {color: #760fbb; font-style: italic;}
+.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;}
+.umbra {color: #5000A0;}
+.umbra_bold {color: #5000A0; font-weight: bold;}
+.umbra_italics {color: #5000A0; font-style: italic;}
+.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;}
+.umbra_large {color: #5000A0; font-size: 24px;}
+
+.brass {color: #BE8700;}
+.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
+.large_brass {color: #BE8700; font-size: 24px;}
+.big_brass {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic;}
+.ratvar {color: #BE8700; font-size: 48px; font-weight: bold; font-style: italic;}
+.alloy {color: #42474D;}
+.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;}
+.large_alloy {color: #42474D; font-size: 24px;}
+.nezbere_large {color: #42474D; font-size: 24px; font-weight: bold; font-style: italic;}
+.nezbere {color: #42474D; font-weight: bold; font-style: italic;}
+.nezbere_small {color: #42474D;}
+.sevtug_large {color: #AF0AAF; font-size: 24px; font-weight: bold; font-style: italic;}
+.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;}
+.sevtug_small {color: #AF0AAF;}
+.inathneq_large {color: #1E8CE1; font-size: 24px; font-weight: bold; font-style: italic;}
+.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;}
+.inathneq_small {color: #1E8CE1;}
+.nzcrentr_large {color: #DAAA18; font-size: 24px; font-weight: bold; font-style: italic;}
+.nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;}
+.nzcrentr_small {color: #DAAA18;}
+.neovgre_large {color: #6E001A; font-size: 24px; font-weight: bold; font-style: italic;}
+.neovgre {color: #6E001A; font-weight: bold; font-style: italic;}
+.neovgre_small {color: #6E001A;}
+
+.newscaster {color: #800000;}
+.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
+
+.alien {color: #543354;}
+.noticealien {color: #00c000;}
+.alertalien {color: #00c000; font-weight: bold;}
+.borer {color: #543354; font-style: italic;}
+.changeling {color: #800080; font-style: italic;}
+
+.interface {color: #330033;}
+
+.sans {font-family: "Comic Sans MS", cursive, sans-serif;}
+.papyrus {font-family: "Papyrus", cursive, sans-serif;}
+.robot {font-family: "Courier New", cursive, sans-serif;}
+
+.command_headset {font-weight: bold; font-size: 24px;}
+.big {font-size: 3;}
+.reallybig {font-size: 4;}
+.greentext {color: #00FF00; font-size: 3;}
+.redtext {color: #FF0000; font-size: 3;}
+.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
+.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
+
+BIG IMG.icon {width: 32px; height: 32px;}
+
+.memo {color: #638500; text-align: center;}
+.memoedit {text-align: center; font-size: 2;}
+.abductor {color: #800080; font-style: italic;}
+.slime {color: #00CED1;}
+.drone {color: #848482;}
+.monkey {color: #975032;}
+.swarmer {color: #2C75FF;}
+.resonate {color: #298F85;}
+
+.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
+.connectionClosed.restored {background: green;}
+.internal.boldnshit {color: blue; font-weight: bold;}
+
+/* HELPER CLASSES */
+.text-normal {font-weight: normal; font-style: normal;}
+.hidden {display: none; visibility: hidden;}
\ No newline at end of file
diff --git a/code/modules/goonchat/browserassets/css/font-awesome.css b/code/modules/goonchat/browserassets/css/font-awesome.css
new file mode 100644
index 0000000000..cc99d7b337
--- /dev/null
+++ b/code/modules/goonchat/browserassets/css/font-awesome.css
@@ -0,0 +1,788 @@
+@font-face{font-family:'FontAwesome';src:url('fontawesome-webfont.eot');src:url('fontawesome-webfont.eot') format('embedded-opentype'),url('fontawesome-webfont.woff') format('woff'),url('fontawesome-webfont.ttf') format('truetype'),url('fontawesome-webfont.svg') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;}
+[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;}
+.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;}
+a [class^="icon-"],a [class*=" icon-"]{display:inline;}
+[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;}
+.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;}
+.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;}
+[class^="icon-"].hide,[class*=" icon-"].hide{display:none;}
+.icon-muted{color:#eeeeee;}
+.icon-light{color:#ffffff;}
+.icon-dark{color:#333333;}
+.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;}
+[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;}
+[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;}
+.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;}
+.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;}
+.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;}
+.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;}
+.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;}
+.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;}
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;}
+.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;}
+.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;}
+.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;}
+.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;}
+a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;}
+@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);}
+.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);}
+.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);}
+.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);}
+.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);}
+a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;}
+.icon-glass:before{content:"\f000";}
+.icon-music:before{content:"\f001";}
+.icon-search:before{content:"\f002";}
+.icon-envelope-alt:before{content:"\f003";}
+.icon-heart:before{content:"\f004";}
+.icon-star:before{content:"\f005";}
+.icon-star-empty:before{content:"\f006";}
+.icon-user:before{content:"\f007";}
+.icon-film:before{content:"\f008";}
+.icon-th-large:before{content:"\f009";}
+.icon-th:before{content:"\f00a";}
+.icon-th-list:before{content:"\f00b";}
+.icon-ok:before{content:"\f00c";}
+.icon-remove:before{content:"\f00d";}
+.icon-zoom-in:before{content:"\f00e";}
+.icon-zoom-out:before{content:"\f010";}
+.icon-power-off:before,.icon-off:before{content:"\f011";}
+.icon-signal:before{content:"\f012";}
+.icon-gear:before,.icon-cog:before{content:"\f013";}
+.icon-trash:before{content:"\f014";}
+.icon-home:before{content:"\f015";}
+.icon-file-alt:before{content:"\f016";}
+.icon-time:before{content:"\f017";}
+.icon-road:before{content:"\f018";}
+.icon-download-alt:before{content:"\f019";}
+.icon-download:before{content:"\f01a";}
+.icon-upload:before{content:"\f01b";}
+.icon-inbox:before{content:"\f01c";}
+.icon-play-circle:before{content:"\f01d";}
+.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";}
+.icon-refresh:before{content:"\f021";}
+.icon-list-alt:before{content:"\f022";}
+.icon-lock:before{content:"\f023";}
+.icon-flag:before{content:"\f024";}
+.icon-headphones:before{content:"\f025";}
+.icon-volume-off:before{content:"\f026";}
+.icon-volume-down:before{content:"\f027";}
+.icon-volume-up:before{content:"\f028";}
+.icon-qrcode:before{content:"\f029";}
+.icon-barcode:before{content:"\f02a";}
+.icon-tag:before{content:"\f02b";}
+.icon-tags:before{content:"\f02c";}
+.icon-book:before{content:"\f02d";}
+.icon-bookmark:before{content:"\f02e";}
+.icon-print:before{content:"\f02f";}
+.icon-camera:before{content:"\f030";}
+.icon-font:before{content:"\f031";}
+.icon-bold:before{content:"\f032";}
+.icon-italic:before{content:"\f033";}
+.icon-text-height:before{content:"\f034";}
+.icon-text-width:before{content:"\f035";}
+.icon-align-left:before{content:"\f036";}
+.icon-align-center:before{content:"\f037";}
+.icon-align-right:before{content:"\f038";}
+.icon-align-justify:before{content:"\f039";}
+.icon-list:before{content:"\f03a";}
+.icon-indent-left:before{content:"\f03b";}
+.icon-indent-right:before{content:"\f03c";}
+.icon-facetime-video:before{content:"\f03d";}
+.icon-picture:before{content:"\f03e";}
+.icon-pencil:before{content:"\f040";}
+.icon-map-marker:before{content:"\f041";}
+.icon-adjust:before{content:"\f042";}
+.icon-tint:before{content:"\f043";}
+.icon-edit:before{content:"\f044";}
+.icon-share:before{content:"\f045";}
+.icon-check:before{content:"\f046";}
+.icon-move:before{content:"\f047";}
+.icon-step-backward:before{content:"\f048";}
+.icon-fast-backward:before{content:"\f049";}
+.icon-backward:before{content:"\f04a";}
+.icon-play:before{content:"\f04b";}
+.icon-pause:before{content:"\f04c";}
+.icon-stop:before{content:"\f04d";}
+.icon-forward:before{content:"\f04e";}
+.icon-fast-forward:before{content:"\f050";}
+.icon-step-forward:before{content:"\f051";}
+.icon-eject:before{content:"\f052";}
+.icon-chevron-left:before{content:"\f053";}
+.icon-chevron-right:before{content:"\f054";}
+.icon-plus-sign:before{content:"\f055";}
+.icon-minus-sign:before{content:"\f056";}
+.icon-remove-sign:before{content:"\f057";}
+.icon-ok-sign:before{content:"\f058";}
+.icon-question-sign:before{content:"\f059";}
+.icon-info-sign:before{content:"\f05a";}
+.icon-screenshot:before{content:"\f05b";}
+.icon-remove-circle:before{content:"\f05c";}
+.icon-ok-circle:before{content:"\f05d";}
+.icon-ban-circle:before{content:"\f05e";}
+.icon-arrow-left:before{content:"\f060";}
+.icon-arrow-right:before{content:"\f061";}
+.icon-arrow-up:before{content:"\f062";}
+.icon-arrow-down:before{content:"\f063";}
+.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";}
+.icon-resize-full:before{content:"\f065";}
+.icon-resize-small:before{content:"\f066";}
+.icon-plus:before{content:"\f067";}
+.icon-minus:before{content:"\f068";}
+.icon-asterisk:before{content:"\f069";}
+.icon-exclamation-sign:before{content:"\f06a";}
+.icon-gift:before{content:"\f06b";}
+.icon-leaf:before{content:"\f06c";}
+.icon-fire:before{content:"\f06d";}
+.icon-eye-open:before{content:"\f06e";}
+.icon-eye-close:before{content:"\f070";}
+.icon-warning-sign:before{content:"\f071";}
+.icon-plane:before{content:"\f072";}
+.icon-calendar:before{content:"\f073";}
+.icon-random:before{content:"\f074";}
+.icon-comment:before{content:"\f075";}
+.icon-magnet:before{content:"\f076";}
+.icon-chevron-up:before{content:"\f077";}
+.icon-chevron-down:before{content:"\f078";}
+.icon-retweet:before{content:"\f079";}
+.icon-shopping-cart:before{content:"\f07a";}
+.icon-folder-close:before{content:"\f07b";}
+.icon-folder-open:before{content:"\f07c";}
+.icon-resize-vertical:before{content:"\f07d";}
+.icon-resize-horizontal:before{content:"\f07e";}
+.icon-bar-chart:before{content:"\f080";}
+.icon-twitter-sign:before{content:"\f081";}
+.icon-facebook-sign:before{content:"\f082";}
+.icon-camera-retro:before{content:"\f083";}
+.icon-key:before{content:"\f084";}
+.icon-gears:before,.icon-cogs:before{content:"\f085";}
+.icon-comments:before{content:"\f086";}
+.icon-thumbs-up-alt:before{content:"\f087";}
+.icon-thumbs-down-alt:before{content:"\f088";}
+.icon-star-half:before{content:"\f089";}
+.icon-heart-empty:before{content:"\f08a";}
+.icon-signout:before{content:"\f08b";}
+.icon-linkedin-sign:before{content:"\f08c";}
+.icon-pushpin:before{content:"\f08d";}
+.icon-external-link:before{content:"\f08e";}
+.icon-signin:before{content:"\f090";}
+.icon-trophy:before{content:"\f091";}
+.icon-github-sign:before{content:"\f092";}
+.icon-upload-alt:before{content:"\f093";}
+.icon-lemon:before{content:"\f094";}
+.icon-phone:before{content:"\f095";}
+.icon-unchecked:before,.icon-check-empty:before{content:"\f096";}
+.icon-bookmark-empty:before{content:"\f097";}
+.icon-phone-sign:before{content:"\f098";}
+.icon-twitter:before{content:"\f099";}
+.icon-facebook:before{content:"\f09a";}
+.icon-github:before{content:"\f09b";}
+.icon-unlock:before{content:"\f09c";}
+.icon-credit-card:before{content:"\f09d";}
+.icon-rss:before{content:"\f09e";}
+.icon-hdd:before{content:"\f0a0";}
+.icon-bullhorn:before{content:"\f0a1";}
+.icon-bell:before{content:"\f0a2";}
+.icon-certificate:before{content:"\f0a3";}
+.icon-hand-right:before{content:"\f0a4";}
+.icon-hand-left:before{content:"\f0a5";}
+.icon-hand-up:before{content:"\f0a6";}
+.icon-hand-down:before{content:"\f0a7";}
+.icon-circle-arrow-left:before{content:"\f0a8";}
+.icon-circle-arrow-right:before{content:"\f0a9";}
+.icon-circle-arrow-up:before{content:"\f0aa";}
+.icon-circle-arrow-down:before{content:"\f0ab";}
+.icon-globe:before{content:"\f0ac";}
+.icon-wrench:before{content:"\f0ad";}
+.icon-tasks:before{content:"\f0ae";}
+.icon-filter:before{content:"\f0b0";}
+.icon-briefcase:before{content:"\f0b1";}
+.icon-fullscreen:before{content:"\f0b2";}
+.icon-group:before{content:"\f0c0";}
+.icon-link:before{content:"\f0c1";}
+.icon-cloud:before{content:"\f0c2";}
+.icon-beaker:before{content:"\f0c3";}
+.icon-cut:before{content:"\f0c4";}
+.icon-copy:before{content:"\f0c5";}
+.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";}
+.icon-save:before{content:"\f0c7";}
+.icon-sign-blank:before{content:"\f0c8";}
+.icon-reorder:before{content:"\f0c9";}
+.icon-list-ul:before{content:"\f0ca";}
+.icon-list-ol:before{content:"\f0cb";}
+.icon-strikethrough:before{content:"\f0cc";}
+.icon-underline:before{content:"\f0cd";}
+.icon-table:before{content:"\f0ce";}
+.icon-magic:before{content:"\f0d0";}
+.icon-truck:before{content:"\f0d1";}
+.icon-pinterest:before{content:"\f0d2";}
+.icon-pinterest-sign:before{content:"\f0d3";}
+.icon-google-plus-sign:before{content:"\f0d4";}
+.icon-google-plus:before{content:"\f0d5";}
+.icon-money:before{content:"\f0d6";}
+.icon-caret-down:before{content:"\f0d7";}
+.icon-caret-up:before{content:"\f0d8";}
+.icon-caret-left:before{content:"\f0d9";}
+.icon-caret-right:before{content:"\f0da";}
+.icon-columns:before{content:"\f0db";}
+.icon-sort:before{content:"\f0dc";}
+.icon-sort-down:before{content:"\f0dd";}
+.icon-sort-up:before{content:"\f0de";}
+.icon-envelope:before{content:"\f0e0";}
+.icon-linkedin:before{content:"\f0e1";}
+.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";}
+.icon-legal:before{content:"\f0e3";}
+.icon-dashboard:before{content:"\f0e4";}
+.icon-comment-alt:before{content:"\f0e5";}
+.icon-comments-alt:before{content:"\f0e6";}
+.icon-bolt:before{content:"\f0e7";}
+.icon-sitemap:before{content:"\f0e8";}
+.icon-umbrella:before{content:"\f0e9";}
+.icon-paste:before{content:"\f0ea";}
+.icon-lightbulb:before{content:"\f0eb";}
+.icon-exchange:before{content:"\f0ec";}
+.icon-cloud-download:before{content:"\f0ed";}
+.icon-cloud-upload:before{content:"\f0ee";}
+.icon-user-md:before{content:"\f0f0";}
+.icon-stethoscope:before{content:"\f0f1";}
+.icon-suitcase:before{content:"\f0f2";}
+.icon-bell-alt:before{content:"\f0f3";}
+.icon-coffee:before{content:"\f0f4";}
+.icon-food:before{content:"\f0f5";}
+.icon-file-text-alt:before{content:"\f0f6";}
+.icon-building:before{content:"\f0f7";}
+.icon-hospital:before{content:"\f0f8";}
+.icon-ambulance:before{content:"\f0f9";}
+.icon-medkit:before{content:"\f0fa";}
+.icon-fighter-jet:before{content:"\f0fb";}
+.icon-beer:before{content:"\f0fc";}
+.icon-h-sign:before{content:"\f0fd";}
+.icon-plus-sign-alt:before{content:"\f0fe";}
+.icon-double-angle-left:before{content:"\f100";}
+.icon-double-angle-right:before{content:"\f101";}
+.icon-double-angle-up:before{content:"\f102";}
+.icon-double-angle-down:before{content:"\f103";}
+.icon-angle-left:before{content:"\f104";}
+.icon-angle-right:before{content:"\f105";}
+.icon-angle-up:before{content:"\f106";}
+.icon-angle-down:before{content:"\f107";}
+.icon-desktop:before{content:"\f108";}
+.icon-laptop:before{content:"\f109";}
+.icon-tablet:before{content:"\f10a";}
+.icon-mobile-phone:before{content:"\f10b";}
+.icon-circle-blank:before{content:"\f10c";}
+.icon-quote-left:before{content:"\f10d";}
+.icon-quote-right:before{content:"\f10e";}
+.icon-spinner:before{content:"\f110";}
+.icon-circle:before{content:"\f111";}
+.icon-mail-reply:before,.icon-reply:before{content:"\f112";}
+.icon-github-alt:before{content:"\f113";}
+.icon-folder-close-alt:before{content:"\f114";}
+.icon-folder-open-alt:before{content:"\f115";}
+.icon-expand-alt:before{content:"\f116";}
+.icon-collapse-alt:before{content:"\f117";}
+.icon-smile:before{content:"\f118";}
+.icon-frown:before{content:"\f119";}
+.icon-meh:before{content:"\f11a";}
+.icon-gamepad:before{content:"\f11b";}
+.icon-keyboard:before{content:"\f11c";}
+.icon-flag-alt:before{content:"\f11d";}
+.icon-flag-checkered:before{content:"\f11e";}
+.icon-terminal:before{content:"\f120";}
+.icon-code:before{content:"\f121";}
+.icon-reply-all:before{content:"\f122";}
+.icon-mail-reply-all:before{content:"\f122";}
+.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";}
+.icon-location-arrow:before{content:"\f124";}
+.icon-crop:before{content:"\f125";}
+.icon-code-fork:before{content:"\f126";}
+.icon-unlink:before{content:"\f127";}
+.icon-question:before{content:"\f128";}
+.icon-info:before{content:"\f129";}
+.icon-exclamation:before{content:"\f12a";}
+.icon-superscript:before{content:"\f12b";}
+.icon-subscript:before{content:"\f12c";}
+.icon-eraser:before{content:"\f12d";}
+.icon-puzzle-piece:before{content:"\f12e";}
+.icon-microphone:before{content:"\f130";}
+.icon-microphone-off:before{content:"\f131";}
+.icon-shield:before{content:"\f132";}
+.icon-calendar-empty:before{content:"\f133";}
+.icon-fire-extinguisher:before{content:"\f134";}
+.icon-rocket:before{content:"\f135";}
+.icon-maxcdn:before{content:"\f136";}
+.icon-chevron-sign-left:before{content:"\f137";}
+.icon-chevron-sign-right:before{content:"\f138";}
+.icon-chevron-sign-up:before{content:"\f139";}
+.icon-chevron-sign-down:before{content:"\f13a";}
+.icon-html5:before{content:"\f13b";}
+.icon-css3:before{content:"\f13c";}
+.icon-anchor:before{content:"\f13d";}
+.icon-unlock-alt:before{content:"\f13e";}
+.icon-bullseye:before{content:"\f140";}
+.icon-ellipsis-horizontal:before{content:"\f141";}
+.icon-ellipsis-vertical:before{content:"\f142";}
+.icon-rss-sign:before{content:"\f143";}
+.icon-play-sign:before{content:"\f144";}
+.icon-ticket:before{content:"\f145";}
+.icon-minus-sign-alt:before{content:"\f146";}
+.icon-check-minus:before{content:"\f147";}
+.icon-level-up:before{content:"\f148";}
+.icon-level-down:before{content:"\f149";}
+.icon-check-sign:before{content:"\f14a";}
+.icon-edit-sign:before{content:"\f14b";}
+.icon-external-link-sign:before{content:"\f14c";}
+.icon-share-sign:before{content:"\f14d";}
+.icon-compass:before{content:"\f14e";}
+.icon-collapse:before{content:"\f150";}
+.icon-collapse-top:before{content:"\f151";}
+.icon-expand:before{content:"\f152";}
+.icon-euro:before,.icon-eur:before{content:"\f153";}
+.icon-gbp:before{content:"\f154";}
+.icon-dollar:before,.icon-usd:before{content:"\f155";}
+.icon-rupee:before,.icon-inr:before{content:"\f156";}
+.icon-yen:before,.icon-jpy:before{content:"\f157";}
+.icon-renminbi:before,.icon-cny:before{content:"\f158";}
+.icon-won:before,.icon-krw:before{content:"\f159";}
+.icon-bitcoin:before,.icon-btc:before{content:"\f15a";}
+.icon-file:before{content:"\f15b";}
+.icon-file-text:before{content:"\f15c";}
+.icon-sort-by-alphabet:before{content:"\f15d";}
+.icon-sort-by-alphabet-alt:before{content:"\f15e";}
+.icon-sort-by-attributes:before{content:"\f160";}
+.icon-sort-by-attributes-alt:before{content:"\f161";}
+.icon-sort-by-order:before{content:"\f162";}
+.icon-sort-by-order-alt:before{content:"\f163";}
+.icon-thumbs-up:before{content:"\f164";}
+.icon-thumbs-down:before{content:"\f165";}
+.icon-youtube-sign:before{content:"\f166";}
+.icon-youtube:before{content:"\f167";}
+.icon-xing:before{content:"\f168";}
+.icon-xing-sign:before{content:"\f169";}
+.icon-youtube-play:before{content:"\f16a";}
+.icon-dropbox:before{content:"\f16b";}
+.icon-stackexchange:before{content:"\f16c";}
+.icon-instagram:before{content:"\f16d";}
+.icon-flickr:before{content:"\f16e";}
+.icon-adn:before{content:"\f170";}
+.icon-bitbucket:before{content:"\f171";}
+.icon-bitbucket-sign:before{content:"\f172";}
+.icon-tumblr:before{content:"\f173";}
+.icon-tumblr-sign:before{content:"\f174";}
+.icon-long-arrow-down:before{content:"\f175";}
+.icon-long-arrow-up:before{content:"\f176";}
+.icon-long-arrow-left:before{content:"\f177";}
+.icon-long-arrow-right:before{content:"\f178";}
+.icon-apple:before{content:"\f179";}
+.icon-windows:before{content:"\f17a";}
+.icon-android:before{content:"\f17b";}
+.icon-linux:before{content:"\f17c";}
+.icon-dribbble:before{content:"\f17d";}
+.icon-skype:before{content:"\f17e";}
+.icon-foursquare:before{content:"\f180";}
+.icon-trello:before{content:"\f181";}
+.icon-female:before{content:"\f182";}
+.icon-male:before{content:"\f183";}
+.icon-gittip:before{content:"\f184";}
+.icon-sun:before{content:"\f185";}
+.icon-moon:before{content:"\f186";}
+.icon-archive:before{content:"\f187";}
+.icon-bug:before{content:"\f188";}
+.icon-vk:before{content:"\f189";}
+.icon-weibo:before{content:"\f18a";}
+.icon-renren:before{content:"\f18b";}
+
+.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;}
+.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;}
+.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;}
+.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;}
+.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;}
+a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;}
+.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
\ No newline at end of file
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js
new file mode 100644
index 0000000000..cfe453010c
--- /dev/null
+++ b/code/modules/goonchat/browserassets/js/browserOutput.js
@@ -0,0 +1,877 @@
+
+/*****************************************
+*
+* FUNCTION AND VAR DECLARATIONS
+*
+******************************************/
+
+//DEBUG STUFF
+var triggerError = attachErrorHandler('chatDebug', true);
+var escaper = encodeURIComponent || escape;
+var decoder = decodeURIComponent || unescape;
+window.onerror = function(msg, url, line, col, error) {
+ if (document.location.href.indexOf("proc=debug") <= 0) {
+ var extra = !col ? '' : ' | column: ' + col;
+ extra += !error ? '' : ' | error: ' + error;
+ extra += !navigator.userAgent ? '' : ' | user agent: ' + navigator.userAgent;
+ var debugLine = 'Error: ' + msg + ' | url: ' + url + ' | line: ' + line + extra;
+ window.location = '?_src_=chat&proc=debug¶m[error]='+escaper(debugLine);
+ }
+ return true;
+};
+
+//Globals
+window.status = 'Output';
+var $messages, $subOptions, $contextMenu, $filterMessages;
+var opts = {
+ //General
+ 'messageCount': 0, //A count...of messages...
+ 'messageLimit': 2053, //A limit...for the messages...
+ 'scrollSnapTolerance': 5, //If within x pixels of bottom
+ 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup
+ 'popups': 0, //Amount of popups opened ever
+ 'wasd': false, //Is the user in wasd mode?
+ 'chatMode': 'default', //The mode the chat is in
+ 'priorChatHeight': 0, //Thing for height-resizing detection
+ 'restarting': false, //Is the round restarting?
+
+ //Options menu
+ 'subOptionsLoop': null, //Contains the interval loop for closing the options menu
+ 'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu
+ 'highlightTerms': [],
+ 'highlightLimit': 5,
+ 'highlightColor': '#FFFF00', //The color of the highlighted message
+ 'pingDisabled': false, //Has the user disabled the ping counter
+
+ //Ping display
+ 'lastPang': 0, //Timestamp of the last response from the server.
+ 'pangLimit': 35000,
+ 'pingTime': 0, //Timestamp of when ping sent
+ 'pongTime': 0, //Timestamp of when ping received
+ 'noResponse': false, //Tracks the state of the previous ping request
+ 'noResponseCount': 0, //How many failed pings?
+
+ //Clicks
+ 'mouseDownX': null,
+ 'mouseDownY': null,
+ 'preventFocus': false, //Prevents switching focus to the game window
+
+ //Client Connection Data
+ 'clientDataLimit': 5,
+ 'clientData': [],
+
+};
+
+function outerHTML(el) {
+ var wrap = document.createElement('div');
+ wrap.appendChild(el.cloneNode(true));
+ return wrap.innerHTML;
+}
+
+//Polyfill for fucking date now because of course IE8 and below don't support it
+if (!Date.now) {
+ Date.now = function now() {
+ return new Date().getTime();
+ };
+}
+//Polyfill for trim() (IE8 and below)
+if (typeof String.prototype.trim !== 'function') {
+ String.prototype.trim = function () {
+ return this.replace(/^\s+|\s+$/g, '');
+ };
+}
+
+//Shit fucking piece of crap that doesn't work god fuckin damn it
+function linkify(text) {
+ var rex = /((?:'+$0+' ';
+ }
+ else {
+ return $1 ? $0: ''+$0+' ';
+ }
+ });
+}
+
+//Actually turns the highlight term match into appropriate html
+function addHighlightMarkup(match) {
+ var extra = '';
+ if (opts.highlightColor) {
+ extra += ' style="background-color: '+opts.highlightColor+'"';
+ }
+ return ''+match+' ';
+}
+
+//Highlights words based on user settings
+function highlightTerms(el) {
+ if (el.children.length > 0) {
+ for(var h = 0; h < el.children.length; h++){
+ highlightTerms(el.children[h]);
+ }
+ }
+
+ var hasTextNode = false;
+ for (var node = 0; node < el.childNodes.length; node++)
+ {
+ if (el.childNodes[node].nodeType === 3)
+ {
+ hasTextNode = true;
+ break;
+ }
+ }
+
+ if (hasTextNode) { //If element actually has text
+ var newText = '';
+ for (var c = 0; c < el.childNodes.length; c++) { //Each child element
+ if (el.childNodes[c].nodeType === 3) { //Is it text only?
+ var words = el.childNodes[c].data.split(' ');
+ for (var w = 0; w < words.length; w++) { //Each word in the text
+ var newWord = null;
+ for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term
+ if (opts.highlightTerms[i] && words[w].toLowerCase().indexOf(opts.highlightTerms[i].toLowerCase()) > -1) { //If a match is found
+ newWord = words[w].replace("<", "<").replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup);
+ break;
+ }
+ console.log(newWord)
+ }
+ newText += newWord || words[w].replace("<", "<");
+ newText += w >= words.length ? '' : ' ';
+ }
+ } else { //Every other type of element
+ newText += outerHTML(el.childNodes[c]);
+ }
+ }
+ el.innerHTML = newText;
+ }
+}
+//Send a message to the client
+function output(message, flag) {
+ if (typeof message === 'undefined') {
+ return;
+ }
+ if (typeof flag === 'undefined') {
+ flag = '';
+ }
+
+ if (flag !== 'internal')
+ opts.lastPang = Date.now();
+
+ // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8.
+ // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b.
+ // Marvelous.
+ message = message.replace(/\+/g, "%20")
+ message = decoder(message)
+
+ //The behemoth of filter-code (for Admin message filters)
+ //Note: This is proooobably hella inefficient
+ var filteredOut = false;
+ if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) {
+ //Get this filter type (defined by class on message)
+ var messageHtml = $.parseHTML(message),
+ messageClasses;
+ if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) {
+ var internal = false;
+ messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false);
+ if (messageClasses) {
+ for (var i = 0; i < messageClasses.length; i++) { //Every class
+ if (messageClasses[i] == 'internal') {
+ internal = true;
+ break;
+ }
+ }
+ }
+ if (!internal) {
+ filteredOut = 'All';
+ }
+ } else {
+ //If the element or it's child have any classes
+ if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) {
+ messageClasses = $(messageHtml).attr('class').split(/\s+/);
+ if (!!$(messageHtml).children().attr('class')) {
+ messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/));
+ }
+ var tempCount = 0;
+ for (var i = 0; i < messageClasses.length; i++) { //Every class
+ var thisClass = messageClasses[i];
+ $.each(opts.showMessagesFilters, function(key, val) { //Every filter
+ if (key !== 'All' && val.show === false && typeof val.match != 'undefined') {
+ for (var i = 0; i < val.match.length; i++) {
+ var matchClass = val.match[i];
+ if (matchClass == thisClass) {
+ filteredOut = key;
+ break;
+ }
+ }
+ }
+ if (filteredOut) return false;
+ });
+ if (filteredOut) break;
+ tempCount++;
+ }
+ } else {
+ if (!opts.showMessagesFilters['Misc'].show) {
+ filteredOut = 'Misc';
+ }
+ }
+ }
+ }
+
+ //Stuff we do along with appending a message
+ var atBottom = false;
+ if (!filteredOut) {
+ var bodyHeight = $('body').height();
+ var messagesHeight = $messages.outerHeight();
+ var scrollPos = $('body,html').scrollTop();
+
+ //Should we snap the output to the bottom?
+ if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) {
+ atBottom = true;
+ if ($('#newMessages').length) {
+ $('#newMessages').remove();
+ }
+ //If not, put the new messages box in
+ } else {
+ if ($('#newMessages').length) {
+ var messages = $('#newMessages .number').text();
+ messages = parseInt(messages);
+ messages++;
+ $('#newMessages .number').text(messages);
+ if (messages == 2) {
+ $('#newMessages .messageWord').append('s');
+ }
+ } else {
+ $messages.after('1 new message ');
+ }
+ }
+ }
+
+ //Url stuff
+ if (message.length && flag != 'preventLink') {
+ message = linkify(message);
+ }
+
+ opts.messageCount++;
+
+ //Pop the top message off if history limit reached
+ if (opts.messageCount >= opts.messageLimit) {
+ $messages.children('div.entry:first-child').remove();
+ opts.messageCount--; //I guess the count should only ever equal the limit
+ }
+
+ //Actually append the message
+ var entry = document.createElement('div');
+ entry.className = 'entry';
+
+ if (filteredOut) {
+ entry.className += ' hidden';
+ entry.setAttribute('data-filter', filteredOut);
+ }
+
+ entry.innerHTML = message.trim();
+ $messages[0].appendChild(entry);
+
+ //Actually do the snap
+ if (!filteredOut && atBottom) {
+ $('body,html').scrollTop($messages.outerHeight());
+ }
+
+ //Stuff we can do after the message shows can go here, in the interests of responsiveness
+ if (opts.highlightTerms && opts.highlightTerms.length > 0) {
+ highlightTerms(entry);
+ }
+}
+
+function internalOutput(message, flag)
+{
+ output(escaper(message), flag)
+}
+
+//Runs a route within byond, client or server side. Consider this "ehjax" for byond.
+function runByond(uri) {
+ window.location = uri;
+}
+
+function setCookie(cname, cvalue, exdays) {
+ cvalue = escaper(cvalue);
+ var d = new Date();
+ d.setTime(d.getTime() + (exdays*24*60*60*1000));
+ var expires = 'expires='+d.toUTCString();
+ document.cookie = cname + '=' + cvalue + '; ' + expires;
+}
+
+function getCookie(cname) {
+ var name = cname + '=';
+ var ca = document.cookie.split(';');
+ for(var i=0; i < ca.length; i++) {
+ var c = ca[i];
+ while (c.charAt(0)==' ') c = c.substring(1);
+ if (c.indexOf(name) === 0) {
+ return decoder(c.substring(name.length,c.length));
+ }
+ }
+ return '';
+}
+
+function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B);}
+function toHex(n) {
+ n = parseInt(n,10);
+ if (isNaN(n)) return "00";
+ n = Math.max(0,Math.min(n,255));
+ return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
+}
+
+function changeMode(mode) {
+ switch (mode) {
+ case 'geocities':
+ //switch in stylesheet
+ opts.chatMode = mode;
+ break;
+ case 'console':
+
+ opts.chatMode = mode;
+ break;
+ case 'default':
+ default:
+ //remove loaded stylesheet/s
+ opts.chatMode = 'default';
+ }
+}
+
+function handleClientData(ckey, ip, compid) {
+ //byond sends player info to here
+ var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid};
+ if (opts.clientData && !$.isEmptyObject(opts.clientData)) {
+ runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]='+JSON.stringify({'connData': opts.clientData}));
+
+ for (var i = 0; i < opts.clientData.length; i++) {
+ var saved = opts.clientData[i];
+ if (currentData.ckey == saved.ckey && currentData.ip == saved.ip && currentData.compid == saved.compid) {
+ return; //Record already exists
+ }
+ }
+
+ if (opts.clientData.length >= opts.clientDataLimit) {
+ opts.clientData.shift();
+ }
+ } else {
+ runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]=none');
+ }
+
+ //Update the cookie with current details
+ opts.clientData.push(currentData);
+ setCookie('connData', JSON.stringify(opts.clientData), 365);
+}
+
+//Server calls this on ehjax response
+//Or, y'know, whenever really
+function ehjaxCallback(data) {
+ opts.lastPang = Date.now();
+ if (data == 'softPang') {
+ return;
+ } else if (data == 'pang') {
+ opts.pingCounter = 0; //reset
+ opts.pingTime = Date.now();
+ runByond('?_src_=chat&proc=ping');
+
+ } else if (data == 'pong') {
+ if (opts.pingDisabled) {return;}
+ opts.pongTime = Date.now();
+ var pingDuration = Math.ceil((opts.pongTime - opts.pingTime) / 2);
+ $('#pingMs').text(pingDuration+'ms');
+ pingDuration = Math.min(pingDuration, 255);
+ var red = pingDuration;
+ var green = 255 - pingDuration;
+ var blue = 0;
+ var hex = rgbToHex(red, green, blue);
+ $('#pingDot').css('color', '#'+hex);
+
+ } else if (data == 'roundrestart') {
+ opts.restarting = true;
+ internalOutput('The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal');
+ } else if (data == 'stopaudio') {
+ $('.dectalk').remove();
+ } else {
+ //Oh we're actually being sent data instead of an instruction
+ var dataJ;
+ try {
+ dataJ = $.parseJSON(data);
+ } catch (e) {
+ //But...incorrect :sadtrombone:
+ window.onerror('JSON: '+e+'. '+data, 'browserOutput.html', 327);
+ return;
+ }
+ data = dataJ;
+
+ if (data.clientData) {
+ if (opts.restarting) {
+ opts.restarting = false;
+ $('.connectionClosed.restarting:not(.restored)').addClass('restored').text('The round restarted and you successfully reconnected!');
+ }
+ if (!data.clientData.ckey && !data.clientData.ip && !data.clientData.compid) {
+ //TODO: Call shutdown perhaps
+ return;
+ } else {
+ handleClientData(data.clientData.ckey, data.clientData.ip, data.clientData.compid);
+ }
+ } else if (data.modeChange) {
+ changeMode(data.modeChange);
+ } else if (data.firebug) {
+ if (data.trigger) {
+ internalOutput('Loading firebug console, triggered by '+data.trigger+'... ', 'internal');
+ } else {
+ internalOutput('Loading firebug console... ', 'internal');
+ }
+ var firebugEl = document.createElement('script');
+ firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js';
+ document.body.appendChild(firebugEl);
+ } else if (data.dectalk) {
+ var message = ' ';
+ if (data.decTalkTrigger) {
+ message = ' '+
+ 'You hear a strange robotic voice... ' + message;
+ }
+ internalOutput(message, 'preventLink');
+ }
+ }
+}
+
+function createPopup(contents, width) {
+ opts.popups++;
+ $('body').append('');
+
+ //Attach close popup event
+ var $popup = $('#popup'+opts.popups);
+ var height = $popup.outerHeight();
+ $popup.css({'height': height+'px', 'margin': '-'+(height/2)+'px 0 0 -'+(width/2)+'px'});
+
+ $popup.on('click', '.close', function(e) {
+ e.preventDefault();
+ $popup.remove();
+ });
+}
+
+function toggleWasd(state) {
+ opts.wasd = (state == 'on' ? true : false);
+}
+
+/*****************************************
+*
+* DOM READY
+*
+******************************************/
+
+if (typeof $ === 'undefined') {
+ var div = document.getElementById('loading').childNodes[1];
+ div += ' ERROR: Jquery did not load.';
+}
+
+$(function() {
+ $messages = $('#messages');
+ $subOptions = $('#subOptions');
+
+ //Hey look it's a controller loop!
+ setInterval(function() {
+ if (opts.lastPang + opts.pangLimit < Date.now() && !opts.restarting) { //Every pingLimit
+ if (!opts.noResponse) { //Only actually append a message if the previous ping didn't also fail (to prevent spam)
+ opts.noResponse = true;
+ opts.noResponseCount++;
+ internalOutput('You are either AFK, experiencing lag or the connection has closed.
', 'internal');
+ }
+ } else if (opts.noResponse) { //Previous ping attempt failed ohno
+ $('.connectionClosed[data-count="'+opts.noResponseCount+'"]:not(.restored)').addClass('restored').text('Your connection has been restored (probably)!');
+ opts.noResponse = false;
+ }
+ }, 2000); //2 seconds
+
+
+ /*****************************************
+ *
+ * LOAD SAVED CONFIG
+ *
+ ******************************************/
+ var savedConfig = {
+ 'sfontSize': getCookie('fontsize'),
+ 'spingDisabled': getCookie('pingdisabled'),
+ 'shighlightTerms': getCookie('highlightterms'),
+ 'shighlightColor': getCookie('highlightcolor'),
+ };
+
+ if (savedConfig.sfontSize) {
+ $messages.css('font-size', savedConfig.sfontSize);
+ internalOutput('Loaded font size setting of: '+savedConfig.sfontSize+' ', 'internal');
+ }
+ if (savedConfig.spingDisabled) {
+ if (savedConfig.spingDisabled == 'true') {
+ opts.pingDisabled = true;
+ $('#ping').hide();
+ }
+ internalOutput('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+' ', 'internal');
+ }
+ if (savedConfig.shighlightTerms) {
+ var savedTerms = $.parseJSON(savedConfig.shighlightTerms);
+ var actualTerms = '';
+ for (var i = 0; i < savedTerms.length; i++) {
+ if (savedTerms[i]) {
+ actualTerms += savedTerms[i] + ', ';
+ }
+ }
+ if (actualTerms) {
+ actualTerms = actualTerms.substring(0, actualTerms.length - 2);
+ internalOutput('Loaded highlight strings of: ' + actualTerms+' ', 'internal');
+ opts.highlightTerms = savedTerms;
+ }
+ }
+ if (savedConfig.shighlightColor) {
+ opts.highlightColor = savedConfig.shighlightColor;
+ internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+' ', 'internal');
+ }
+
+ (function() {
+ var dataCookie = getCookie('connData');
+ if (dataCookie) {
+ var dataJ;
+ try {
+ dataJ = $.parseJSON(dataCookie);
+ } catch (e) {
+ window.onerror('JSON '+e+'. '+dataCookie, 'browserOutput.html', 434);
+ return;
+ }
+ opts.clientData = dataJ;
+ }
+ })();
+
+
+ /*****************************************
+ *
+ * BASE CHAT OUTPUT EVENTS
+ *
+ ******************************************/
+
+ $('body').on('click', 'a', function(e) {
+ e.preventDefault();
+ });
+
+ $('body').on('mousedown', function(e) {
+ var $target = $(e.target);
+
+ if ($contextMenu && opts.hasOwnProperty('contextMenuTarget') && opts.contextMenuTarget) {
+ hideContextMenu();
+ return false;
+ }
+
+ if ($target.is('a') || $target.parent('a').length || $target.is('input') || $target.is('textarea')) {
+ opts.preventFocus = true;
+ } else {
+ opts.preventFocus = false;
+ opts.mouseDownX = e.pageX;
+ opts.mouseDownY = e.pageY;
+ }
+ });
+
+ $messages.on('mousedown', function(e) {
+ if ($subOptions && $subOptions.is(':visible')) {
+ $subOptions.slideUp('fast', function() {
+ $(this).removeClass('scroll');
+ $(this).css('height', '');
+ });
+ clearInterval(opts.subOptionsLoop);
+ }
+ });
+
+ $('body').on('mouseup', function(e) {
+ if (!opts.preventFocus &&
+ (e.pageX >= opts.mouseDownX - opts.clickTolerance && e.pageX <= opts.mouseDownX + opts.clickTolerance) &&
+ (e.pageY >= opts.mouseDownY - opts.clickTolerance && e.pageY <= opts.mouseDownY + opts.clickTolerance)
+ ) {
+ opts.mouseDownX = null;
+ opts.mouseDownY = null;
+ runByond('byond://winset?mapwindow.map.focus=true');
+ }
+ });
+
+ $messages.on('click', 'a', function(e) {
+ var href = $(this).attr('href');
+ $(this).addClass('visited');
+ if (href[0] == '?' || (href.length >= 8 && href.substring(0,8) == 'byond://')) {
+ runByond(href);
+ } else {
+ href = escaper(href);
+ runByond('?action=openLink&link='+href);
+ }
+ });
+
+ //Fuck everything about this event. Will look into alternatives.
+ $('body').on('keydown', function(e) {
+ if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') {
+ return;
+ }
+
+ if (e.ctrlKey || e.altKey || e.shiftKey) { //Band-aid "fix" for allowing ctrl+c copy paste etc. Needs a proper fix.
+ return;
+ }
+
+ e.preventDefault()
+
+ var k = e.which;
+ var command; // Command to execute through winset.
+
+ // Hardcoded because else there would be no feedback message.
+ if (k == 113) { // F2
+ runByond('byond://winset?screenshot=auto');
+ internalOutput('Screenshot taken', 'internal');
+ }
+
+ var c = "";
+ switch (k) {
+ case 8:
+ c = 'BACK';
+ case 9:
+ c = 'TAB';
+ case 13:
+ c = 'ENTER';
+ case 19:
+ c = 'PAUSE';
+ case 27:
+ c = 'ESCAPE';
+ case 33: // Page up
+ c = 'NORTHEAST';
+ case 34: // Page down
+ c = 'SOUTHEAST';
+ case 35: // End
+ c = 'SOUTHWEST';
+ case 36: // Home
+ c = 'NORTHWEST';
+ case 37:
+ c = 'WEST';
+ case 38:
+ c = 'NORTH';
+ case 39:
+ c = 'EAST';
+ case 40:
+ c = 'SOUTH';
+ case 45:
+ c = 'INSERT';
+ case 46:
+ c = 'DELETE';
+ case 93: // That weird thing to the right of alt gr.
+ c = 'APPS';
+
+ default:
+ c = String.fromCharCode(k);
+ }
+
+// if(opts.macros.hasOwnProperty(c.toUpperCase()))
+ // command = opts.macros[c];
+
+ if (command) {
+ runByond('byond://winset?mapwindow.map.focus=true;command='+command);
+ return false;
+ }
+ else if (c.length == 0) {
+ if (!e.shiftKey) {
+ c = c.toLowerCase();
+ }
+ runByond('byond://winset?mapwindow.map.focus=true;mainwindow.input.text='+c);
+ return false;
+ } else {
+ runByond('byond://winset?mapwindow.map.focus=true');
+ return false;
+ }
+ });
+
+ //Mildly hacky fix for scroll issues on mob change (interface gets resized sometimes, messing up snap-scroll)
+ $(window).on('resize', function(e) {
+ if ($(this).height() !== opts.priorChatHeight) {
+ $('body,html').scrollTop($messages.outerHeight());
+ opts.priorChatHeight = $(this).height();
+ }
+ });
+
+ //Audio sound prevention
+ $messages.on('click', '.stopAudio', function() {
+ var $audio = $(this).parent().children('audio');
+ if ($audio) {
+ $audio.remove();
+ }
+ });
+
+
+ /*****************************************
+ *
+ * OPTIONS INTERFACE EVENTS
+ *
+ ******************************************/
+
+ $('body').on('click', '#newMessages', function(e) {
+ var messagesHeight = $messages.outerHeight();
+ $('body,html').scrollTop(messagesHeight);
+ $('#newMessages').remove();
+ runByond('byond://winset?mapwindow.map.focus=true');
+ });
+
+ $('#toggleOptions').click(function(e) {
+ if ($subOptions.is(':visible')) {
+ $subOptions.slideUp('fast', function() {
+ $(this).removeClass('scroll');
+ $(this).css('height', '');
+ });
+ clearInterval(opts.subOptionsLoop);
+ } else {
+ $subOptions.slideDown('fast', function() {
+ var windowHeight = $(window).height();
+ var toggleHeight = $('#toggleOptions').outerHeight();
+ var priorSubHeight = $subOptions.outerHeight();
+ var newSubHeight = windowHeight - toggleHeight;
+ $(this).height(newSubHeight);
+ if (priorSubHeight > (windowHeight - toggleHeight)) {
+ $(this).addClass('scroll');
+ }
+ });
+ opts.subOptionsLoop = setInterval(function() {
+ if (!opts.suppressOptionsClose && $('#subOptions').is(':visible')) {
+ $subOptions.slideUp('fast', function() {
+ $(this).removeClass('scroll');
+ $(this).css('height', '');
+ });
+ clearInterval(opts.subOptionsLoop);
+ }
+ }, 5000); //Every 5 seconds
+ }
+ });
+
+ $('#subOptions, #toggleOptions').mouseenter(function() {
+ opts.suppressOptionsClose = true;
+ });
+
+ $('#subOptions, #toggleOptions').mouseleave(function() {
+ opts.suppressOptionsClose = false;
+ });
+
+ $('#decreaseFont').click(function(e) {
+ var fontSize = parseInt($messages.css('font-size'));
+ fontSize = fontSize - 1 + 'px';
+ $messages.css({'font-size': fontSize});
+ setCookie('fontsize', fontSize, 365);
+ internalOutput('Font size set to '+fontSize+' ', 'internal');
+ });
+
+ $('#increaseFont').click(function(e) {
+ var fontSize = parseInt($messages.css('font-size'));
+ fontSize = fontSize + 1 + 'px';
+ $messages.css({'font-size': fontSize});
+ setCookie('fontsize', fontSize, 365);
+ internalOutput('Font size set to '+fontSize+' ', 'internal');
+ });
+
+ $('#togglePing').click(function(e) {
+ if (opts.pingDisabled) {
+ $('#ping').slideDown('fast');
+ opts.pingDisabled = false;
+ } else {
+ $('#ping').slideUp('fast');
+ opts.pingDisabled = true;
+ }
+ setCookie('pingdisabled', (opts.pingDisabled ? 'true' : 'false'), 365);
+ });
+
+ $('#saveLog').click(function(e) {
+ $.ajax({
+ type: 'GET',
+ url: 'browserOutput.css',
+ success: function(styleData) {
+ var win;
+
+ try {
+ win = window.open('', 'Chat Log', 'toolbar=no, location=no, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=yes, width=780, height=600, top=' + (screen.height/2 - 635/2) + ', left=' + (screen.width/2 - 780/2));
+ } catch (e) {
+ return;
+ }
+
+ if (win) {
+ win.document.head.innerHTML = 'Chat Log ';
+ win.document.head.innerHTML += '';
+ win.document.body.innerHTML = $messages.html();
+ }
+ }
+ });
+ });
+
+ $('#highlightTerm').click(function(e) {
+ if ($('.popup .highlightTerm').is(':visible')) {return;}
+ var termInputs = '';
+ for (var i = 0; i < opts.highlightLimit; i++) {
+ termInputs += '
';
+ }
+ var popupContent = 'String Highlighting
' +
+ '';
+ createPopup(popupContent, 250);
+ });
+
+ $('body').on('keyup', '#highlightColor', function() {
+ var color = $('#highlightColor').val();
+ color = color.trim();
+ if (!color || color.charAt(0) != '#') return;
+ $('#highlightColor').css('background-color', color);
+ });
+
+ $('body').on('submit', '#highlightTermForm', function(e) {
+ e.preventDefault();
+
+ var count = 0;
+ while (count < opts.highlightLimit) {
+ var term = $('#highlightTermInput'+count).val();
+ if (term) {
+ term = term.trim();
+ if (term === '') {
+ opts.highlightTerms[count] = null;
+ } else {
+ opts.highlightTerms[count] = term.toLowerCase();
+ }
+ } else {
+ opts.highlightTerms[count] = null;
+ }
+ count++;
+ }
+
+ var color = $('#highlightColor').val();
+ color = color.trim();
+ if (color == '' || color.charAt(0) != '#') {
+ opts.highlightColor = '#FFFF00';
+ } else {
+ opts.highlightColor = color;
+ }
+ var $popup = $('#highlightPopup').closest('.popup');
+ $popup.remove();
+
+ setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365);
+ setCookie('highlightcolor', opts.highlightColor, 365);
+ });
+
+ $('#clearMessages').click(function() {
+ $messages.empty();
+ opts.messageCount = 0;
+ });
+
+
+ /*****************************************
+ *
+ * KICK EVERYTHING OFF
+ *
+ ******************************************/
+
+ runByond('?_src_=chat&proc=doneLoading');
+ if ($('#loading').is(':visible')) {
+ $('#loading').remove();
+ }
+ $('#userBar').show();
+ opts.priorChatHeight = $(window).height();
+});
\ No newline at end of file
diff --git a/code/modules/goonchat/browserassets/js/json2.min.js b/code/modules/goonchat/browserassets/js/json2.min.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 18fa2e8c60..38e15db5a0 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -40,13 +40,13 @@
if(spec_return)
return spec_return
- if(mind)
- if(mind.martial_art && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
- if(prob(mind.martial_art.deflection_chance))
- if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
- visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons! ", "You deflect the projectile! ")
- playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
- return 0
+ if(mind)
+ if(mind.martial_art && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
+ if(prob(mind.martial_art.deflection_chance))
+ if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
+ visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons! ", "You deflect the projectile! ")
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
+ return 0
if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
@@ -104,11 +104,11 @@
return 0
/mob/living/carbon/human/proc/check_block()
- if(mind)
- if(mind.martial_art && mind.martial_art.block_chance \
- && prob(mind.martial_art.block_chance) && in_throw_mode \
- && !stat && !weakened && !stunned)
- return TRUE
+ if(mind)
+ if(mind.martial_art && mind.martial_art.block_chance \
+ && prob(mind.martial_art.block_chance) && in_throw_mode \
+ && !stat && !weakened && !stunned)
+ return TRUE
return FALSE
/mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
@@ -136,7 +136,7 @@
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.loc = src
L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
- visible_message("[I] embeds itself in [src]'s [L.name]! ","[I] embeds itself in your [L.name]! ")
+ visible_message("[I] embeds itself in [src]'s [L.name]! ","[I] embeds itself in your [L.name]! ")
hitpush = 0
skipcatch = 1 //can't catch the now embedded item
@@ -160,8 +160,8 @@
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(user.zone_selected)) //what we're actually ending up trying to hit.
var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target
- SSblackbox.add_details("item_used_for_combat","[I.type]|[I.force]")
- SSblackbox.add_details("zone_targeted","[target_area]")
+ SSblackbox.add_details("item_used_for_combat","[I.type]|[I.force]")
+ SSblackbox.add_details("zone_targeted","[target_area]")
// the attacked_by code varies among species
return dna.species.spec_attacked_by(I, user, affecting, a_intent, src)
@@ -439,7 +439,7 @@
else if(S.siemens_coefficient == (-1))
total_coeff -= 1
siemens_coeff = total_coeff
- if(HAS_SECONDARY_FLAG(src, TESLA_IGNORE))
+ if(HAS_SECONDARY_FLAG(src, TESLA_IGNORE))
siemens_coeff = 0
else if(!safety)
var/gloves_siemens_coeff = 1
@@ -622,7 +622,7 @@
gain = 100
if(mind.assigned_role == "Clown")
gain = rand(-300, 300)
- investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up!
+ investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up!
gib()
return(gain)
@@ -665,10 +665,10 @@
status += "numb"
if(status == "")
status = "OK"
- to_chat(src, "\t [status == "OK" ? "\blue" : "\red"] Your [LB.name] is [status].")
+ to_chat(src, "\t Your [LB.name] is [status]. ")
for(var/obj/item/I in LB.embedded_objects)
- to_chat(src, "\t There is \a [I] embedded in your [LB.name]! ")
+ to_chat(src, "\t There is \a [I] embedded in your [LB.name]! ")
for(var/t in missing)
to_chat(src, "Your [parse_zone(t)] is missing! ")
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index db72e94a86..b19e866378 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/ai/examine(mob/user)
- var/msg = "*---------*\nThis is \icon[src] [src] !\n"
+ var/msg = "*---------*\nThis is [bicon(src)] [src] !\n"
if (stat == DEAD)
msg += "It appears to be powered-down. \n"
else
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 63b01483ef..bd7ba03dc5 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -1370,7 +1370,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
continue
crate_value -= I.cost
new I.item(C)
- U.purchase_log += "\icon[I.item] "
+ U.purchase_log += "[bicon(I.item)] "
SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]")
return C
diff --git a/tgstation.dme b/tgstation.dme
index 06fc7182cc..4aa6207ec5 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1496,8 +1496,8 @@
#include "code\modules\mining\equipment\lazarus_injector.dm"
#include "code\modules\mining\equipment\marker_beacons.dm"
#include "code\modules\mining\equipment\mineral_scanner.dm"
-#include "code\modules\mining\equipment\regenerative_core.dm"
#include "code\modules\mining\equipment\mining_tools.dm"
+#include "code\modules\mining\equipment\regenerative_core.dm"
#include "code\modules\mining\equipment\resonator.dm"
#include "code\modules\mining\equipment\survival_pod.dm"
#include "code\modules\mining\equipment\vendor_items.dm"