diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 1008480b6f3..5f0de7272de 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1202,7 +1202,7 @@ proc/oview_or_orange(distance = world.view , center = usr , type) proc/get_mob_with_client_list() var/list/mobs = list() - for(var/mob/M in world) + for(var/mob/M in mob_list) if (M.client) mobs += M return mobs diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a895a0dd3c1..c4a2bfeb6b4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -70,6 +70,7 @@ datum/preferences var/language = "None" //Secondary language //Mob preview + var/icon/preview_icon = null var/icon/preview_icon_front = null var/icon/preview_icon_side = null diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 113d0e8a56d..a4a14715a48 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,6 +1,3 @@ -#define GHOST_DARK_ALPHA 10 -#define GHOST_LIGHT_ALPHA 255 -#define GHOST_DARK_CUTOFF 1 /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -34,6 +31,7 @@ see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 verbs += /mob/dead/observer/proc/dead_tele + stat = DEAD var/turf/T @@ -75,11 +73,25 @@ if(!name) //To prevent nameless ghosts name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) real_name = name - - ghostMulti = new(src) - ..() + +/mob/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/tome)) + var/mob/dead/M = src + if(src.invisibility != 0) + M.invisibility = 0 + user.visible_message( \ + "\red [user] drags ghost, [M], to our plan of reality!", \ + "\red You drag [M] to our plan of reality!" \ + ) + else + user.visible_message ( \ + "\red [user] just tried to smash his book into that ghost! It's not very effective", \ + "\red You get the feeling that the ghost can't become any more visible." \ + ) + + /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 1 /* @@ -224,34 +236,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return -// In darkness over a certain threshold, ghosts become slightly visible for the spooky value. -/mob/dead/observer/proc/amInDarkPlace() - //var/turf/simulated/T = get_turf(src) - //if(!istype(T)) - // return 0 - //if(T.lighting_lumcount <= GHOST_DARK_CUTOFF) - // return 1 - return 0 - -/mob/dead/observer/proc/updateSpookyAlpha() - if(amInDarkPlace()) - alpha=GHOST_DARK_ALPHA - invisibility=0 - else - alpha=GHOST_LIGHT_ALPHA - invisibility=INVISIBILITY_OBSERVER - -///mob/dead/observer/SetLuminosity(new_luminosity, max_luminosity) -// ..() -// updateSpookyAlpha() - /mob/dead/observer/Move(NewLoc, direct) dir = direct if(NewLoc) loc = NewLoc for(var/obj/effect/step_trigger/S in NewLoc) S.HasEntered(src) - updateSpookyAlpha() // Added SetLuminosity above, probably not worth it. + return loc = get_turf(src) //Get out of closets and such as a ghost if((direct & NORTH) && y < world.maxy) @@ -265,7 +256,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp for(var/obj/effect/step_trigger/S in locate(x, y, z)) //<-- this is dumb S.HasEntered(src) - updateSpookyAlpha() /mob/dead/observer/examine() if(usr) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 51957fec1ea..c0f1786bb84 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -722,6 +722,8 @@ var/list/slot_equipment_priority = list( \ set category = "IC" set src = usr + if(istype(loc,/obj/mecha)) return + if(hand) var/obj/item/W = l_hand if (W) @@ -826,6 +828,10 @@ var/list/slot_equipment_priority = list( \ return else var/deathtime = world.time - src.timeofdeath + var/mob/dead/observer/G = src + if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + usr << "\blue Upon using the antagHUD you forfeighted the ability to join the round." + return var/deathtimeminutes = round(deathtime / 600) var/pluralcheck = "minute" if(deathtimeminutes == 0) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index dade29ca189..498f9c0f8e5 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -125,13 +125,21 @@ var/obj/O = locate("landmark*Observer-Start") src << "\blue Now teleporting." observer.loc = O.loc + observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. + + client.prefs.update_preview_icon() + observer.icon = client.prefs.preview_icon + observer.alpha = 127 + if(client.prefs.be_random_name) client.prefs.real_name = random_name(client.prefs.gender) observer.real_name = client.prefs.real_name observer.name = observer.real_name + if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + observer.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! observer.key = key - del(src) + return 1 if(href_list["late_join"]) @@ -364,10 +372,10 @@ Round Duration: [round(hours)]h [round(mins)]m
"} var/datum/language/chosen_language if(client.prefs.language) - chosen_language = all_languages[client.prefs.language] + chosen_language = all_languages["[client.prefs.language]"] if(chosen_language) if(is_alien_whitelisted(src, client.prefs.language) || !config.usealienwhitelist || !(chosen_language.flags & WHITELISTED)) - new_character.add_language(client.prefs.language) + new_character.add_language("client.prefs.language") if(ticker.random_players || appearance_isbanned(src)) //disabling ident bans for now new_character.gender = pick(MALE, FEMALE) client.prefs.real_name = random_name(new_character.gender) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index e8c8eb4d873..4b06691f591 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -131,7 +131,7 @@ datum/preferences proc/update_preview_icon() //seriously. This is horrendous. del(preview_icon_front) del(preview_icon_side) - var/icon/preview_icon = null + del(preview_icon) var/g = "m" if(gender == FEMALE) g = "f" diff --git a/html/changelog.html b/html/changelog.html index 8f0256945f0..b335e65a0cf 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -79,6 +79,8 @@

N3X15 updated:

Imported from Baystation 12:

diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index d4ec1cfa433..37b220b5d9c 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -5175,12 +5175,12 @@ "bVA" = (/obj/machinery/atmospherics/pipe/manifold{_color = "yellow"; icon_state = "manifold-y"; level = 2},/obj/machinery/meter,/turf/simulated/floor,/area/atmos) "bVB" = (/obj/machinery/atmospherics/pipe/manifold{_color = "yellow"; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos) "bVC" = (/obj/machinery/atmospherics/pipe/simple{_color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos) -"bVD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/valve/digital{_color = "yellow"; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/atmos) +"bVD" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "mixing_vent"; name = "Mixing Tank Emergency Vent"; p_open = 0},/turf/simulated/floor/plating,/area/atmos) "bVE" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/pipe/simple{_color = "cyan"; icon_state = "intact-c"},/obj/machinery/atmospherics/pipe/simple{_color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/structure/grille,/turf/simulated/floor/plating,/area/atmos) "bVF" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{_color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{_color = "green"; icon_state = "intact-g"; level = 2},/turf/space,/area) "bVG" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; level = 1},/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos) "bVH" = (/obj/machinery/atmospherics/unary/vent_pump{canSpawnMice = 0; dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) -"bVI" = (/obj/machinery/camera{c_tag = "Atmospherics Waste Tank"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) +"bVI" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/valve/digital{_color = "yellow"; dir = 4; name = "Gas Mix Outlet Valve"},/obj/machinery/door_control{desc = "A remote control-switch for the engineering security doors."; id = "mixing_vent"; name = "EMERGENCY VENT"; pixel_x = 25; pixel_y = 0; req_access_txt = "10"},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/atmos) "bVJ" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bVK" = (/obj/machinery/door/airlock/external{req_access_txt = "13"; req_one_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bVL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/wall,/area/maintenance/asmaint) @@ -5252,7 +5252,7 @@ "bWZ" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/manifold{tag = "icon-manifold-g (EAST)"; icon_state = "manifold-g"; dir = 4; level = 2; _color = "green"},/turf/space,/area) "bXa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/atmos) "bXb" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) -"bXc" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) +"bXc" = (/obj/machinery/camera{c_tag = "Atmospherics Waste Tank"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bXd" = (/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXe" = (/turf/simulated/wall/r_wall,/area/medical/virology) "bXf" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virology) @@ -6191,7 +6191,7 @@ "cpc" = (/obj/structure/closet/secure_closet/engineering_chief{req_access_txt = "0"},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cpd" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cpe" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) -"cpf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) +"cpf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/folder/yellow,/obj/item/weapon/stamp/ce,/obj/item/weapon/pipe_dispenser,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cpg" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/pen,/obj/item/weapon/lighter/zippo,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cph" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/chiefs_office) "cpi" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor,/area/engine/break_room) @@ -10358,7 +10358,7 @@ "dRj" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/computer/rdconsole/mommi,/turf/simulated/floor{icon_state = "white"},/area/construction/mommi_nest) "dRk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/construction/mommi_nest) "dRl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "MoMMI Nest APC"; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 13; pixel_y = 25},/obj/structure/table,/obj/item/weapon/storage/bag/plasticbag,/obj/item/weapon/storage/bag/plasticbag,/obj/item/weapon/storage/bag/plasticbag,/obj/item/weapon/storage/bag/plasticbag,/turf/simulated/floor{icon_state = "white"},/area/construction/mommi_nest) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10515,9 +10515,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagbHRbRFbRGbRHbHRbKwbRIbHRbKwbRJbHRaaaaaaaaaaaabHTbRKbRLbRMbRNbHTbRObHTbRPbRQbRRbRSbRSbRTbRUbRVbRWbRXbRYbRZbRZbRZbSabSbbRZbRZbScbRYbSdbSebSfbSfbSgbRZbJDbJDbJDbJDbJDbJDbJDbJDbJDbIzbsZbShbSibSjbSkbSlbxLbSmbPIbSnbSobSpbSqbSrbsZbSsbStbSubSvbSwbSxbSybSzbSAbSBbSCbSDbSEboKbSFboKbRkbNhboKbSGbRmbRnbSHbSIbSJbSKbSLbSMbSNbSObIHbSPbIMbBQbKnbKnbKnbKnbKnaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaabGebLPbLPbLPbLPbLPbLPbSQbHzbLObLPbSRbHBbHBbHBbHBbGeaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHRbHRbHRbHRbHRbHRbHRbHRbKwbNIbSSbSTbSTbSTbSTbSTbSTbSTbSTbSTbSTbSUbSVbSWbSXbSYbSZbTabTbbTcbTcbTdbTebTfbTgbThbTibTjbTkbTlbTmbTnbTobTpbTqbTrbTsbTtbTuaagaaaaaaaaaaaaaaaaaabJDbTvbIzbsZbPFbrwbsZbrwbPFbTwbsZbrwbrwbrwbrwbrwbrwbsZbTxbIAbTybTzbTAbTBbTCbTDbTEbTFbTGbTHbTIbTJboKbTKbRkbNhbTLbTMbRmbRnbSHbTNbRqbTObRqbTPbTQbTRbIHbSPbIMbTSbTTbhLaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagbGebHBbHBbHBbHBbHBbHBbORbHzbSRbHBbHBbHBbHBbHBbGebGeaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHRbTUbTVbTWbTWbTXbTWbTWbTYbTZbUabSTbUbbUcbUdbUebUfbUgbUhbUibUjbUkbUlbUmbUnbUobUpbUqbUrbUsbUsbUtbUubTfbUvbThbTibUwbTkbUxbUybUzbUAbUBbUCbUDbUEbUFbUGbUHbUIbUIbUIbUIbUIaaabJDbUJbUKbQLbQMbQNbQLbULbUMbUNbUObULbQNbQNbQNbQNbQNbUPbUQbIAbURbUSbUTbUUbUVbUWbUXbIAbIAbrQbUYbrQbrQbrQbUZbNhbVabrQbIHbIHbIHbIHbIHbVbbIHbIHbIHbIHbIHbSPbIMbVcbTTbhLaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaabGebGebNAbHBbHBbHBbHBbHBbHzbHBbHBbHBbHBbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVdaaaaagaagbVebVebVebVebVebVebVebVebRJbVfbVfbVfbVfbVfbVgbVfbVfbSTbVhbVibVjbVjbVjbVjbVjbVjbVjbVkbSTbVlbVmbUobVnbVobTcbVpbTcbVqbVrbVsbVtbVubVvbVwbTkbVxbUybVybVzbVAbVBbVCbVCbVDbVEbVFbVGbVHbVIbVJbUIaaabJDbJDbVKbVLbVMbVNbPybVObVPbVQbVRbVObVObVSbVTbVObVObVUbIzbIAbIAbIAbIAbIAbIAbVVbOxbIAbVWbVXbVYbVZbWabrQbUYbWbbWcbrQbWdbWebWfbWgbWhbWibBQbBQbWjbBQbBQbSPbIMbWkbhLbhLbhLaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagbGdbGebWlbQfbQfbHBbHBbHBbHzbHBbHBbHBbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWmbWnbWobWpbWpbWpbWqbWrbWsbWtbWubWvbWwbVebWxbWybWzbWAbWBbWCbWDbWEbWFbSVbWGbVibVjbVjbWHbVjbVjbWIbWJbWKbSTbWLbVmbUobUpbWMbTcbTcbTcbWNbWObWPbWQbWRbVwbWSbWTbVwbWUbVybVzbWVbWWbWWbWWbWXbWYbWZbXabXbbVJbXcbUIaagbJDbTvbXdbJDaaaaagaaabXebXfbXgbXhbXeaagaagaaaaagbJDbXibXjbQNbQNbQNbQNbQNbQNbQLbXkbQNbXlbQNbQMbXmbQNbULbXnbXobXpbXqbXrbXrbXrbXrbXsbXtbXrbXrbXrbXrbXrbXubXvbXwbXxbXybhLbhLbhLbhLaaaaagaaaaaaaaabXzbXzbXzaagaaaaaaaagaaaaaaaagaaaaaabKobGebIObGebGebHBbHBbHBbHzbHBbHBbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXAbXAbXAbXAbXAbXBbXCbXDbXEbXEbXFbVebXGbVfbXHbXIbXIbXJbXIbXKbXLbSVbXMbVibVjbXNbXObXPbVjbXQbXRbXSbSTbXTbXUbXVbXWbXWbXXbXYbTcbXZbYabYbbYcbYdbYebYfbYgbYgbYhbYibYjbYkbVCbVCbYlbYmbYnbYobVGbYpbVJbVJbUIaagbJDbXdbXdbJDaaaaagaaabYqbYrbYsbYtbYqaagaagaaaaagbJDbYubYvbYwbYxbMzbYybYybYzbYAbYBbYCbYDbVObVSbVTbVObVObYEbYFbYGbYHbYHbYIbYJbYJbYKbYHbYHbYIbYJbYJbYKbYHbYLbBQbYMbYNbYObYPbYNbYQbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYSbYTbYTbYUbGebGebHBbHBbYVbHBbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVdaaaaagaagbVebVebVebVebVebVebVebVebRJbVfbVfbVfbVfbVfbVgbVfbVfbSTbVhbVibVjbVjbVjbVjbVjbVjbVjbVkbSTbVlbVmbUobVnbVobTcbVpbTcbVqbVrbVsbVtbVubVvbVwbTkbVxbUybVybVzbVAbVBbVCbVCbVIbVEbVFbVGbVHbXcbVJbVDaaabJDbJDbVKbVLbVMbVNbPybVObVPbVQbVRbVObVObVSbVTbVObVObVUbIzbIAbIAbIAbIAbIAbIAbVVbOxbIAbVWbVXbVYbVZbWabrQbUYbWbbWcbrQbWdbWebWfbWgbWhbWibBQbBQbWjbBQbBQbSPbIMbWkbhLbhLbhLaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagbGdbGebWlbQfbQfbHBbHBbHBbHzbHBbHBbHBbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWmbWnbWobWpbWpbWpbWqbWrbWsbWtbWubWvbWwbVebWxbWybWzbWAbWBbWCbWDbWEbWFbSVbWGbVibVjbVjbWHbVjbVjbWIbWJbWKbSTbWLbVmbUobUpbWMbTcbTcbTcbWNbWObWPbWQbWRbVwbWSbWTbVwbWUbVybVzbWVbWWbWWbWWbWXbWYbWZbXabXbbVJbVJbVDaagbJDbTvbXdbJDaaaaagaaabXebXfbXgbXhbXeaagaagaaaaagbJDbXibXjbQNbQNbQNbQNbQNbQNbQLbXkbQNbXlbQNbQMbXmbQNbULbXnbXobXpbXqbXrbXrbXrbXrbXsbXtbXrbXrbXrbXrbXrbXubXvbXwbXxbXybhLbhLbhLbhLaaaaagaaaaaaaaabXzbXzbXzaagaaaaaaaagaaaaaaaagaaaaaabKobGebIObGebGebHBbHBbHBbHzbHBbHBbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXAbXAbXAbXAbXAbXBbXCbXDbXEbXEbXFbVebXGbVfbXHbXIbXIbXJbXIbXKbXLbSVbXMbVibVjbXNbXObXPbVjbXQbXRbXSbSTbXTbXUbXVbXWbXWbXXbXYbTcbXZbYabYbbYcbYdbYebYfbYgbYgbYhbYibYjbYkbVCbVCbYlbYmbYnbYobVGbYpbVJbVJbVDaagbJDbXdbXdbJDaaaaagaaabYqbYrbYsbYtbYqaagaagaaaaagbJDbYubYvbYwbYxbMzbYybYybYzbYAbYBbYCbYDbVObVSbVTbVObVObYEbYFbYGbYHbYHbYIbYJbYJbYKbYHbYHbYIbYJbYJbYKbYHbYLbBQbYMbYNbYObYPbYNbYQbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYRbYSbYTbYTbYUbGebGebHBbHBbYVbHBbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaagaagbYWbYXbYYbYZbYYbZabZbbZcbZdbZdbZebVebXGbVfbZfbXIbXIbZgbXIbZhbZibSVbZjbVibVjbZkbZlbZmbVjbXQbZnbZobZpbWLbVmbUobZqbRSbZrbZsbZtbZubZvbTfbZwbZxbZybZzbTtbTtbZAbZBbZCbZCbZDbZDbZEbZDbZFbZGbUIbUIbUIbUIbUIaagbJDbJDbZHbJDaagaagaagbZIbZJbZKbZLbZIaagaaaaaaaagbJDbJDbJDbJDbJDbZMbJDbJDbZNbZObZPbJDbZQaaaaaaaaaaaabZRbZSbZTbZUbZRaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaabhLbZVbjDbZWbhLbhLbhLbhLaaaaagaaaaaaaaabXzbXzbXzaagaaaaaaaagaaaaaaaagaagaagbZXbZYbZZbIPbGdbGebGebHBbHCbHBbGebGeaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagbYWcaacabcaccadbXDcaebXDcafbXDcagcahcaibVfcajcakbXIbXJbXIcalcambSVcanbVibVjbVjbVjbVjbVjcaocapcaqcapcarcasbUocatbRSbTccaucavcawcaxbTfcaybYecazcaAbVwbVwcaBcaCbVCbVCcaDcaEcaFcaGcaHbVFbVGcaIcaJcaJbUIaagaagbXdbXdbXdaaaaagaaacaKcaLcaMcaNcaKaagaaaaaaaagaaaaaaaaabJDcaOcaPcaQbJDaaacaRaaaaaacaSaaaaaaaaaaaacaTcaUcaVcaWcaTaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaacaXcaXcaYcaZcaXaaaaaaaaaaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagcbabGbbGbbGcbGdbGdbGebGebGebGebGfaagaagaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagbYWcbbcbccbdcbccbecbfcbgcbhcbicbjbVebXGbVfcajcbkcblcbmcbncbocbpcbqcbrcbsbXObVjbXObVjbVjcbtcbucbvcapcbwbVmbUocbxcbycbzcbAbTtcbBcbCcbDbTtcbEcbFcbGbVwbVwcaBcbHcbIbWWcbJcbJcbKcbLbWYcbMbXacbNcbOcbPbUIaagaaaaaaaaaaaaaaaaaaaaacbQbXecbRcbScbQaagaagaagaagaagaagaaabJDcbTcbUbXdbJDaaacbVaaaaaacaSaaaaaaaaaaaacbWcbXcbYcbZcbWaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaacaXccaccbccccaXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaaaaaaaaaaaaaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa